概要
D言語でもTravis-CIやCircle-CIをはじめとする各種CIサービスでテスト・デプロイが可能です。
今回はTravis-CIを用いてテストを自動化するテンプレを紹介します。
ちなみにビルドにはdubを使う前提です。
- D言語+Travis-CIでテスト自動化する話➀ ← この記事
- D言語+Travis-CIでテスト自動化する話②
- D言語+Travis-CIでリリースのデプロイ自動化する話
- D言語+Travis-CIでドキュメントのデプロイ自動化する話
.travis.yml のテンプレ
.travis.yml
language: d
d:
- dmd
- dmd-nightly
- ldc
- ldc-beta
os:
- linux
- osx
env:
- TEST_TARGET_ARCH=x86_64
- TEST_TARGET_ARCH=x86
matrix:
exclude:
- d: ldc
os: osx
env: TEST_TARGET_ARCH=x86
- d: ldc-beta
os: osx
env: TEST_TARGET_ARCH=x86
script: ./.travis.sh
sudo: false
addons:
apt:
packages:
- gcc-multilib
stages:
- name: test
if: type = pull_request or (type = push and branch = master)
解説
上記設定で以下の組み合わせでリポジトリのルートに .travis.yml を配置することで、以下のように初期設定が行われた状態で .travis.sh が呼び出されます。
| OS | 環境変数 | コンパイラ | 備考 |
|---|---|---|---|
| Linux | TEST_TARGET_ARCH=x86 | dmd(最新) | |
| Linux | TEST_TARGET_ARCH=x86_64 | dmd(最新) | |
| Linux | TEST_TARGET_ARCH=x86 | ldc2(最新) | |
| Linux | TEST_TARGET_ARCH=x86_64 | ldc2(最新) | |
| OSX | TEST_TARGET_ARCH=x86 | dmd(最新) | |
| OSX | TEST_TARGET_ARCH=x86_64 | dmd(最新) | |
| OSX | TEST_TARGET_ARCH=x86_64 | ldc2(最新) | 1 |
| Linux | TEST_TARGET_ARCH=x86 | dmd(nightly) | |
| Linux | TEST_TARGET_ARCH=x86_64 | dmd(nightly) | |
| Linux | TEST_TARGET_ARCH=x86 | ldc2(beta) | |
| Linux | TEST_TARGET_ARCH=x86_64 | ldc2(beta) | |
| OSX | TEST_TARGET_ARCH=x86 | dmd(nightly) | |
| OSX | TEST_TARGET_ARCH=x86_64 | dmd(nightly) | |
| OSX | TEST_TARGET_ARCH=x86_64 | ldc2(beta) | 1 |
ポイントは以下:
language: d-
d:にdmd-2.085.1などのバージョンを指定できる(古いバージョンでもコンパイルできることを保証したい場合) - OSXではx86向けにコンパイルできない
- X86向けにクロスコンパイルするために
gcc-multilibが必要 -
if: type = pull_request or (type = push and branch = master)そのままの意。 - これだけでプルリクエストとマスターブランチへのコミットするたびに14本テストが走るので、多すぎると思うなら、不要そうな条件を抜いたり
excludeに指定したりする。
.travis.sh のテンプレ
.travis.sh
# !/bin/bash
set -eux -o pipefail
TEST_TARGET_ARCH=${TEST_TARGET_ARCH:-x86_64}
dub run -a=${TEST_TARGET_ARCH} -b=unittest-cov -c=default --compiler=${DMD}
解説
ポイントは以下:
-
.travis.shは、実行可能アトリビュートを与えてからgitでコミットする。
git update-index --add --chmod=+x .travis.sh -
set -eux -o pipefailで一つテスト失敗したらそこで終了して、テスト失敗にする。 - 実行可能バイナリを実行するなら
dub runで、main関数を実行しない場合や、ライブラリならdub testでテストする。 -
-b=unittest-covでカバレッジをとれるようにする(Codecovなどと連携できる) -
--compiler=${DMD}は、現時点で、コンパイラがldc2だと-b=unittest-covを指定してもldc2に対して-covフラグが付与されないバグがあるため。
ldc2だとできないが、dmdと同じ引数でldc2を使えるようにしたldmd2だとうまくいく。
ldcが有効な場合は${DMD}にはldmd2が、dmdが有効な場合には${DMD}にはdmdがセットされているので、これをうまく使う。 -
dub testで実行する場合、デフォルト(一番最初に定義した)のコンフィギュレーションが使用されないようなので、-c=defaultのように指定してやる - 今回はテストが1つなので
.travis.ymlに直接script: dub run ....と記載することもできる、複数のコンフィギュレーション(-c=defaultの引数を変えて)テストする場合は.travis.shなど、スクリプト化するのが良い。
Badgeを付ける
README.md
[](https://travis-ci.com/shoo/gendoc)
http://travis-ci.com/<GitHubアカウント名>/<リポジトリ名>.svg でSVG画像が得られますので、それをREADME.mdなどで画像表示させましょう。