GitHub Actions でも [skip ci] が使えるようになりました
公式ブログ
GitHub Actions: Skip pull request and push workflows with [skip ci] - GitHub Changelog
コミットメッセージの内容から push
と pull_request
のワークフローをスキップできるようになりました。
push または pull request (PR) の HEAD コミットに [skip ci]
, [ci skip]
, [no ci]
, [skip actions]
, [actions skip]
のいずれかが含まれる場合にワークフローがスキップされます。
検証
[skip ci]
を例に検証します。
1. スキップする単一コミット
ワークフローを作成。検証用のためトリガーは paths
で絞ってあります。
[skip ci]
というコミットメッセージで skip
ブランチへコミット。
push
, pull_request
いずれのタイミングでも CI は走りませんでした。
name: Skip CI
on:
push:
paths:
- .github/workflows/skip.yml
pull_request:
types:
- opened
- synchronize
paths:
- .github/workflows/skip.yml
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: 'echo hello'
2. スキップしない単一コミット
上記のファイルを編集して通常通りコミット。
push
と pull_request.synchronize
の CI が走りました。
3. HEAD 以外でスキップする複数コミット
1つ目のコミットを [skip ci]
でコミット。
2つ目のコミット (HEAD) を通常通りコミット。
これをまとめてプッシュすると push
, pull_request.synchronize
の CI が走りました。
HEAD 以外のメッセージは無視されるようですね。
4. HEAD でスキップする複数コミット
1つ目のコミットを通常通りコミット。
2つ目のコミット (HEAD) を [skip ci]
でコミット。
これをまとめてプッシュすると push
, pull_request
のいずれも CI が走りませんでした。
3. をスキップする
他の CI サービスでは 3. のケースでもスキップできるようなので GitHub Actions でのやり方です。
jobs.<job_id>.if
を利用します。
push
ではワークフロー自体は走りますがジョブはスキップされます。
pull_request
はペイロードが異なるのでワークフローが走ります。
jobs:
build:
runs-on: ubuntu-latest
if: ${{ !contains(github.event.commits.*.message, '[skip ci]') }}
補足: if
if
条件の中で式を使用する際には、式構文 (${{ }}
)を省略できますが、 !
は YAML の構文として解釈されパースエラーになってしまうので省略できません。
省略したい場合は以下のように書くこともできます。
if: contains(github.event.commits.*.message, '[skip ci]') == false
補足: contains
contains 関数は配列と文字列の両方に使うことができます。
配列の使用例
contains(github.event.issue.labels.*.name, 'bug')
文字列の使用例
contains('Hello world', 'llo')
PR の情報でスキップする
pull_request
ではワークフロー自体は走りますがジョブはスキップされます。
push
はペイロードが異なるのでワークフローが走ります。
タイトル
タイトルに [skip ci]
を含めます。
jobs:
build:
runs-on: ubuntu-latest
if: ${{ !contains(github.event.pull_request.title, '[skip ci]') }}
本文
本文に [skip ci]
を含めます。
jobs:
build:
runs-on: ubuntu-latest
if: ${{ !contains(github.event.pull_request.body, '[skip ci]') }}
ラベル
skip ci
というラベルを作って PR に付けます。
jobs:
build:
runs-on: ubuntu-latest
if: ${{ !contains(github.event.pull_request.labels.*.name, 'skip ci') }}
Draft
PR が Draft のとき。
jobs:
build:
runs-on: ubuntu-latest
if: ${{ !github.event.pull_request.draft }}
まとめ
基本的にはトリガーで各イベントの types
や paths
で絞り、公式提供されるようになった [skip ci]
に加えて if
で WIP
などをスキップしておくと捗りそうです。
Discussion