stefanzweifel/git-auto-commit-action@v3.0.0
使ったメモ。
なにこれ
これはユーザが提供しているGithub Actionで,Github Actions Workflowの中でファイルが変更された場合,そのファイルをコミット&&プッシュしてくれるという便利なやつで, 社内でもちょこちょこ使われている。
以前は人間ががんばってシェルスクリプトで対象ファイルのshasumなどを計算してそれを突き合わせたり,gitに渡す認証情報をがんばってハンドリングしたりしていたけれど,このActionがそういった煩雑な処理を一手に引き受けてくれる。クレデンシャルも自動で設定される。
使い方
前提として,action/checkout@v2
以上を使ってブランチをチェックアウトしている必要がある。
workflow.yml
に以下のように記述することで,ファイルをコミット&&プッシュさせることができる。
- uses: stefanzweifel/git-auto-commit-action@v3.0.0 with: commit_message: Apply automatic changes file_pattern: src/\*.js
よく使うオプションはfile_pattern
で,ファイルグロブを渡してコミット対象になるファイルを絞り込める。必須であるcommit_message
とこれだけ覚えていればよいと思う。
ハマりどころ
このActionは以下の前提に立って設計されている。
- コミット対象のファイルのみが変更されているか,もしくはWorking treeがcleanである
したがって以下の場合には失敗してしまうというハマリどころがある。
- コミット対象を
file_pattern
で指定している - コミット対象のファイル(例では
src/*.js
)が変更されていない - コミット対象以外のファイルが変更・追加されるなどして,working treeがdirtyである
この挙動はこのActionの中身のentrypoint.sh
を見ると理解できる。
_main() { _switch_to_repository if _git_is_dirty; then _setup_git _switch_to_branch _add_files _local_commit _push_to_github else echo "Working tree clean. Nothing to commit." fi }
まずリポジトリがdirtyかどうかを確認し,dirtyならばコミットする必要があると判断してgit add
やgit commit
を実施している。先程説明した,「コミット対象のファイルはcleanだがそれ以外のファイルがdirtyな場合」には,git add
がスカになってしまう。
何も変更されていないのでgit commit
は失敗し,exit code
として1が返却されAction全体が失敗する。
対処法
リポジトリがdirtyにならないようにすればこの問題は回避できる。具体的には次のような対処法がある。
- 動的に生成されうるファイルを
.gitignore
に追加して,無視させる - 動的に生成されうるファイルをGithub Actions Workflowの中で削除する
こうすると「リポジトリがdirtyか」の判定でそのまま終了するので落ちずに済む。