Jenkins で PR をトリガーに自動テストを実行するときに GitHub pull request builder plugin - Jenkins - Jenkins Wiki を使っている現場は多いと思う.
この Plugin が便利なのは簡易的な ChatOps が実現できるところだと思っていて,PR のコメント欄に以下のフレーズを書き込むと,自動的にトリガーされて,CI の再実行などを行うことができる.ここまではよく知られた機能だと思う.
- "ok to test" to accept this pull request for testing
- "test this please" for a one time test run
- "add to whitelist" to add the author to the whitelist
"skip ci" とは
コミットごとに自動的に CI が実行されるのは素晴らしいことなんだけど,絶賛開発中で確実にテストが落ちる状況だったり,ジョブが詰まっていて他のジョブを優先したいときに,一時的に CI をスキップしたいことがある.
CircleCI や TravisCI では [ci skip]
とコミットメッセージに書くと CI をスキップすることができて,OSS で使われている場面も多くある.CircleCI や TravisCI のようにコミットごとに指定することはできないが,類似した制御なら "GitHub Pull Request Builder Plugin" でも実現できることがわかって,調査の中で結構ハマったので,メモっておこうと思う.
Skip build phrase
Plugin の設定で Skip build phrase
を定義することができる.この正規表現にマッチすると CI をスキップすることができて,デフォルトだと .*\[skip\W+ci\].*
で定義しているため [skip ci]
でマッチするようになっている.ただ CircleCI や TravisCI と違っていて微妙なので [ci skip]
に変えるとモダンかも?
ポイントは in the pull request body
という点で,コミットメッセージじゃなくて PR の説明欄に書く必要がある.そしてこの仕様に罠があった.
When filled, commenting this phrase in the pull request body will not trigger a build.
v1.27 以降を使うべき
v1.14
v1.14 で Skip build phrase が使えるようになった!ただし PR の説明欄が複数行だとトリガーされない仕様になっているため,PR に対応内容などを書いてしまっている中に [skip ci]
と書いてしまうと CI が動いてしまう.これは残念すぎる.
v1.27
v1.27 で複数行にも対応できるようになったので,一般的な使い方ができるようになったー!
残念ながら
現在の環境は v1.15 から上げていなかったため複数行に対応していなかった.よって v1.15 で "skip ci" を実現するには以下のように説明欄に [skip ci]
だけを書く必要がある.ツライ!
結論
Plugin をバージョンアップしよう!