🦔
GitHub Actionsでenv(dev,stg,prod)別にデプロイする
GitHub Actions で env(dev,stg,prod)別にコードをデプロイする。
環境ごとにトリガーを設定する必要があるが、
dev:GitHub へプッシュorプルリクマージのタイミングで自動実行
stg/prod:workflow_dispatch で好きなタイミングで手動実行
が使いやすいと思われる。
on:
push: # リポジトリプッシュのタイミングでデプロイ
branches:
- '*'
paths: # 特定のフォルダ内のファイルに変更があった場合のみデプロイ
- '.github/workflows/deploy.yml'
- 'infra/**'
workflow_dispatch: # 好きなタイミングで手動実行
inputs:
env:
type: choice
description: deploy target env
options:
- dev
- stg
- prod
以下のようにして、手動実行でない場合(inputs.env が空白の場合)には dev 、それ以外は手動実行時に env に選択した環境(dev or stg or prod)を steps.set-env.outputs.environment に入れるようにする。
jobs:
deploy:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: set-env
id: set-env
run: |
if [ -z "${{ github.event.inputs.env }}" ]; then
echo ::set-output name=environment::dev
elif [ "${{ github.event.inputs.env }}" == "dev" ]; then
echo ::set-output name=environment::dev
elif [ "${{ github.event.inputs.env }}" == "stg" ]; then
echo ::set-output name=environment::stg
elif [ "${{ github.event.inputs.env }}" == "prod" ]; then
echo ::set-output name=environment::prod
fi
以下のように、設定しておいた steps.set-env.outputs.environment 別に if を記述し、各環境ごとの secrets を読み込むようにすることで、AWS credentials を分けられるようにする。
- name: AWS credentials for dev
if: ${{ steps.set-env.outputs.environment == 'dev' }}
uses: aws-actions/configure-aws-credentials@v1
with:
aws-region: ${{ secrets.AWS_DEFAULT_REGION }}
role-to-assume: ${{ secrets.DEV_AWS_ROLE_ARN }}
- name: AWS credentials for stg
if: ${{ steps.set-env.outputs.environment == 'stg' }}
uses: aws-actions/configure-aws-credentials@v1
with:
aws-region: ${{ secrets.AWS_DEFAULT_REGION }}
role-to-assume: ${{ secrets.STG_AWS_ROLE_ARN }}
- name: AWS credentials for prod
if: ${{ steps.set-env.outputs.environment == 'prod' }}
uses: aws-actions/configure-aws-credentials@v1
with:
aws-region: ${{ secrets.AWS_DEFAULT_REGION }}
role-to-assume: ${{ secrets.PROD_AWS_ROLE_ARN }}
以下のように、環境変数に従って実行するコマンド yarn deploy:env を制御する。
- name: Deploy to dev
if: ${{ steps.set-env.outputs.environment == 'dev' }}
working-directory: infra
run: yarn deploy:dev --app "npx ts-node bin/app.ts" --all --require-approval never
- name: Deploy to stg
if: ${{ steps.set-env.outputs.environment == 'stg' }}
working-directory: infra
run: yarn deploy:stg --app "npx ts-node bin/app.ts" --all --require-approval never
- name: Deploy to prod
if: ${{ steps.set-env.outputs.environment == 'prod' }}
run: yarn deploy:prod --app "npx ts-node bin/app.ts" --all --require-approval never
試しに手動で stg を選択し workflow を実行すると、以下のように stg 環境へのデプロイが実行された。
dev,stg,prod 環境別にコードをデプロイするタイミングは異なると思うので、この記事を参考にしてみて欲しい。
Discussion