📚

EnvironmentsとReusable workflowsを使った処理の共通化

2023/12/16に公開

はじめに

今まではデプロイ環境ごとに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を作成します。

.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://docs.github.com/en/enterprise-cloud@latest/actions/using-workflows/workflow-syntax-for-github-actions#onworkflow_call

https://github.com/orgs/community/discussions/25238#discussioncomment-4367677

GitHubで編集を提案

Discussion