Gitでタグを作る様な時は大概masterブランチ等で十分テストを行った後です。 そのような場合は新しいタグはmasterブランチの最新の物と一致していて、 Travis CI等を単なるテスト様に使っている場合は 新しいタグに対するテストビルドは無駄です。
これを回避するためにコミットメッセージにスキップコマンドを加えたりしてましたが、 これが上手く動いてなかったので調べてみました。
Travis CIで特定のコミットを無視する
Travis CIで特定のコミットを無視したいときは、
そのコミットのメッセージに[ci skip]
または[skip ci]
というワードを入れます。
これはメッセージ中の何処にあってもよく、
ぱっと見で見えないように、2行目以降に書いてもOK。
タグのpushを無視する
上の様な機能があるので、タグを作るときにタグ作成のメッセージへ毎回
[ci skip]
を加えていました。
ちなみにこんなエイリアスを作ってgit tag-new
することで
最新のコミットメッセージと共に新しいタグを作る様にしていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
これで実際タグを作ると、タグのコミットメッセージには確かに[ci skip]
が入っています。
ただ、何故かこのタグもTravis CI側でテストが行われてしまっています。
Travis CI側で表示されるコミットメッセージをみると、なぜか
[ci skip]
の部分が抜けたメッセージになっていて、
最初はタグのメッセージに[ci skip]
がきちんと入ってないのかと思いましたが、
上で書いたようにきちんと入っています。
また、実は文の最後に書くとダメなのか、とか[skip ci]
しか使えなくなってた、
とか色々試してみましたがどれもダメ。
一方、テストでmasterブランチで[ci skip]
を入れてみると
どの部分に入れても、[skip ci]
でもきちんとスキップされています。
で、色々やって気づいたのが、masterブランチ側で最後に[ci skip]
を入れて
コミットしたものからタグを作るとそれはスキップされること。
どうもTravis CIではタグのコミットメッセージは無視して、 実際にコードに対して変更を行った最後のコミットのメッセージを 取ってきて確認している様です。
なのでmasterブランチとかで最後までスキップメッセージなしでコミットした場合、 タグを作るとどうしてもそれに対してもテストビルドが走ります。
これを回避するには
- タグを作る元ブランチで最後に
[ci skip]
のメッセージを入れる余分なコミットを作る。- READMEに適当に空白を付け加えたり消したりとか。date.txtとか作って
$ date > date.txt
で毎回アップデートするとか。。。
- READMEに適当に空白を付け加えたり消したりとか。date.txtとか作って
- タグを作る際に.travis.ymlを一度消してコミットしてタグを作り、またあとで加える。
- Travis CIではWebから設定で.travis.ymlがあるブランチだけをチェックする様にする設定があるのでそれをONにしておく。
- ただ、これよく考えると後で加えてから
push
するとそれに対してまた無駄なビルドが走る。。。
- .travis.ymlにタグを無視するような設定を書く。
上の2つは余りにスマートでないのでダメ。
最後の物はこれを参照:
Don’t build tags by default · Issue #1532 · travis-ci/travis-ci
.travis.ymlに
branches:
except:
- /^v[0-9]/
を加えておくことでv0.0.1
の様なタグを全て無視します。
ただ、これは単に名前で見てるだけなので、v
から始まらない
タグの名前を付けてたりする場合はそれに対応する様に変更が必要です。
もしくはmasterブランチ以外ではテストを走らせなくて良い、とかなら、 ブラックリストの代わりにホワイトリストを使って
branches:
only:
- master
とすることでmasterブランチ以外では走らせない様にすることも可能です。
ちなみに.travis.ymlの中ではホワイトリストの方がブラックリストより強いので、
except
の項目にあるものでもonly
の項目にあればそれに対してテストが走ります。
つまり
branches:
except:
- /^v[0-9]/
only:
- v1.0.0
みたいにすれば、通常のタグに対してはテストは走りませんが、
v1.0.0
だけに対してはテストが走るようになります。