🦔

GitHub Actionsでenv(dev,stg,prod)別にデプロイする

2022/10/04に公開

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