CI/CDワークフローで、環境変数をGitHub SecretsやVariablesから設定する際、これまで環境ごとにENV_DEV
やENV_PROD
のような変数を使用して分岐処理を行っていたのですが、GitHubの「Environments」機能を使うことでシンプルにできたので共有します。
従来の方法: 環境ごとの分岐処理
以下のように、ブランチごとに異なる環境変数を設定するために条件分岐を使用していたのですが、この方法だと環境の増加に伴い条件分岐が複雑化し、メンテナンスが煩雑になる課題がありました。
build-and-push:
runs-on: ubuntu-latest
env:
REGION: ${{ vars.REGION }}
IAM_ROLE_TO_ASSUME: ${{ vars.IAM_ROLE_TO_ASSUME }}
steps:
- name: Set environment variables
run: |
if [[ "${{ github.ref }}" == "refs/heads/develop" ]]; then
echo "ENV=${{ vars.ENV_DEV }}" >> $GITHUB_ENV
elif [[ "${{ github.ref }}" == "refs/heads/staging" ]]; then
echo "ENV=${{ vars.ENV_STG }}" >> $GITHUB_ENV
else
echo "ENV=${{ vars.ENV_PROD }}" >> $GITHUB_ENV
fi
新しい方法: Environmentsの活用
GitHubの「Environments」機能を使用することで、条件分岐を排除し、ワークフローを簡潔に記述できます。
Environmentsの設定方法
-
Environmentの作成
GitHubリポジトリの「Settings」タブを開き、「Environments」を選択します。各環境(dev
,stg
,prod
など)を作成します。 -
変数の登録
- 秘密にすべき変数:
Environment secrets
に登録(AWS認証情報など) - 公開しても問題ない変数:
Environment variables
に登録(環境識別用のENV
など)
- 秘密にすべき変数:
Environmentsを活用したワークフロー
Environmentsを利用すると、以下のようにシンプルなワークフローを記述できます。
build-and-push:
runs-on: ubuntu-latest
# 環境ごとのEnvironmentsを選択
environment: ${{ github.ref == 'refs/heads/develop' && 'dev' || github.ref == 'refs/heads/staging' && 'stg' || 'prod' }}
env:
REGION: ${{ vars.REGION }}
IAM_ROLE_TO_ASSUME: ${{ vars.IAM_ROLE_TO_ASSUME }}
ENV: ${{ vars.ENV }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ${{ env.REGION }}
role-to-assume: ${{ env.IAM_ROLE_TO_ASSUME }}
role-session-name: GitHubActions
role-duration-seconds: 3600
- name: Login to ECR
uses: aws-actions/amazon-ecr-login@v2
- name: Build Docker Image
run: docker build --build-arg ENV=${{ env.ENV }}