Lambdaカクテル

京都在住Webエンジニアの日記です

stefanzweifel/git-auto-commit-action@v3.0.0ではuntracked fileがあるときエラー終了する

stefanzweifel/git-auto-commit-action@v3.0.0使ったメモ。

なにこれ

github.com

これはユーザが提供している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 addgit commitを実施している。先程説明した,「コミット対象のファイルはcleanだがそれ以外のファイルがdirtyな場合」には,git addがスカになってしまう。 何も変更されていないのでgit commitは失敗し,exit codeとして1が返却されAction全体が失敗する。

対処法

リポジトリがdirtyにならないようにすればこの問題は回避できる。具体的には次のような対処法がある。

  • 動的に生成されうるファイルを.gitignoreに追加して,無視させる
  • 動的に生成されうるファイルをGithub Actions Workflowの中で削除する

こうすると「リポジトリがdirtyか」の判定でそのまま終了するので落ちずに済む。