Travis CIで自動テストして、結果をGitHubのトップページに表示する

# 概要

こちらの記事の「[Git Hub のトップページに、テストに合格した証のTravis CI バッチを貼り付けてる(任意)](https://qiita.com/TsutomuNakamura/items/f943e0490d509f128ae2#git-hub-%E3%81%AE%E3%83%88%E3%83%83%E3%83%97%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AB%E3%83%86%E3%82%B9%E3%83%88%E3%81%AB%E5%90%88%E6%A0%BC%E3%81%97%E3%81%9F%E8%A8%BC%E3%81%AEtravis-ci-%E3%83%90%E3%83%83%E3%83%81%E3%82%92%E8%B2%BC%E3%82%8A%E4%BB%98%E3%81%91%E3%81%A6%E3%82%8B%E4%BB%BB%E6%84%8F)」を参考にしてやってみたよ、という記事。

当方の記事「Node.jsの[npmでパッケージを公開してみた手順の記録](https://qiita.com/hoshimado/items/c6f1484297d974f44f19)」で作った、npmライブラリのGitHubリポジトリに対して、自動テストのバッチを貼り付けてみた。

公式の「To Get started with Travis CI」に従ってやってみたら、設定ミスでテストしたというプチ罠の記載を含む。

全体手順は、以下の通り。

1. GitHubのアカウントでTravis CIにサインインする。
2. 自動テスト（ビルド）したいリポジトリにチェックを付ける（設定をOnにする）。
3. リポジトリ側に、設定ファイル「 `.travis.yml` 」を作成してコミットする。

より詳しくは、以下の公式ドキュメントのGetting Startedを参照のこと。

* https://docs.travis-ci.com/user/getting-started#To-get-started-with-Travis-CI


# Travis CIアカウント作成と対象のGitHubリポジトリを紐付け

先ずは、Travis CI 側にアカウント作成してCI環境を準備する。

## Travis CIのアカウント作成

Githubアカウントで、Travis CIにOAuthログインする。
具合的には以下の手順。

1. Travis CIのサイトにアクセスする。
  * https://travis-ci.org/
2. 「Sign up」ボタンを押す。
  * 2回目以降は、右上にある「sign in with GitHub」から入る。
3. GitHubのOAuthログインを要求されるので、GitHubアカウントのユーザー名とパスワードで許可する。

![スクリーンショット 2018-07-13 06.05.09-2.png](https://qiita-image-store.s3.amazonaws.com/0/125588/181cb20e-e73f-cfd2-6f4e-289060a89771.png)

![スクリーンショット 2018-07-13 06.05.32.png](https://qiita-image-store.s3.amazonaws.com/0/125588/bfc080d8-4239-e6da-6482-ac249eab8415.png)

これだけで、Travis CIサービスを利用できるようになる。以下の画面が表示されれば、Travis CIのアカウント作成は成功。

![スクリーンショット 2018-07-13 06.05.43.png](https://qiita-image-store.s3.amazonaws.com/0/125588/3b08bf3e-17b7-aa28-9d3d-7c71da8df4ea.png)



## Travis CIでの自動テスト実行対象のリポジトリを選ぶ。

右上にある自分のアイコン（GitHubアカウントのアイコンと名前が表示されている）をクリックすると、以下のプロファイルページが表示される。

![スクリーンショット 2018-07-13 06.06.14.png](https://qiita-image-store.s3.amazonaws.com/0/125588/d2d07a3c-0698-4f0b-97de-77e9b0917a14.png)


自分のGitHubにあるリポジトリが並んでいるので、「ボタン」をクリックして以下のように「チェック」状態にする。

![スクリーンショット 2018-07-13 06.09.16.png](https://qiita-image-store.s3.amazonaws.com/0/125588/8055fb44-640f-f162-4ec1-ec123b033217.png)

「チェック」したリポジトリは、デフォルトで以下の条件の時に「自動テスト」が走るようになっている。

* プッシュされた時
* プルリクエストがあった時

「チェック」の横の「Setting」を押すと以下のように設定画面が出るが、今はデフォルトのままでOK。

![スクリーンショット 2018-07-20 23.54.43.png](https://qiita-image-store.s3.amazonaws.com/0/125588/293da7e4-757c-9939-2e3f-c69b9093aac1.png)

これで、Travis CI側の設定は完了。


# リポジトリ側に travis.yml を追加して自動テストの対象にする

https://travis-ci.org/ にアクセスしてGitHubアカウントでログインすると、
以下のように表示されており「実行すべき対象リポジトリが無い」と言われる。

![スクリーンショット 2018-07-13 06.22.16.png](https://qiita-image-store.s3.amazonaws.com/0/125588/90826bd8-9d43-9e1f-aa35-d0d4dbe33b62.png)

これは、自動テストを受ける側であるリポジトリ側の設定が不足しているため。
Travis CIは、「 `.travis.yaml` 」ファイルが置かれたリポジトリに対してのみアクションを行うので、以下ではこのファイルを作成する。

## テストするプログラミング言語と環境（バージョン）を選ぶ

Node.js環境でのtravis.yml の書き方は、公式ドキュメントの以下のページに記載されているので
これに従って記述する。

https://travis-ci.org/
＞Help＞Read Our Docs
＞Getting Started
＞Selecting a different programming language
＞full list
＞JavaScript (with Node.js)
https://docs.travis-ci.com/user/languages/javascript-with-nodejs/

サンプルとして、以下が記載されている。

```yml:.travis.yml
language: node_js
node_js:
  - "iojs"
  - "7"
```

が、これをそのまま入れたら私の場合はテストが以下のように「失敗」した。

![スクリーンショット 2018-07-13 06.23.11.png](https://qiita-image-store.s3.amazonaws.com/0/125588/6f22ac38-17a0-fccb-bc0b-d0afef9fc9b8.png)

「失敗」と表示されている行（マウスオーバーすると、以下のように色が変わる）をクリックする。すると、以下のようにエラーログが表示される。

![スクリーンショット 2018-07-13 06.24.49.png](https://qiita-image-store.s3.amazonaws.com/0/125588/06188ba8-5333-09d8-5328-6733db40a818.png)

ログから、失敗の理由は当方のコード（が利用しているライブラリ）が「io.js」には未対応のため、と判明。よくよく先ほどのドキュメントを読み返すと以下の記載があった。

> node latest stable Node.js release
> iojs latest stable io.js release
> lts/* latest LTS Node.js release

当方はio.jsは対象外なので、以下のように記述した。

```yml:.travis.yml
language: node_js
node_js:
  - "node"
  - "8"
  - "7"
  - "6"
```

この状態で、GitHubにコミット＆プッシュすると、以下のように再びTravis-CIによる自動テストが走りる。こんどは成功した！

![スクリーンショット 2018-07-13 06.27.11.png](https://qiita-image-store.s3.amazonaws.com/0/125588/809baefe-e90a-653c-f6dc-cd679b5ff3df.png)

（↑テスト実行中。しばらくすると結果↓が表示される）

![スクリーンショット 2018-07-13 06.28.00.png](https://qiita-image-store.s3.amazonaws.com/0/125588/d77987f8-d4ca-e3fb-d90d-959ca4f2f7ae.png)


## Travis-CIでテストを実行するリポジトリを限定する。

ところで、今の設定ではmaster以外のブランチへのプッシュでもテストが走ってしまう。
たとえばテストだけコーディングして実装は未だ、という状態でプッシュした開発用のブランチに対してもテストが走ってしまい、当然「失敗」と表示される。
これを避けるには、travis.yml に対して「safelist」で**実行するブランチを限定**すればよい。
例えば「masterブランチのみに限定してテストの自動実行を行う」のであれば、以下の記述となる。

```yml:.travis.yml
language: node_js
node_js:
  - "node"
  - "8"
  - "7"
  - "6"

# safelist
branches:
  only:
  - master
```

限定の仕方（「～だけ」、「～を除く」の双方が可能）の詳細は公式ドキュメントの以下を参照。
https://docs.travis-ci.com/user/customizing-the-build#Building-Specific-Branches


上記の設定ファイルをリポジトリ（masterもdevelopもその他のリポジトリも**区別なくすべて**）に格納しておく。この状態でコミットしてプッシュすると、masterブランチに対するプッシュにだけ、Travis CIは反応してテストの実行を行ってくれるようになる。

# 最後、Travis-CIでのテスト結果のバッチを貼り付ける

この操作は、手順として参考にしたこちらの記事「[Git Hub のトップページに、テストに合格した証のTravis CI バッチを貼り付けてる(任意)](https://qiita.com/TsutomuNakamura/items/f943e0490d509f128ae2#git-hub-%E3%81%AE%E3%83%88%E3%83%83%E3%83%97%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AB%E3%83%86%E3%82%B9%E3%83%88%E3%81%AB%E5%90%88%E6%A0%BC%E3%81%97%E3%81%9F%E8%A8%BC%E3%81%AEtravis-ci-%E3%83%90%E3%83%83%E3%83%81%E3%82%92%E8%B2%BC%E3%82%8A%E4%BB%98%E3%81%91%E3%81%A6%E3%82%8B%E4%BB%BB%E6%84%8F)」に記載の通り、Travis-CIのテスト実行結果のページから記述をコピペして貼り付けるだけ。

テスト実行結果のページの以下の部分をクリックする。表示が「unknown」で問題ない（反映が遅れてるだけ）。
![スクリーンショット 2018-07-13 06.28.00-2.png](https://qiita-image-store.s3.amazonaws.com/0/125588/deb4a166-0575-17bf-f941-2549603e2b8b.png)

クリックするとダイアログが出るので、「Markdown」を選択する。
![スクリーンショット 2018-07-24 17.27.42.png](https://qiita-image-store.s3.amazonaws.com/0/125588/947d54c6-77af-708a-9d37-f4f7c862f01b.png)

下部のテキストエリアに表示された
> [![build ～

のテキストをコピーして、README.mdの1行目、見出し「#～」に続けて貼り付ければOKー。
例えば、以下のように貼り付ける。

```md
# hook-test-helper [![Build Status](https://travis-ci.org/hoshimado/hook-test-helper.svg?branch=master)](https://travis-ci.org/hoshimado/hook-test-helper)
```

すると、こちらのページのように表示される。
https://github.com/hoshimado/hook-test-helper

以上ー。

# やってみた感想

最初は、「masterへのPull **Request前にローカルでテストがpassさせる**のだから、CIによる自動でのテスト実行なんぞ不要では？」とか思ってた。

だけど、たぶんこれ「人間はミスる。うっかりテスト実行後に**ソース修正してそのままコミット＆プッシュ**してしまった（箇所がデグレードしてた）、とか」を防ぐためなんだろうなー、と思い直した。


# 参考サイト

初めてのnpm パッケージ公開
https://qiita.com/TsutomuNakamura/items/f943e0490d509f128ae2

Travis CI User Documentation
https://docs.travis-ci.com/