🚴♂️
Github Actionsで処理の共通化を行う(workflow_call)
背景
開発する際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