Help us understand the problem. What is going on with this article?

D言語+Travis-CIでテスト自動化する話②

概要

D言語でもTravis-CIやCircle-CIをはじめとする各種CIサービスでテスト・デプロイが可能です。
今回はTravis-CIを用いてテストを自動化するテンプレを紹介します。
過去記事とは別の方法でテスト設定を記述します。
ちなみにビルドにはdubを使う前提です。

  1. D言語+Travis-CIでテスト自動化する話➀
  2. D言語+Travis-CIでテスト自動化する話② ← この記事
  3. D言語+Travis-CIでリリースのデプロイ自動化する話
  4. D言語+Travis-CIでドキュメントのデプロイ自動化する話

.travis.yml のテンプレ

.travis.yml
language: d

script: ./.travis.sh
sudo: false

jobs:
  include:
    # =============================== Test Stage ===============================
    - stage: test
      d: ldc
      os: linux
      env: TEST_TARGET_ARCH=x86_64
    - d: ldc-latest-ci
      os: linux
      env: TEST_TARGET_ARCH=x86_64
    - d: dmd
      os: linux
      env: TEST_TARGET_ARCH=x86_64
    - d: dmd-nightly
      os: linux
      env: TEST_TARGET_ARCH=x86_64
    - d: ldc
      os: linux
      env: TEST_TARGET_ARCH=x86
      addons:
        apt:
          packages:
            - gcc-multilib
    - d: dmd
      os: linux
      env: TEST_TARGET_ARCH=x86
      addons:
        apt:
          packages:
            - gcc-multilib
    - d: ldc
      os: osx
      env: TEST_TARGET_ARCH=x86_64
    - d: dmd
      os: osx
      env: TEST_TARGET_ARCH=x86_64
stages:
  - name: test
    if: type = pull_request or (type = push and branch = master)

解説

上記設定で以下の組み合わせでリポジトリのルートに .travis.yml を配置することで、以下のように初期設定が行われた状態で .travis.sh が呼び出されます。

OS 環境変数  コンパイラ 備考
Linux TEST_TARGET_ARCH=x86_64 ldc2(最新)
Linux TEST_TARGET_ARCH=x86_64 ldc2(latest-ci)
Linux TEST_TARGET_ARCH=x86_64 dmd(最新)
Linux TEST_TARGET_ARCH=x86_64 dmd(nightly)
Linux TEST_TARGET_ARCH=x86 ldc2(最新)
Linux TEST_TARGET_ARCH=x86 dmd(最新)
OSX TEST_TARGET_ARCH=x86_64 ldc2(最新)
OSX TEST_TARGET_ARCH=x86_64 dmd(最新)

ポイントは以下:

  • language: d
  • testステージにすべてのテストの条件を記載する。必要な箇所で必要なことをピンポイントで書けるので無駄がない(必要ないのにgcc-multilibに依存したりしない)
  • stage: testがない要素は、直前のstage名が引き継がれる
  • d:dmd-2.085.1 などのバージョンを指定できる(古いバージョンでもコンパイルできることを保証したい場合)
  • OSXではx86向けにコンパイルできないので、前回はexcludeしていたけれど、今回は書かないだけでOK
  • X86向けにクロスコンパイルするために gcc-multilib が必要
  • if: type = pull_request or (type = push and branch = master) そのままの意。
  • Linux, OSXではldc2とdmdの最新でコンパイルでき、かつ、念のため今後おかしくならないかの確認のためにnightly, latest-ciでもx86_64でテスト…で、計8つの条件。

.travis.sh のテンプレ1

.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}

解説1

ポイントは以下:

  • .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を付ける

CI Status
↑みたいなバッヂを付ける場合

README.md
[![CI Status](https://travis-ci.com/shoo/gendoc.svg)](https://travis-ci.com/shoo/gendoc)

http://travis-ci.com/<GitHubアカウント名>/<リポジトリ名>.svg でSVG画像が得られますので、それをREADME.mdなどで画像表示させましょう。


  1. 前回記事と同じ 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした