[ci skip] とは
多くの CI サービスで採用されている、コミットメッセージでビルドスキップができるコマンドです。
ドキュメントのみの更新とかでわざわざビルドしなくてもいい場合に便利な機能です。
GitHub Actions における ci skip
GitHub Actions は Azure Pipelines から派生しているので
「
***NO_CI***」が使sえるかな?と思っていましたが、それはない模様。
*
Build pipeline triggers - Azure Pipelines | Microsoft Docs
*
GitHub Actions ***NO_CI*** alternative - Stack Overflow
Azure Pipelines ベースなので、一般的な 「[ci skip]」 も使えません。
つまり、GitHub Actions では現状 CI をコミットコメントからスキップすることができません。
・・・とはいえ、スキップしたい!ということで今ある機能でなんとかできないかやってみました。
Workaround
steps.if でなんとかしてみた
steps.if は条件付きでステップを実行するかしないかを制御する機能です。
これがあったので、以下のようにすることで、「ステップ」のスキップは実現できていました。
steps:
- name: Check condition
if: "! contains(github.event.head_commit.message, '[ci skip]')"
上記の方法で、最新コミットのコミットメッセージに「[ci skip]」が含まれていたら、そのステップをスキップすることができます。
ただ、これはあくまでステップのスキップなので、他サービスの [ci skip] とはだいぶ異なります。。
job.if がキターー
GitHub Actions - new workflow syntax features - The GitHub Blog
job 単位での制御がしたい!と思っていたら来ました!!
jobs:
build:
runs-on: ubuntu-latest
if: "! contains(github.event.head_commit.message, '[ci skip]')"
steps.if のときと書き方は同じで、job のところに書けるようになりました。
これで job のスキップができるようになりました。
受け入れジョブを作ってそこを起点にする
さらに他 CI サービスでの挙動に近づけるために、依存関係を作成します。
[ci skip] をチェックするジョブを起点にジョブをぶら下げることで、スキップしたジョブの後続もスキップするようにします。
jobs:
prepare:
runs-on: ubuntu-latest
if: "! contains(github.event.head_commit.message, '[ci skip]')"
steps:
- run: echo "${{ github.event.head_commit.message }}"
build:
runs-on: ubuntu-latest
needs: prepare
prepare ジョブがスキップすると build ジョブもスキップします。
これで完成です。
スキップ結果
スキップすると以下のように表示されます。
checks にはのらないようです。(CI サービスによっては出たりする)
まとめ
ci-skip/WORKAROUND.md at master · srz-zumix/ci-skip
いろいろ説明を省きましたが、こちらで今回の方法をまとめいます。
今回のポイントは github context の使い方かな、と思います。
公式ドキュメントの github context では省かれていますが、ドキュメントの表以外にも取得可能な情報がたくさんあります。
今回は 'github.event.head_commit.message' でコミットメッセージを取得しました。
↑のまとめに github context から取得できる値の例と、ダンプ方法も書いてあるので参考にしてください。
最後に
私が使っている CI サービスでの [ci skip] 機能に関して、まとめているリポジトリがありますので
他のサービスでの [ci skip] を確認する場合、よろしければこちらも参考にしてください。
https://github.com/srz-zumix/ci-skip
では。