追記: 2021-02-09, GitHub Actions Runner の方で実装されたので、この記事の方法は役目を終えました。[skip cd]
のように独自キーワードを定義したい場合には引き続きこの方法が使えます。
GitHub Actions: Skip pull request and push workflows with [skip ci] - GitHub Changelog
GitHub Actions でも CircleCI や Netlify みたいに [skip ci]
を実現する方法を紹介します。
Workflow の例
結論から言うとこんな感じの Workflow を作ればできます。
name: Test
on: [push]
jobs:
skipci:
runs-on: ubuntu-18.04
steps:
- run: echo "[skip ci] ${{ contains(github.event.head_commit.message, '[skip ci]') }}"
test:
runs-on: ubuntu-18.04
if: contains(github.event.head_commit.message, '[skip ci]') == false
steps:
(2020-07-04 追記) 上の書き方が安定しています。下のような書き方もできますが、たまに上手くいかないケースに遭遇しました。
name: Test
on: [push]
jobs:
skipci:
runs-on: ubuntu-18.04
outputs:
is_skip: ${{ steps.is_skip.outputs.is_skip }}
steps:
- name: Set is_skip
id: is_skip
run: echo "::set-output name=is_skip::${{ contains(github.event.head_commit.message, '[skip ci]') }}"
- run: echo "[skip ci] ${{ steps.is_skip.outputs.is_skip }}"
test:
runs-on: ubuntu-18.04
needs: skipci
if: ${{ ! needs.skipci.outputs.is_skip }}
steps:
...
あとはコミットメッセージを ci: Add skip job [skip ci]
とかにして Push すれば skip job だけが実行されるはずです。簡単にカスタマイズできるので好きな文字列をトリガーとして設定できます。[skip cd]
(Continuous Deployment) とか?
skip job を入れておかないと Job が開始されません。(Job が一つだとダメということです。) 今の GitHub Actions の仕様だとこの回避策が必要みたいです。Private repository だと実行時間をなるべく節約したいので、これくらいは我慢します。
(2020-04-23 追記) スキップされた Job はちゃんとその旨がログとして表示されるようになりました。
ちなみに paths-ignore
を設定すれば「変更が **.md
のみであればその Workflow をスキップする」ことができるのであわせて仕込んでおくと良いでしょう。また、 paths
という項目もあり、こちらは「 Dockerfile
の変更に対してのみ Workflow を実行する」のように設定できます。
on:
push:
branches:
- master
paths:
- 'Dockerfile'
paths-ignore:
- '**.md'
pull_request ではできません
この方法では pull_request
event の時に commit の情報が取れないので Pull Request に対しては使えません。今のところ push event に対してのみ有効な方法です。
これに至るまでの経緯
GitHub Actions Beta v2 の頃から試行錯誤していて、昨日これに落ち着いた。GitHub Actions for GitHub Pages の custom commit message option を実装している時に head_commit
を見つけて、そう言えば Skip CI を github.event.commits[0].message
でやっていたことを思い出し、今は Job レベルの if がサポートされているおかげで昔よりすっきりした。(昔は Step ごとにこの if を書いていた。)