GitHubのreleaseイベントをトリガーにして、DockerイメージをArtifact Registryにプッシュする

記事タイトルとURLをコピーする

G-gen の武井です。当記事では GitHub の release イベントをトリガーにして、Docker イメージを Artifact Registry にプッシュする方法について解説します。

はじめに

概要

当記事では、GitHub の release イベントが発生すると、それをトリガーとして Docker イメージをビルドしたのち、Artifact Registry にプッシュするワークフローについて解説します。

ワークフロー

GitHub Actions で自動化したい処理とその内容・条件を定義したものを ワークフロー と言います。

ワークフローは YAML 形式 で記述して .github/workflows ディレクトリ に配置することで利用できます。

GitHub Actions

GitHub Actions とは、ソースコード管理ツールである GitHub に組み込まれた機能の一つで、リポジトリで管理されるソースコードをもとに CI/CD(継続的インティグレーション / 継続的デリバリー)を実現します。

ワークフロー

概要

今回作成するワークフローの概要(処理の流れ)は以下のようになります。

  1. リリースの検知

    • GitHub の release イベントが発生したときにワークフローをトリガーします。
  2. Docker イメージのビルド

    • ワークフロー内で Docker を使用してイメージを作成します。
  3. Google Artifact Registry にプッシュ

    • ビルドした Docker イメージを Artifact Registry にアップロードします。

release とは

GitHub のリリース機能は、ソフトウェアのリリース管理を行うための仕組みで、リリースタグを用いて特定のバージョンを管理できます。

本ワークフローでは、このリリースタグを活用し、新しいリリースが作成されるたび(release イベントの発生時)に Docker イメージをビルドし、同じリリースタグを付与したイメージとして Artifact Registry にプッシュします。

これにより、GitHub のリリース管理とコンテナのバージョニングを統合し、一貫性のある運用が可能になります。

構成

ワークフローと Google Cloud の関係性を表すと以下の通りです。

ソースコード

免責事項

当記事で紹介するプログラムのソースコードは、ご自身の責任のもと、使用、引用、改変、再配布して構いません。

ただし、同ソースコードが原因で発生した不利益やトラブルについては、当社は一切の責任を負いません。

ディレクトリ構成

.

├── .github
│   └── workflows
│       └── release.yaml
└── apps
    ├── demoapp1
    │   ├── Dockerfile
    │   ├── main.py
    │   └── requirements.txt
    └── demoapp2
        ├── Dockerfile
        ├── main.py
        └── requirements.txt

ワークフロー(release.yaml)

50行目の Workload Identity プールおよびプロバイダの作成方法は以下の記事をご参照ください。

blog.g-gen.co.jp

name: Build and Push images with release tag
  
# リリースイベント(published)をトリガーにワークフローを実行
on:
  release:
    types: [published]
  
jobs:
  # Google Cloud SDK のセットアップジョブ
  sdk:
    runs-on: ubuntu-latest
    steps:
      - name: 'Set up Cloud SDK'
        uses: 'google-github-actions/setup-gcloud@v2'
        with:
          version: '>= 363.0.0'
  
  # Dockerイメージのビルドおよび Artifact Registry へのプッシュジョブ
  build-and-push:
    runs-on: ubuntu-latest
    timeout-minutes: 300
    needs: [sdk]
    strategy:
      matrix:
        # 複数のアプリケーション(例: demoapp1, demoapp2)に対して並列実行
        appName:
          - demoapp1
          - demoapp2
  
    permissions:
      id-token: write
      contents: read
  
    env:
      REPO: 'release-event-demo-repository'
      GAR: 'asia-northeast1-docker.pkg.dev/yutakei'
  
    steps:
      # ステップ1: リポジトリのコードをチェックアウト
      - uses: actions/checkout@v4
        name: 'Checkout code'
        id: checkout-code
  
      # ステップ2: Google Cloud に認証(Workload Identity を利用)
      - uses: 'google-github-actions/auth@v2'
        name: 'Authenticate with Google Cloud'
        id: auth-gcloud
        with:
          project_id: yutakei
          workload_identity_provider: 'projects/933617552181/locations/global/workloadIdentityPools/gha-demo-pool/providers/gha-demo-provider'
  
      # ステップ3: アプリケーションディレクトリのパスを環境変数 APP_DIR に設定
      - name: 'Set up app dir name'
        id: set-app-dir
        run: echo "APP_DIR=apps/${{ matrix.appName }}" >> $GITHUB_ENV
  
      # ステップ4: Dockerイメージ名として利用する変数 IMAGE_NAME を設定
      - name: 'Set up app name variable'
        id: set-app-name
        run: echo "IMAGE_NAME=${{ matrix.appName }}" >> "$GITHUB_ENV"
  
      # ステップ5: Dockerイメージのビルド、タグ付け、Artifact Registry へのプッシュ
      - name: Build and Push image to Google Cloud Artifact Registry
        id: build-and-push-image
        run: |
          # Dockerクライアントで Artifact Registry へアクセスするための認証を設定
          gcloud auth configure-docker asia-northeast1-docker.pkg.dev --quiet
          
          # APP_DIR 内のDockerfileを使ってイメージをビルド(linux/amd64プラットフォーム指定)
          docker build --platform linux/amd64 -t "${REPO}/${IMAGE_NAME}" ${APP_DIR}
          
          # ビルドされたイメージに、GitHubリリースタグ(github.ref_name)を付与
          docker tag "${REPO}/${IMAGE_NAME}:latest" "${GAR}/${REPO}/${IMAGE_NAME}:${{github.ref_name}}"
          
          # タグ付けされたイメージをArtifact Registryにプッシュ
          docker push "${GAR}/${REPO}/${IMAGE_NAME}:${{github.ref_name}}"

デモ

リリース作成

ワークフローを起動するには、GitHub 上でリリースを作成します。

1. GitHub のリポジトリページにアクセスし、「Releases」タブをクリック 2. 「New release」ボタンをクリック 3. 「タグ」を作成(例: v1.0.0 4. 「タイトル」などを入力(任意)し、「Publish release」をクリックし

ワークフロー実行

リリース作成後、ワークフローが起動します。ワークフローは「Actions」タブから確認できます。

demoapp1 と demoapp2 に対し、リリースタグ(v1.0.0)付きの Docker イメージをビルドし、Artifact Registry にプッシュしています。

関連記事

blog.g-gen.co.jp

武井 祐介 (記事一覧)

クラウドソリューション部クラウドエンジニアリング課。

Google Cloud Partner Top Engineer 2025 選出。

趣味はロードレースやサッカー観戦、あとはゴルフと筋トレ。