🚀

Github Actionsで複数環境に並列でデプロイする

2025/01/22に公開

Webフロントエンドエンジニアの hi_mochy です。
本記事では、デプロイジョブにGithub Actionsを使っている場合に、単一のワークフローで複数環境にデプロイする方法を紹介します。
私の場合はインフラにGoogleCloudを使っていますが、AWSなど他のPaaSを使っていても同じ仕組みが使えます。
今回扱う matrix strategy という機能は、デプロイ以外にも並列処理をしたい時に重宝しそうです。

課題感

以前いたチームでは環境ごとにデプロイジョブを作っていて、環境数分ジョブを書き換えなければなりませんでした。
これでは手間もありますし、ある環境だけ処理が古いままになる可能性もあります。

そのチームでは環境ごとにGCPのデプロイ先のバケット名などの違いはあれど、デプロイに求める要件が同一でデプロイジョブの差分も envelonment が異なるだけでした。

# .github/workflows/deploy.yaml
name: Deploy job
on:
  push:
    branches:
      - main
jobs:
  build:
    runs-on: ubuntu-latest
    # ここが異なるだけ
    environment: development
    steps:
        # 省略

要件が同一であるならコードも同一であるべき、ということで一つのワークフローで各環境にデプロイする方法を考えていきます。

解決方法

matrix storategy

GithubActionsのmatrix storategyという機能を使います。

これはワークフローを複数のパラメータで並列実行をする機能です。
例えば、以下のように使うと node-versionの数だけワークフローが並列実行されます。

strategy:
  matrix:
    os: [ubuntu-latest, macos-latest, windows-latest]
    node-version: [14, 16]

複数の変数を組み合わせることもできます。
このようにするとos×node-versionの系6回並行実行されます。

strategy:
  matrix:
    os: [ubuntu-latest, macos-latest, windows-latest]
    node-version: [14, 16]

matrix storategyを応用して複数環境にデプロイする

matrix storategyを使う前のジョブはこんな状態でした。

# .github/workflows/deploy.yaml
name: Deploy job
on:
  push:
    branches:
      - main
jobs:
  build:
    runs-on: ubuntu-latest
    # 環境を決め打ち
    environment: development
    steps:
      - name: Checkout branch
        uses: actions/checkout@v4
      - name: Setting Up
        run: npm ci # この辺は適当です
      - name: Authenticate to Google Cloud
        uses: google-github-actions/auth@v2
        with:
          # 環境変数を使って認証やデプロイを実行
          project_id: ${{ vars.GCP_PROJECT_NAME }}
          credentials_json: ${{ secrets.GCP_SA_KEY }}
      # 省略

environmentにmatrix storategyを使うことで、developmentとstagingにまとめてデプロイすることができます。

# .github/workflows/deploy.yaml
name: Deploy job
on:
  push:
    branches:
      - main
jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        # 環境をmatrixで定義
        environment: [ development, staging ]
    # matrixで設定した環境に並列でデプロイできる
    environment: ${{ matrix.environment }}
    steps:
      - name: Checkout branch
        uses: actions/checkout@v4
      - name: Setting Up
        run: npm ci # この辺は適当です
      - name: Authenticate to Google Cloud
        uses: google-github-actions/auth@v2
        with:
          # 環境変数を使って認証やデプロイを実行
          project_id: ${{ vars.GCP_PROJECT_NAME }}
          credentials_json: ${{ secrets.GCP_SA_KEY }}
      # 省略

実行結果を見ると、並列でdevelopmentとstagingにデプロイされているのがわかります。

ちなみに、トリガーに加えて手動実行を加えるとこのようになります。

# .github/workflows/deploy.yaml
name: Deploy job
on:
  workflow_dispatch:
    inputs:
      environment:
        type: environment
        required: true
        default: 'development'
  push:
    branches:
      - main
jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        # 環境をmatrixで定義
        environment: [ development, staging ]
    # matrixで設定した環境に並列でデプロイできる
    environment: ${{ github.event_name == 'push' && matrix.environment || github.event.inputs.environment }}
    steps:
      - name: Checkout branch
        uses: actions/checkout@v4
      - name: Setting Up
        run: npm ci # この辺は適当です
      - name: Authenticate to Google Cloud
        uses: google-github-actions/auth@v2
        with:
          # 環境変数を使って認証やデプロイを実行
          project_id: ${{ vars.GCP_PROJECT_NAME }}
          credentials_json: ${{ secrets.GCP_SA_KEY }}
      # 省略

感想

共通であるべき箇所を共通にできてすっきりしました。
ワークフローから別のワークフローを呼び出して共通化する方法もあるので、別途紹介できたらと思います。

以下の記事を参照にさせていただきました

Discussion