Edited at

.circleci/config.yml を書き始めるときは circleci コマンドを使うと効率が上がる

CircleCI 2.0 の .circleci/config.yml を書き始めるときは circleci コマンドを使うと効率が上がります。


TL;DR


  • CircleCI 1.0 で使えた Test Commands は CircleCI 2.0 では使えない

  • その代わりに CircleCI 2.0 では circleci コマンドが用意されている


  • circleci コマンドを使うと .circleci/config.yml をローカルの Docker でテストできるので、わざわざ commit して push する手間が省ける


Test Commands は CircleCI 2.0 では使えない

CicleCI の各プロジェクトの設定画面には Test Commands という項目があります。

CircleCI の Test Commands

ここに書いたコマンドは設定ファイルをオーバーライドするので、追加したいコマンドをここで試してから circle.yml に反映させるとスムーズに検証できました。ですが、"These settings are only for 1.0 builds" とあるように CircleCI 2.0 では使えません。


CircleCI 2.0 では circleci コマンドを使う

CircleCI 2.0 では circleci コマンドが用意されました。

CircleCI 2.0 は Docker で実行されるようになりました。この circleci コマンドを使うとローカルの Docker 上で YAML ファイルの validate や build を行うことができます。


circleci コマンドを試してみる

ここから先の作業は Docker が起動した状態で行ってください。私は Docker for Mac を使っています。

$ docker version

Client:
Version: 18.01.0-ce
API version: 1.35
Go version: go1.9.2
Git commit: 03596f5
Built: Wed Jan 10 20:05:58 2018
OS/Arch: darwin/amd64
Experimental: false
Orchestrator: swarm

Server:
Engine:
Version: 18.01.0-ce
API version: 1.35 (minimum version 1.12)
Go version: go1.9.2
Git commit: 03596f5
Built: Wed Jan 10 20:13:12 2018
OS/Arch: linux/amd64
Experimental: true

CLI のインストールはワンライナーです。

$ curl -o /usr/local/bin/circleci https://circle-downloads.s3.amazonaws.com/releases/build_agent_wrapper/circleci && chmod +x /usr/local/bin/circleci


$ which circleci
/usr/local/bin/circleci

今回は "Hello world!" を出力するだけのシンプルな設定で試します。

$ cat .circleci/config.yml

version: 2
jobs:
build:
docker:
- image: circleci/golang:1.9.2
working_directory: /go/src/github.com/{{ORG_NAME}}/{{REPO_NAME}}
steps:
- checkout
- run: echo 'Hello world!'

正しい YAML か確認するために validate してみます。

$ circleci config validate -c .circleci/config.yml


config file is valid

問題なさそうなので実際に build してみます。ローカルの Docker で実行されるので CircleCI の課金時間にはカウントされません。

$ circleci build


====>> Spin up Environment
Build-agent version 0.0.4658-97f1922 (2018-01-21T16:00:57+0000)
Starting container circleci/golang:1.9.2
image cache not found on this host, downloading circleci/golang:1.9.2
1.9.2: Pulling from circleci/golang

(snip)

Status: Downloaded newer image for circleci/golang:1.9.2
using image circleci/golang@sha256:c28d4147c954859fe5ac3721897b24740ab9e29b58cb914fe94847799e14a0ed

Using build environment variables:
BASH_ENV=/tmp/.bash_env-localbuild-1516776030
CI=true
CIRCLECI=true
CIRCLE_BRANCH=master
CIRCLE_BUILD_NUM=
CIRCLE_JOB=build
CIRCLE_NODE_INDEX=0
CIRCLE_NODE_TOTAL=1
CIRCLE_REPOSITORY_URL=git@github.com:manabusakai/aws-billing.git
CIRCLE_SHA1=f5b80899bb00d2bf7acd627c79456dfe4860cc03
CIRCLE_SHELL_ENV=/tmp/.bash_env-localbuild-1516776030
CIRCLE_WORKING_DIRECTORY=/go/src/github.com/{{ORG_NAME}}/{{REPO_NAME}}

====>> Checkout code
#!/bin/sh
mkdir -p /go/src/github.com/{{ORG_NAME}}/{{REPO_NAME}} && cp -r /tmp/_circleci_local_build_repo/. /go/src/github.com/{{ORG_NAME}}/{{REPO_NAME}}
====>> echo 'Hello world!'
#!/bin/bash -eo pipefail
echo 'Hello world!'
Hello world!
Success!


注意点

circleci コマンドではワークフローの機能は使えません。また、いくつか制限もあるので検証やデバッグ以外には使えません。


まとめ

circleci コマンドを使うとローカルで .circleci/config.yml の検証ができるので、わざわざ commit して push するのに比べて格段に効率が上がります。

この機能を教えてくれた同僚の @mumoshu さんに感謝! :clap: