Travis-CI で go の特定バージョンでだけテストカバレジを取りたい

概要

go の 1.11 がリリースされました 🙌.それに伴って,テストカバレッジの指定方法が変更されて,いままでパッケージひとつごとにしかテストカバレッジ取れなかったのが,パッケージをまとめて指定出来るようになりました.

いままでのテストカバレッジ,地味にめんどくさくて,今までは

#!/bin/bash

COV_FILE=coverage.txt
COV_TMP_FILE=coverage_tmp.cov
ERROR=""

echo "mode: count" > $COV_FILE

for pkg in `go list ./...`
do
    touch $COV_TMP_FILE
    go test -covermode=count -coverprofile=$COV_TMP_FILE $pkg || ERROR="Error testing $pkg"
    tail -n +2 $COV_TMP_FILE >> $COV_FILE || (echo "Unable to append coverage for $pkg" && exit 1)
done

rm $COV_TMP_FILE

if [ ! -z "$ERROR" ]
then
    echo "Encountered error, last error was: $ERROR"
    exit 1
fi

GOPATH=$HOME/gopath
GOVERALLS=$(echo $GOPATH | tr ':' '\n' | head -n 1)/bin/goveralls
$GOVERALLS -coverprofile=$COV_FILE -service=travis-ci

こんな感じのスクリプトを置いておいて,これを travis.yaml から呼び出してたんですが,1.11 では,

go test -covermode=count -coverprofile=$COV_TMP_FILE ./...

のようにまとめて指定出来ます.

がしかし,travis-ci では go のいくつかのバージョンをまとめて指定出来るので,前のバージョンもテストしてカバレッジを取るようにしておくと,go のバージョンを見て,どっちの方式でやるか,あるいは指定バージョンでのみカバレッジ取る,みたいな設定が必要になってきます.

やりたいことは

です.至極単純なことなんですが,設定方法をかなり試行錯誤したので,メモ代わりに置いておきます.

Travis-CI での go のバージョン判別法

変数 $TRAVIS_GO_VERSION に納められているのでこれで判別出来ます. travis-ci では 1.11.x のように末尾をワイルドカードに出来るのですが,このとき,$TRAVIS_GO_VERSION に入っているのは 1.11.x です.実際のバージョンが入っている訳ではないので気をつけてください.

どうやるか

結論から言うとこういう感じです.テストが終わったら,after_success でテストカバレッジを取って coveralls に送信してます.

language: go

go:
  - "1.9.x"
  - "1.10.x"
  - "1.11.x"
  - tip
sudo: false
cache: bundler

git:
  depth: 1

before_install:
  - pip install --user codecov
  - go get github.com/axw/gocov/gocov
  - go get github.com/mattn/goveralls
  - go get golang.org/x/tools/cmd/cover

install:

script:
  - go test ./...
  - cd tokenizer; go test -benchmem -bench .; cd ..
  - cd internal/dic; go test -benchmem -bench .; cd ../..

after_success:
  - |
    if [[ $TRAVIS_GO_VERSION = 1.11.x ]]
    then
      go test -covermode=count -coverprofile=coverage.txt ./...
      $GOPATH/bin/goveralls -coverprofile=coverage.txt -service=travis-ci
    else
      echo skip coverage test, $TRAVIS_GO_VERSION
    fi

うまくいかなかった方法

travis-ci で用意されてる condition とか on とか if を利用するのはうまくいかなかったです.こう云うのでうまくやれた方がスッキリしそうなんですが,もしもっといい書き方あるよ!というのをご存じの方がいらっしゃいましたらお教えください.

Happy hacking!