はじめてのCircleCI

##CircleCIとは

[CircleCI](https://circleci.jp/)は、クラウド型のCIツールです。

求人をみていると、多くの名だたる日本企業がCircleCIを採用していたので、触ってみる事にしました。ちなみに私はJenkinsしか触ったことないCircleCI初心者です。

##使ってみた
早速ホームページ見てみます。[CircleCI Japan](https://circleci.jp/)は最近(2018/11)設立されたのですね。
先ほどクラウド型と書いたのですが、オンプレ型も対応しているようです。

###ユーザー登録
ホームページ下の方に"CircleCIを使ってみる"ボタンがあるのでポチすると、ユーザー登録画面に遷移します。
GitHubアカウントでログインし、CircleCIと連携させます。
<img width="391" alt="スクリーンショット 2018-12-01 11.25.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/337b2fde-b244-249c-d596-5055b5daf5fa.png">

わーい、ユーザー登録してGithub連携できました。

###Getting Started
まずCirCleCI上にプロジェクトをつくるために、"Add Project"を選択します。
Githubに[プロジェクト](https://github.com/uguisuhohokekyo/helloWorldGOGO/tree/first_circleci)を作成して、"Set up Project"を選択します。(コードは[こちら](https://twinbird-htn.hatenablog.com/entry/2016/03/31/190439)を参考にさせていただきました)

<img width="1577" alt="スクリーンショット 2018-12-01 12.59.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/0a48dea4-009a-548b-a628-5cb15669c455.png">

```treeコマンド
$tree
.
└── cmd
    ├── hello
    │   ├── hello.go
    │   └── hello_test.go
    └── main.go
```

```cmd/hello/hello.go
package hello

func English() string {
    return "Hello, world"
}

func Japanese() string {
    return "Hello, world"      /* <- ここがバグ */
    return "こんにちは、世界"
}

func Chinese() string {
    return "你好,是世界"
}
```
```cmd/hello/hello_test.go
package hello

import (
    "testing"
)

func TestGreeting(t *testing.T) {
    if Japanese() != "こんにちは、世界" {
        t.Errorf("Excepted %s, But %s.", "こんにちは、世界", Japanese())
    }
    if Chinese() != "你好,是世界" {
        t.Errorf("Excepted %s, But %s.", "你好,是世界", Chinese())
    }
    if English() != "Hello, world" {
        t.Errorf("Excepted %s, But %s.", "Hello, world", English())
    }
}
```

###Set up Project
config.ymlをプロジェクトに配置します。書かれてある通りに、
1. .circleci/config.ymlを作成
2. sample.ymlの値をコピー
3. アップデート
4. GitにPush
5. ビルド！
すればOKです。

###config.ymlの設定
config.ymlの設定をします。
ここでは最低限だけ設定しますので、詳細は[GOのドキュメント](https://circleci.com/docs/2.0/language-go/)や[Goのデモ](https://github.com/CircleCI-Public/circleci-demo-go/blob/master/.circleci/config.yml)をご参照ください。

```config.yml
##circleciのバージョン
version: 2
##ジョブ定義
jobs:
  ##自動的に実行されるジョブ。必須。                              
  build:
    ##dockerがタスクの実行環境                        
    docker:
      ##dockerイメージ
      - image: circleci/golang:1.9

    ##ステップが実行されるディレクトリ
    working_directory: /go/src/github.com/uguisuhohokekyo/helloWorldGOGO

    ##実行単位ステップを記述していく
    steps:

      ##working_directoryにチェックアウト
      - checkout
      - run: go test -v ./cmd/hello/
```

### start building
それではリモートレポジトリにconfig.ymlをpushしたのち、"start building"を実行してみます。

<img width="1279" alt="スクリーンショット 2018-12-01 14.15.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/cb29ef2c-e494-85e2-b60c-6abeebd38a58.png">

Jobが実行され、エラーが表示されました。エラーですよというメールまで飛んできましたね。
<img width="1583" alt="スクリーンショット 2018-12-01 15.42.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/eace750b-03d9-ec73-1bf5-2ab508bd8e17.png">

エラーの内容を見てみると、"こんにちは、世界"と表示されるべきところが、"Hello, world"となっていますね。
cmd/hello/hello.goを修正して(エラー部分をコメントアウトすればOK)、pushしてみましょう。

###Success!!
Git pushをトリガーに自動的にJobが実行されました。
そして結果を見てみると、、、わーい成功しました＼(^o^)／
<img width="500" alt="スクリーンショット 2018-12-01 15.50.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/0ed7243c-b8b3-c0a3-3108-3dbc3c561c71.png">
(私は色々試行錯誤して20回目でやっと成功、、、)
<img width="1564" alt="スクリーンショット 2018-12-01 16.06.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/cb2d6224-a5a5-80f3-c5ce-0dd2d659e7f4.png">

###まとめ
Github上のソースコード変更から、テストまでを簡単に自動化できました。
UIも綺麗ですし、何より自動化すると気持ちがすっきりして気持ちいいですね。
日本語対応もされると勝手に思っていますので、これからが楽しみです。

再掲ですが、今回使用したコードは[Github](https://github.com/uguisuhohokekyo/helloWorldGOGO/tree/first_circleci)上に公開していますので、必要だったら使ってください。