CircleCI 2.0を使い始める前に知っておきたいこと

# ローカルでCircleCIのデバックを行う
前提: Dockerが入っているローカル環境

```bash:circleci-cliのインストール
$ curl -o /usr/local/bin/circleci https://circle-downloads.s3.amazonaws.com/releases/build_agent_wrapper/circleci && chmod +x /usr/local/bin/circleci
```

```bash:yamlのシンタックスチェック
$ circleci config validate -c .circleci/config.yml
```

```bash:CircleCiのビルド
$ circleci build

# エラーはこんな感じで見れる
+ tar -xz -C /tmp -f /tmp/docker-17.03.0-ce.tgz
+ sudo mv /tmp/docker/completion /tmp/docker/docker /tmp/docker/docker-containerd /tmp/docker/docker-containerd-ctr /tmp/docker/docker-containerd-shim /tmp/docker/docker-init /tmp/docker/docker-proxy /tmp/docker/docker-runc /tmp/docker/dockerd /usr/bin
====>> Install Docker Compose
  #!/bin/bash -eo pipefail
set -x
sudo curl -L https://github.com/docker/compose/releases/download/1.11.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

++ uname -s
++ uname -m
+ sudo curl -L https://github.com/docker/compose/releases/download/1.11.2/docker-compose-Linux-x86_64
/bin/bash: line 1: /usr/local/bin/docker-compose: Permission denied
Error: Exited with code 1
Step failed
Task failed

```

# Dockerのキャッシュ
コンテナ起動までの時短

```bash:stepにsetup_remote_dockerを追加する際にキャッシュ指定をする
steps:
  - checkout
  - setup_remote_docker:
      docker_layer_caching: true
```
有料版のみ使える機能なので注意が必要

# 秘密鍵とHostの設定
ハマったので

## 秘密鍵
CircleCIのGUI経由で秘密鍵を保存し、finger printをコピーしておく
秘密鍵を使いたいstepの手前で以下のように呼び出せる

```bash
- add_ssh_keys:
  fingerprints:
      - "2b:d9:9d:c0:5f:96:3c:5e:de:b9:d3:7b:25:19:ce:12"
```
## Host
調べた感じHostの記載があるconfigファイルをgit管理して追記するくらいしか見つからなかった

```
- checkout
- run:
  name: Install dependencies
  command: |
    cat ./.circleci/ssh.config >> $HOME/.ssh/config
    git submodule update --init
    composer install
```

# 共通部分をまとめる
`jobs`で定義するのではなく`references`で定義を行い`jobs`で呼び出すことで共通するコードをまとめることができて可読性UP

## 環境の共通化
defaultsで環境の共通化ができる

```bash:宣言
references:
  defaults: &test
    docker:
    - image: asia.gcr.io/${GOOGLE_PROJECT_ID}/${IMAGE_NAME}:latest
      auth:
        username: _json_key
        password: $GCLOUD_SERVICE_KEY
    - image: mysql:5.6
      environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=db
```

```bash:呼び出し
jobs:
  test:
    <<: *test
    steps:
      - checkout
      - run: phpunit --no-coverage --testdox
  coverage:
    <<: *test
    steps:
      - checkout
      - run: phpunit --testdox
```

## コマンドの共通化
`commands`でsteps内で使用するコマンドの共通化ができる

```bash:宣言
references:
  commands:
    setup_test_db: &setup_test_db
      name: Setup test DB
      command: |
        apt-get update && apt-get install -y mysql-server
        mysql -u root -h 0.0.0.0 -proot -e "create database db_test"
```

```bash:呼び出し
jobs:
  test:
    <<: *test
    steps:
      - checkout
      - run: *setup_test_db
      - run: phpunit --no-coverage --testdox
```

# 定期的にCI
https://circleci.com/docs/2.0/workflows/#nightly-example

```
workflows:
  version: 2
  nightly:
    triggers:
      - schedule:
          cron: "0 0 * * *"
          filters:
            branches:
              only:
              - master
    jobs:
      - coverage
```

最新版のライブラリで動き続けるかのチェックを行って、失敗した際にslackに通知するとか仕込んでおけば、脆弱性への対策になるかもしれない（まだやっていない...

# 参考資料
- https://circleci.com/docs/2.0/configuration-reference/
- https://circleci.com/docs/2.0/workflows/#nightly-example
- https://circleci.com/docs/2.0/local-jobs/#installing-the-cli-locally