📚
EnvironmentsとReusable workflowsを使った処理の共通化
はじめに
今まではデプロイ環境ごとにworkflowファイルを用意していました。
.github
└── workflows
├── deploy_dev.yml
└── deploy_prod.yml
上記をReusable workflowを使うことで共通化できたのでまとめます。
.github
└── workflows
├── deploy.yml
└── internal_deploy.yml
問題
環境ごとにworkflowファイルが分かれており、処理内容はまったく同じでした。
処理内容の変更や新たな環境の追加があると、各workflowファイルを更新する必要があるため、手間になりそうです。
Reusable workflowを使う
Reusable workflowの作成
共通した処理内容をReusable workflowに書きます。
-
on.workflow_call
で別のワークフローから呼び出せるようにします。 -
on.workflow_call.inputs
で引数を設定します。 -
on.workflow_call.secrets
でsecretを設定します。 -
deploy
ジョブのenvironment
に引数のenvironment
を設定します。
.github/workflows/internal_deploy.yml
name: Deploy
on:
workflow_call:
inputs:
environment:
type: string
required: true
secrets:
AWS_ACCESS_KEY_ID:
required: true
AWS_SECRET_ACCESS_KEY:
required: true
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
timeout-minutes: 120
environment: ${{ inputs.environment }}
steps:
- name: checkout
uses: actions/checkout@v4
- name: setup node.js
uses: actions/setup-node@v4
- name: install cli
run: npm i -g aws-cdk
- name: configure aws credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
- name: Deploy
run: cdk deploy --context env=${{ inputs.environment }} --require-approval never
Reusable workflowの呼び出し
環境ごとにReusable workflowを呼び出すworkflowを作成します。
-
dev_v
、prod_v
から始まるタグをプッシュしたときに起動するworkflowです。 -
deploy-to-dev
、deploy-to-prod
ジョブを用意します。- タグ名によってデプロイ先を変更しています。
-
uses
に作成したReusable workflowを指定します。 -
with
に引数を渡します。 -
secrets
にinherit
を指定することで、Reusable workflow内で利用可能なシークレット(organization、repository、environmentレベル)を自動的に引き継ぐことができます。
.github/workflows/deploy.yml
name: Deploy
on:
push:
tags:
- "dev_v*"
- "prod_v*"
jobs:
integration:
name: Integration
runs-on: ubuntu-latest
timeout-minutes: 5
outputs:
tag_name: ${{ steps.get_tag_name.outputs.TAG_NAME }}
steps:
- name: Get tag name
id: get_tag_name
run: |
echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT"
deploy-to-dev:
name: Deploy to Development Environment
needs: integration
if: ${{ startsWith(needs.integration.outputs.tag_name, 'dev_v') }}
uses: ./.github/workflows/internal_deploy.yml
with:
environment: dev
secrets: inherit
deploy-to-prod:
name: Deploy to Production Environment
needs: integration
if: ${{ startsWith(needs.integration.outputs.tag_name, 'prod_v') }}
uses: ./.github/workflows/internal_deploy.yml
with:
environment: prod
secrets: inherit
参考
https://docs.github.com/en/actions/using-workflows/reusing-workflows
https://github.com/orgs/community/discussions/25238#discussioncomment-4367677
Discussion