Github Actionsで複数環境に並列でデプロイする
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