こんにちは、もうすぐ玉ねぎの収穫が楽しみなHarashoです。(自宅の近くで畑を借りて家庭菜園しています♪)
今回の記事ですが、タイトルの通りGithub Actionのworkflowファイルを整理したお話しです。
修正前
以下のような構成でした。
- workflows/
- deploy.yml
- 本番環境へのCI/CD
- deploy_stg.yml
- ステージング環境へのCI/CD
- test.yml
- 本番、ステージング以外のブランチへのCI
- deploy.yml
deploy.yml
name: deploy on: release: types: [released] jobs: test: # CI共通の内容 deploy: needs: test # 本番向けCD
deploy_stg.yml
name: deploy_stg on: push: branches: - staging jobs: test: # CI共通の内容 deploy_stg: needs: test # ステージング向けCD
test.yml
name: Test on: push: branches-ignore: - master - staging jobs: test: # CI共通の内容
各ファイルに定義しているtest
ジョブをまず共通化したいと思い調べていたところ、Reusing workflowsを使うと実現出来そうなので試してみました。
まず、test
ジョブを定義するファイルを新規作成します。
_test_job.yml
name: Test Job on: workflow_call: jobs: test: # CI共通の内容
呼び元は以下のようにします。 test.yml
name: Test on: push: branches-ignore: - master - staging jobs: test: uses: ./.github/workflows/_test_job.yml
同様の編集をdeploy.yml、deploy_stg.ymlにも行います。
test
ジョブが共通化できたので、今度はdeploy
、deploy_stg
ジョブの共通化を図ります。
これらはtest
ジョブと違って内容が完全には一致していないので、差分がある箇所(情報)を共通化するファイルに渡します。
_deploy_job.yml
name: Deploy Job on: workflow_call: inputs: deploy_target: description: デプロイ対象 type: string required: true secrets: secret_xxx: required: true jobs: deploy: # 受け取った情報を以下のように使う # ${{ inputs.deploy_target }} ${{ secrets.secret_xxx }}
呼び元は以下のようにします。
deploy.yml
name: deploy on: release: types: [released] jobs: test: uses: ./.github/workflows/_test_job.yml deploy: needs: test uses: ./.github/workflows/_deploy_job.yml with: deploy_target: production secrets: secret_xxx: xxx
修正後
- workflows/
- deploy.yml
- deploy_stg.yml
- test.yml
- _deploy_job.yml ← 追加
- _test_job.yml ← 追加
deploy.yml
name: deploy on: release: types: [released] jobs: test: uses: ./.github/workflows/_test_job.yml deploy: needs: test uses: ./.github/workflows/_deploy_job.yml with: deploy_target: production secrets: secret_xxx: xxx
deploy_stg.yml
name: deploy_stg on: push: branches: - staging jobs: test: uses: ./.github/workflows/_test_job.yml deploy: needs: test uses: ./.github/workflows/_deploy_job.yml with: deploy_target: staging secrets: secret_xxx: xxx
test.yml
name: Test on: push: branches-ignore: - master - staging jobs: test: uses: ./.github/workflows/_test_job.yml
_deploy_job.yml
name: Deploy Job on: workflow_call: inputs: deploy_target: description: デプロイ対象 type: string required: true secrets: secret_xxx: required: true jobs: deploy: # 受け取った情報を以下のように使う # ${{ inputs.deploy_target }} ${{ secrets.secret_xxx }}
_test_job.yml
name: Test Job on: workflow_call: jobs: test: # CI共通の内容
重複したコードが減ることは気持ちがいいですね^^
インゲージではエンジニアを募集しています!
ご興味あればぜひご覧くださいませ!
ingage.co.jp