Golang のプロダクトで Travis CI を使ってみる（初心者用） #golang


以前作った[Golang と Line Notify を利用して API の証明書期限切れチェック](https://qiita.com/ynozue/items/d00a76e16d5a3d5a784c)で Travis CI に対応して、git に push したタイミングで自動的に goimports / golint / go vet を実行できるようにする。

# Travis CI をセットアップ
## Travis CI
https://travis-ci.org

## 「Sign Up」ボタンをクリック
![スクリーンショット 2017-10-04 22.22.41.png](https://qiita-image-store.s3.amazonaws.com/0/203864/3d07f0b0-3305-32dc-d19b-c77babd813be.png "スクリーンショット 2017-10-04 22.22.41.png")

## 内容を確認し「Authorize travis-ci」ボタンをクリック
![スクリーンショット 2017-10-04 22.23.01.png](https://qiita-image-store.s3.amazonaws.com/0/203864/8fe14d4a-3fbb-1bf6-1ef1-011b17745237.png "スクリーンショット 2017-10-04 22.23.01.png")

## パスワードを入力
![スクリーンショット 2017-10-04 22.23.19.png](https://qiita-image-store.s3.amazonaws.com/0/203864/90e45ba7-3fe5-746a-9f6d-8f4ac4e0590a.png "スクリーンショット 2017-10-04 22.23.19.png")

## 連携完了
![スクリーンショット 2017-10-04 22.23.42.png](https://qiita-image-store.s3.amazonaws.com/0/203864/e88089a3-cfa1-ac76-0322-5f769919bf2b.png "スクリーンショット 2017-10-04 22.23.42.png")

## ダッシュボードでリポジトリが表示されていることを確認
※ 表示されない場合は「Sync account」ボタンをクリック
![スクリーンショット 2017-10-04 22.36.25.png](https://qiita-image-store.s3.amazonaws.com/0/203864/0f1d6488-2f74-0a29-7030-ec21d868aebc.png "スクリーンショット 2017-10-04 22.36.25.png")

## CI 対象のレポジトリにチェック
![スクリーンショット 2017-10-04 22.43.18.png](https://qiita-image-store.s3.amazonaws.com/0/203864/ea200562-9ac5-b2a9-5242-9f97f1762992.png "スクリーンショット 2017-10-04 22.43.18.png")


これで Travis CI の準備は完了

# Git に Travis CI の設定を行う
## プロジェクトのルートディレクトリに「.travis.yml」を作成

```.travis.yml
language: go
  
install:
 - go get -u golang.org/x/tools/cmd/goimports
 - go get -u github.com/golang/lint/golint

script:
 - go vet ./...
 - diff <(goimports -d .) <(printf "")
 - diff <(golint ./...) <(printf "")
```

## 追加したファイルを Git に push

```sh
$ git push origin master
```

## 結果を確認
エラーになっているので、原因を確認する
![Kobito.Ridolu.png](https://qiita-image-store.s3.amazonaws.com/0/203864/df9ce285-3866-fdba-b572-1c830aa34ced.png "Kobito.Ridolu.png")

## 実行結果を log で確認
```sh
$ diff <(goimports -d .) <(printf "")
1,29d0
< diff -u apichecker.go.orig apichecker.go
< --- apichecker.go.orig	2017-10-04 15:47:01.829005000 +0000
< +++ apichecker.go	2017-10-04 15:47:01.829005000 +0000
< @@ -1,13 +1,13 @@
<  package main
<  
<  import (
< -	"fmt"
< -	"net/http"
<  	"flag"
< +	"fmt"
< +	"io/ioutil"
<  	"log"
< +	"net/http"
<  	"net/url"
<  	"strings"
< -	"io/ioutil"
<  	"time"
<  )
<  
< @@ -37,7 +37,7 @@
<  		expire := "-"
<  		if len(resp.TLS.PeerCertificates) > 0 {
<  			expireUTCTime := resp.TLS.PeerCertificates[0].NotAfter
< -			expireJSTTime := expireUTCTime.In(time.FixedZone("Asia/Tokyo", 9 * 60 * 60))
< +			expireJSTTime := expireUTCTime.In(time.FixedZone("Asia/Tokyo", 9*60*60))
<  			expire = expireJSTTime.Format("06/01/02 15:04")
<  		}
<  		result = fmt.Sprintf("OK (expire=%s)\n%s", expire, endpoint)


The command "diff <(goimports -d .) <(printf "")" exited with 1.
```
goimports で diff が出ているのが原因なのが判明

## goimports を実行して Git に再度 Push
```sh
$ goimports -w .
```
![Kobito.tAK7ew.png](https://qiita-image-store.s3.amazonaws.com/0/203864/65bc7c18-051c-7296-55f2-114048ca511f.png "Kobito.tAK7ew.png")

goimports 以外も問題なく実行できていルことを確認
```sh
$ go vet ./...


The command "go vet ./..." exited with 0.
$ diff <(goimports -d .) <(printf "")


The command "diff <(goimports -d .) <(printf "")" exited with 0.
$ diff <(golint ./...) <(printf "")


The command "diff <(golint ./...) <(printf "")" exited with 0.
```
# おまけ（README.md に Travis CI の結果を表示）
## 「build:pass」ステータスアイコンをクリック
![Kobito.hCe2ew.png](https://qiita-image-store.s3.amazonaws.com/0/203864/c2d75e40-88b2-4df0-f732-7fd4b905e89d.png "Kobito.hCe2ew.png")

## 形式を Markdown に変更
![Kobito.zzHQD7.png](https://qiita-image-store.s3.amazonaws.com/0/203864/a3eacbda-773f-6286-f92f-cab0cb1c8a05.png "Kobito.zzHQD7.png")

## README.md に追記
![Kobito.7knI1I.png](https://qiita-image-store.s3.amazonaws.com/0/203864/0219d5b6-8eb2-af9e-647e-d8553691fc9c.png "Kobito.7knI1I.png")

# Appendix
* [ソースコード](https://github.com/ynozue/apichecker/tree/ci)