Travis CIやCircleCIのテストを全部パスしてからgit push
したいけど、git push
しないとCIが動かない、どうしたらいいんだ?とお悩みの方はいらっしゃいませんか?実は、履歴を汚さずにCIする方法があるんです。手元のcommitを本来のブランチではなく一時的な別ブランチにpushすればいいんです。
Travis CIやCircleCIでは特に設定しない限り全ブランチのpushに対してCIが走るので、別ブランチへのpushでもテスト結果を確認することができます。無事にテストをパスしたら改めて本来のブランチにpushすれば良いでしょう。
以下に例を示します。たとえばmasterブランチにcommitしたけどまだpushしていない状況としましょう。ここで次のようにすればローカルのmasterブランチをリモートの新たなブランチにpushすることができます。
$ git push origin master:implement-foobar-20160418
ブランチ名指定の部分は次のような記法になっています。
<ローカルブランチ名>[:<リモートブランチ名>]
普段はローカルブランチ名とリモートブランチ名が同じなので、:
以下を省略して記述していたというわけです。
無事にテストに成功したら、この一時的なブランチは削除してしまいましょう。次のようにローカルブランチ名に空文字を与えてpushするとリモートブランチが削除できます。
$ git push origin :implement-foobar-20160418
これで歴史を汚さずに実験し放題というわけです。やったね!
他の利用シーン
たとえばMarkdownファイルをコミットするような場合でも、GitHub Flavored Markdownの見栄えってpushしてみないとわからなかったりするので、別ブランチを使うのはアリかなと思います。
特定の名前のブランチに対してCIしない設定
ブランチ名によってCIするかどうかを切り替える方法も示します。1リポジトリで複数のCIサービスを使っているような場合は特に有用でしょう。
Travis CIの場合
branches:
except:
- gh-pages
- /^circleci-.*$/
- /^wercker-.*$/
only:
でホワイトリスト設定もできます。(参考:Whitelisting or blacklisting branches)
CircleCIの場合
general:
branches:
ignore:
- gh-pages
- /^travisci-.*$/
- /^wercker-.*$/
only:
でホワイトリスト設定もできます。(参考:Specifying branches to build)
Werckerの場合
設定ファイルに書く方法は無さそうです。Webコンソールの「Settings」「Options」「Ignored branches」からブランチ名のブラックリスト設定ができます。