CircleCI
CircleCI2.0

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

ローカルでCircleCIのデバックを行う

前提: Dockerが入っているローカル環境

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
yamlのシンタックスチェック
$ circleci config validate -c .circleci/config.yml
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のキャッシュ

コンテナ起動までの時短

stepにsetup_remote_dockerを追加する際にキャッシュ指定をする
steps:
  - checkout
  - setup_remote_docker:
      docker_layer_caching: true

有料版のみ使える機能なので注意が必要

秘密鍵とHostの設定

ハマったので

秘密鍵

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

- 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で環境の共通化ができる

宣言
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
呼び出し
jobs:
  test:
    <<: *test
    steps:
      - checkout
      - run: phpunit --no-coverage --testdox
  coverage:
    <<: *test
    steps:
      - checkout
      - run: phpunit --testdox

コマンドの共通化

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

宣言
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"
呼び出し
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に通知するとか仕込んでおけば、脆弱性への対策になるかもしれない(まだやっていない...

参考資料