Githubのworkflowファイルを整理しました

こんにちは、もうすぐ玉ねぎの収穫が楽しみなHarashoです。(自宅の近くで畑を借りて家庭菜園しています♪)

今回の記事ですが、タイトルの通りGithub Actionのworkflowファイルを整理したお話しです。

修正前

以下のような構成でした。

  • workflows/
    • deploy.yml
      • 本番環境へのCI/CD
    • deploy_stg.yml
      • ステージング環境へのCI/CD
    • test.yml
      • 本番、ステージング以外のブランチへのCI

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ジョブが共通化できたので、今度はdeploydeploy_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