kakakakakku blog

Weekly Tech Blog: Keep on Learning!

GitHub Pull Request Builder Plugin で "skip ci" を実現する

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] だけを書く必要がある.ツライ!

f:id:kakku22:20151217223229p:plain

結論

Plugin をバージョンアップしよう!