kenju's blog

About Programming, Mathematics, Security and Blockchain

Circle CI 2.0 Betaに移行した知見メモ

2.0 から大きく変わったこと

  • ビルドイメージ&ミドルウェアのDocker化
    • ベースのビルドイメージも自由に選べるようになった
  • キャッシュやアーティファクトの保存などジョブの定義を自分で細かく書く必要がでてきた
    • 逆に言うと、柔軟なジョブ定義ができるとも言える
  • 後は細かな文法や設定ファイルの配置場所が変更。詳細は↓

用語

Primary Container

config.yml で一番最初の行に書いたImageから動作したコンテナのこと。

例えば

docker:
  - image: ruby:2.3.1
  - image: postgres:9.6.2

のように書くと、image: ruby:2.3.1 のコンテナの中でジョブが実行される。

ローカルビルド

https://circleci.com/docs/2.0/local-jobs/

circleci コマンドを使ってローカルでビルド実行することを指します。具体的には circleci --config .circleci/config.yml build のようにコマンドを実行する。

ただし、後述する通り Remote Docker 機能が使えないので、その場合はローカルビルドできない。

ローカルビルドするためには、似たようなコンテナ群をDockerfiledocker-compose.yml に定義してローカルで走らせ、Remote Docker を使わないローカルビルド用の .circleci/config.local.yml を用いてビルドする、みたいな方法で実行していた。

Remote Docker

https://circleci.com/docs/2.0/glossary/#remote-docker

Circle CIのコンテキストの中で、更にDockerを立ち上げる機能のこと。具体的には、

  • docker コマンドを手動でインストールし
  • Docker Imageなりdocker-compose.ymlなりでコンテナを立ち上げる

ということをしている。例えば

  • ビルド内で docker コマンドを使いたい
    • ex) Docker Hubへの登録が必要 docker publish
    • ex) 同じレポジトリで管理している Dockerfile を用いた docker build
    • ex) Private な Docker Image を使いたい
    • ex) docker-compose を使いたい

といった要件の場合に必要。

Executor

https://circleci.com/docs/2.0/executor-types/

  • docker(default)
  • machine

の二通り。

2017/4月中旬時点での注意点

  • Remote Docker 機能はローカルビルド&Executor Type = machine が使えない
  • Remote Docker機能で複数コンテナを立ち上げるのは非常に遅い
    • ローカルでは更に遅い
      • 例:Circle CI上で rake javascript:compile が10分以上
  • environment 句に書いた変数は、config.yml では展開されない
    • ので、キャッシュキーなどに ENVVARを使いたいが、一部ハードコードされている