🚴‍♂️

Github Actionsで処理の共通化を行う(workflow_call)

2024/10/24に公開

背景

開発する際dev,stg,prodのように複数環境を用意することがある。
その時dev,stg,prodブランチにマージされると各環境にdeployを実施したり、PRマージ前にtestする処理を実施したり、指定の動作を行いたい。

既存の実装パターン

deploy.yamlに統合し、環境差分を変数化する場合:

  • コードの重複を避けられる
  • メンテナンスが一箇所で完結
  • 問題
    • 全環境で同じworkflow名になる
    • PRのマージ要件として設定されているworkflowのステータスチェックが環境間で干渉
    • 例:本番環境へのデプロイPRで、開発環境のworkflow失敗がマージをブロック

(dev|stg|prod)-deploy.yamlのように環境ごとにワークフローファイルを分割する場合:

  • 同じような処理が各ファイルに重複して書かれる
  • ファイル間で処理の整合性を保つ必要がある
  • メンテナンス時に複数ファイルの修正が必要

やること

workflow_callを使ってworkflowを所謂モジュール化する。(link)

メリット

  • リソースの共通化が出来る
  • 使うことによってworkflow名を分けられる
  • 各環境のデプロイが他環境の状態に影響されない

実装

共通化したworkflow

# reusable-build.yml
name: Reusable Build Process

on:
  workflow_call:
    inputs:
      node-version:
        required: true
        type: string
        description: "Node.jsのバージョン"
    secrets:
      build-command:
        required: false
        description: "ビルドコマンド"


jobs:
  build:
    runs-on: ubuntu-latest
    defaults:
      run:
        shell: bash
        working-directory: front
    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ inputs.node-version }}

      - name: Install dependencies
        run: npm ci

      - name: Run build
        run: npm run ${{ inputs.build-command }}

      - name: Run tests
        run: npm test

呼び出しworkflow

# dev-deploy.yml
name: Development Pipeline

on:
  push:
    branches: [ develop ]

jobs:
  build-dev:
    uses: ./.github/workflows/reusable-build.yml
    with:
      node-version: '20.x'
    secrets:
      build-command: 'build:dev'

呼び出しworkflow2

# prod-deploy.yml
name: Prod Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-project:
    uses: ./.github/workflows/reusable-build.yml
    with:
      node-version: '18.x'
    secrets:
      build-command: 'build:prod'

  lint:
    runs-on: ubuntu-latest
    defaults:
      run:
        shell: bash
        working-directory: front
    steps:
      - uses: actions/checkout@v4
      - name: Run lint
        run: |
          npm ci
          npm run lint

動作確認

表示


secretsは表示されない

Discussion