様々な CIツールの設定方法を試してみた

## 概要

CI の比較をする機会があり、各種設定ファイルを作って CI を回してみました。

(こんな感じです)
<img width="233" alt="ci.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63472/9c92c102-a77d-7572-048d-d3a9359be03e.png">


## 対象

- [CircleCI](https://circleci.com/)
- [Travis CI](https://travis-ci.org/)
- [AWS CodeBuild](https://aws.amazon.com/jp/codebuild/)
- [Azure Pipelines](https://azure.microsoft.com/en-us/services/devops/pipelines/)

## 環境

- GitHub の Public Repository
- Go の build/test

[gmidorii/ci-test](https://github.com/gmidorii/ci-test)

## 設定

### CircleCI

[ドキュメント](https://circleci.com/docs/?gclid=Cj0KCQjwjrvpBRC0ARIsAFrFuV_pcYyUUXWUNlaiQyXE6TqjO4LffMTRPcn5bs8a3CcDUn4SN6_C7pIaApusEALw_wcB)

#### 料金

実行コンテナ数ベースの月額料金  
https://circleci.com/pricing/

補足: β 版ではあるが従量課金制の導入もあり(https://circleci.com/pricing/usage/)

#### ビルドファイル

<details><summary>.circleci/config.yml</summary><div>

```yml
version: 2
jobs:
  build:
    docker:
      - image: circleci/golang:1.12
    working_directory: /tmp/app

    environment:
      TEST_RESULT: /tmp/test-results

    steps:
      - checkout
      - run: mkdir -p ${TEST_RESULT}
      - run:
          name: Unit Test
          command:
            PACKAGE_NAMES=$(go list ./... | circleci tests split --split-by=timings --timings-type=classname)
            gotestsum --junitfile ${TEST_RESULT}/gotessum-report.xml -- ${PACKAGE_NAMES}
      - run: make build
      - save_cache:
          key: go-mod-v4-{{ checksum "go.mod" }}
          paths:
            - "/go/pkg/mod"
      - store_artifacts:
          path: /tmp/test-results
          destination: raw-test-output
      - store_test_results:
          path: /tmp/test-results
workflows:
  version: 2
  build-workflow:
    jobs:
      - build
```

</div></details>

#### メリット

- サンプルの丁寧なビルドファイルが用意されている
  - https://github.com/CircleCI-Public
- Docker ベースで実行されている
- GitHub との連携がスムーズ
  - GitHub or Bitbucket アカウントで登録する
- OSS の場合は全 4 コンテナを利用可能

#### デメリット

- 1.0 -> 2.0 への移行が必要
- 1.0 系の記事が多く注意が必要

### Travis CI

[ドキュメント](https://docs.travis-ci.com/)

#### 料金

並行ジョブ数に応じた月額料金
https://travis-ci.com/plans

#### ビルドファイル

<details><summary>.travis.yml</summary><div>

```yml
matrix:
  include:
    - language: go
      go:
        - 1.11.x
        - 1.12.x
      script:
        - make test-cover
```

</div></details>

#### メリット

- OSS の場合は無料
- 複数のプログラムバージョンに対するテストの実施が簡単(matrix test)
- GitHub との連携がスムーズ

#### デメリット

- 最低価格が若干高め
  - \$129/month

### AWS CodeBuild

#### 料金

従量課金制
https://aws.amazon.com/jp/codebuild/pricing/

#### ビルドファイル

<details><summary>buildspec.yml</summary><div>

```yml
version: 0.2

phases:
  install:
    runtime-versions:
      golang: 1.12
    commands:
      - echo 'Entered install ...'
      - apt-get update -y
  build:
    commands:
      - echo 'Entered build ...'
      - make build
      - make test-cover

artifacts:
  files:
    - "./ci-test"
    - "./coverage.html"
  name: ci-test-$(date +%Y-%m-%d)
```

</div></details>

#### メリット

- 利用分の従量課金制
- Build 数に応じてスケーリングして実行可能
- GitHub からの WebHook を AWS コンソール上から設定できる

#### デメリット

- OSS の場合も同様に料金がかかる

### Azure Pipelines

#### 料金

ユーザー数ごとの月額料金制
https://azure.microsoft.com/en-us/pricing/details/devops/azure-devops-services/

#### ビルドファイル

<details><summary>azure-pipelines.yml</summary><div>

```yml
trigger:
  - master

variables:
  GOPATH: "$(system.defaultWorkingDirectory)/gopath"

stages:
  - stage: build
    jobs:
      - job: go
        pool:
          vmImage: "ubuntu-latest"
        steps:
          - script: |
              go build
            displayName: "go build"
          - script: |
              go test -v -cover -coverprofile=c.out
              go tool cover -html=c.out -o coverage.html
            displayName: "go test"

  - stage: deploy
    # exec only master branch
    condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/master'))
    jobs:
      - job: deploy
        pool:
          vmImage: "ubuntu-latest"
        steps:
          - script: |
              echo 'Deploy....'
            displayName: "deploy"
```

</div></details>

#### メリット

- OSS の場合は 10 hosts まで無料
- 異なるベースイメージで複数のジョブを同時に実行可能

#### デメリット

## 用途別の選択

(ここは主観が主です)

### OSS

1. Azure Pipelines
   ベースイメージを分けられるので、複数の環境があるリポジトリの場合に便利のため

2. TravisCI or Circle CI

### 有料利用

最終的に AWS 上のリソースを作成する場合
-> AWS CodeBuild
料金も安くアクセスキー等を AWS 外に出さなくても良いため

その他
-> Circle CI

## 参考

- [CI マニアから見た各種 CI ツールの使い所 - くりにっき](https://sue445.hatenablog.com/entry/2018/12/07/114638)