🎯

GitHub Actions で変更があるときだけ git commit & push する

2 min read

GitHub Actions で変更があるときだけ git commit & push する方法を 2 種類。

方法 1 : シェルスクリプト完結

通常のシェルスクリプトの if ! git diff --exit-code --quiet で判定。

.github/workflows/example.yml
    steps:
      - uses: actions/checkout@v2
      - name: 変更があるかもしれないしないかもしれない
        run: ./script.sh
      - name: commit & push
        run: |
          git add -N . # 新規ファイルを含める
          if ! git diff --exit-code --quiet
          then
            git config user.name github-actions
            git config user.email github-actions@github.com
            git add .
            git commit -m "Update"
            git push
          fi

具体例

https://github.com/SnowCait/twitter-swagger-ui/blob/1116600be17be7b23a6d3a925cf9c597843d272b/.github/workflows/update-openapi-json.yml#L21-L30

方法 2 : jobs.<job_id>.steps.if

方法 1 だと複数の step で使用できなかったり、ステップ自体は実行されたことになってしまうため jobs.<job_id>.steps.if を使います。
git diff --name-only | wc -l で変更ファイル数をカウントしワークフローコマンド set-output で次のステップへ渡します。

.github/workflows/example.yml
    steps:
      - uses: actions/checkout@v2
      - name: 変更があるかもしれないしないかもしれない
        run: ./script.sh
      - name: Count changes
        id: changes
        run: |
          git add -N . # 新規ファイルを含める
          echo "::set-output name=count::$(git diff --name-only | wc -l)"
      - name: commit & push
        run: |
          git config user.name github-actions
          git config user.email github-actions@github.com
          git add .
          git commit -m "Update"
          git push
        if: steps.changes.outputs.count > 0

具体例

https://github.com/SnowCait/twitter-swagger-ui/blob/3e52aa3a77d4f6a86175102fae4ebf207b608b56/.github/workflows/update-openapi-json.yml#L23-L33

jobs.<job_id>.if

もちろん jobs.<job_id>.if でも使えます。
次のジョブへの渡し方などは上記具体例のリンク先を参照。

Discussion

ログインするとコメントできます