TL;DR
- CircleCIで複数の並列マシンを起動してGoのテストを並列実行します。
基本的なアイデア
- CircleCI CLIでテストを並列数に応じて分割
- 環境変数を使用して並列マシンごとに接続先DBを分ける
CircleCI CLIで並列数に応じてテストを分割
circleci tests split
コマンドを使ってテストをpackageごとに分割します。
ただ、splitコマンドは分割するだけでテスト自体は実行されません。
なので、結果はファイルに書き出して go test
に渡す必要があります。
具体的には下記のようにします。
go list ./... | grep -v vendor | circleci tests splits > pkgs
export TESTPKGS=$(cat pkgs | tr '\n' ' ')
go test ${TESTPKGS} 2>&1
環境変数を使用して並列マシンごとに接続先DBを分ける
CircleCIには並列処理を制御するための環境変数が用意されています。
今回は並列マシンごとに接続先DBを変えるために CIRCLE_NODE_INDEX
を使います。
この環境変数には現在実行されている特定のコンテナのインデックスが入っています。
なので、DBの名前を database-${CIRCLE_NODE_INDEX}
みたいに並列数だけ作成しておいて、
各並列ごとにそれぞれのDBに接続します。