rcmdnk's blog

Where You Stand

Gitでタグを作る様な時は大概masterブランチ等で十分テストを行った後です。 そのような場合は新しいタグはmasterブランチの最新の物と一致していて、 Travis CI等を単なるテスト様に使っている場合は 新しいタグに対するテストビルドは無駄です。

これを回避するためにコミットメッセージにスキップコマンドを加えたりしてましたが、 これが上手く動いてなかったので調べてみました。

Sponsored Links

Travis CIで特定のコミットを無視する

Travis CIで特定のコミットを無視したいときは、 そのコミットのメッセージに[ci skip]または[skip ci]というワードを入れます。 これはメッセージ中の何処にあってもよく、 ぱっと見で見えないように、2行目以降に書いてもOK。

Travis CI: How to skip a build

タグのpushを無視する

上の様な機能があるので、タグを作るときにタグ作成のメッセージへ毎回 [ci skip]を加えていました。

ちなみにこんなエイリアスを作ってgit tag-newすることで 最新のコミットメッセージと共に新しいタグを作る様にしていました。

.gitconfig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[alias]
  tag-renew = "!f () {\
      if [ \"$1\" = \"-v\" ];then \
        tag=\"$2\";\
        shift;shift;\
      else \
        tag=v$(git tag|sed s/v//g|sort -t . -n -k1,1 -k2,2 -k3,3|tail -n1);\
      fi;\
      if [ $# -ne 0 ];then \
        comment=\"$*\";\
      else \
        comment=\"$(git log -1|tail -n +5)\";\
      fi;\
      if [ -f \"$(git rev-parse --git-dir)/.travis.yml\" ]; then \
        comment=\"${comment} [ci skip]\";\
      fi;\
      tagcheck=$(git tag|grep ${tag});\
      if [ \"$tagcheck\" != \"\" ];then \
        git tag -d ${tag};\
        git push origin :${tag};\
      fi;\
      git tag -a ${tag} -m \"${comment}\";\
      git push --tag;\
    };f"

これで実際タグを作ると、タグのコミットメッセージには確かに[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で毎回アップデートするとか。。。
  • タグを作る際に.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だけに対してはテストが走るようになります。

Travis CI: Configuring your build

Sponsored Links
Sponsored Links

« DropboxがDropboxフォルダ以外にもアクセスしてる? c: c言語をスクリプト感覚で実行出来る様にするコマンド »