[GitHub Actions] 指定のBranchの存在チェックをする(git-fetchコマンド)
こんにちは、CX事業本部 IoT事業部の若槻です。
GitHub ActionsでBranchを作成する処理を実装する際に、作成前に対象のBranchが作成済みであるかチェックする必要が生じました。
そこで今回は、GitHub Actionsで指定のBranchの存在チェックをする方法を確認してみました。
確認してみた
色々模索したのですが、結論としてgit-fetchコマンドに落ち着きました。
git-fetchの仕様
git-fetchは、リモートなどのRepositoryからrefやobjectをダウンロードできるコマンドです。(普段Gitで開発をする人には馴染み深いコマンドかと思います。)
このgit-fetchコマンドを実行した際に、指定したBranchが対象のRepository上に存在していればExit Codeは0
、存在していなければ128
が返ります。
$ git fetch origin existing_branch remote: Enumerating objects: 8, done. remote: Counting objects: 100% (8/8), done. remote: Compressing objects: 100% (3/3), done. Unpacking objects: 100% (5/5), 762 bytes | 95.00 KiB/s, done. remote: Total 5 (delta 2), reused 1 (delta 0), pack-reused 0 From github.com:cm-rwakatsuki/devio * branch existing_branch -> FETCH_HEAD * [new branch] existing_branch -> origin/existing_branch $ echo $? 0 $ git fetch origin no_existing_branch fatal: couldn't find remote ref no_existing_branch $ echo $? 128
よって、このgit-fetchコマンドのExit Codeに応じて後続の処理を分岐させられます。
git-fetchの使用例
次のようにすれば、対象のBranchが存在しなければactionをFailさせられます。
steps: - name: Checkout uses: actions/checkout@v3 - name: Fail if the branch is not existing run: | git fetch origin ${BRANCH_NAME}
また次のようにBranchの存在有無を環境変数に格納して、後続のStepのif構文で使うこともできます。
steps: - name: Checkout uses: actions/checkout@v3 - name: Set whether the branch is already existing to GITHUB_ENV run: | branch_is_existing=$( git fetch origin ${NEW_BRANCH_NAME} && echo true || echo false ) echo "BRANCH_IS_EXISTING=${branch_is_existing}" >> $GITHUB_ENV - name: Create branch if: env.BRANCH_IS_EXISTING == 'false' uses: EndBug/add-and-commit@v9 with: new_branch: ${{ env.NEW_BRANCH_NAME }}
できそうで出来なかった方法
git-rev-parseコマンドを次のように使うと、指定したBranchが対象のRepository上に存在していればExit Codeは0
、存在していなければ1
が返ります。
$ git rev-parse --verify --quiet origin/existing_branch 488a19530c23dd53cf0a908d74458b7bc59abb58 $ echo $? 0 $ git rev-parse --verify --quiet origin/no_existing_branch $ echo $? 1
チェックがしたいだけなら不要なダウンロードも走らないのでgit-rev-parseコマンドの方が良さそうですが、GitHub Actions上で使用すると、Branchの存在の有無に関わらずExit Codeが1
になってしまうという動作となってしまいました。
この問題の解決はできず、結局git-fetchコマンドを採用するに至りました。
おわりに
GitHub Actionsで指定のBranchの存在チェックしてみました。
Exit Codeを意識するとGitHub Actionsで出来ることの幅がグッと広がりますね。
参考
以上