CircleCIのジョブをローカルPC上で実行する

CircleCIのジョブの動作を毎回ウェブ上のCircleCIで確認していたのですが、ローカルPCでジョブを実行したり、バリデーションできることがわかったのでメモします。

CircleCI CLIのインストール

Circle CLI はCircleCIをローカルPCで実行できるコマンドラインインターフェースです。 ここを参考にインストール します。

ディレクトリ構成

次の構成でいろいろ試してみます。

.
└── .circleci
    └── config.yml

config.yml

version: 2
jobs:
  build:
    docker:
      - image: circleci/golang:1.14
    steps:
      - run:
          name: Check Go version
          command: go version
      - run:
          name: Check GOPATH
          command: |
            go env GOPATH
            go env GOROOT

構文チェック

ジョブ定義をバリデーションできます。

# コンフィグファイルのバリデーション
circleci config validate

# ↓出力結果
Config file at .circleci/config.yml is valid.

# ↓エラーの例
Error: Unable to parse YAML
while scanning a simple key
 in 'string', line 8, column 7:
          -run
          ^
could not find expected ':'
 in 'string', line 9, column 1:

バリデーションで全てのエラーを検出できるわけではないので、vimなどのエディターと合わせてチェックしつつ、最終的にはWebのCircleCIやローカル上で動作確認することになるかと思います。

ジョブの実行

ローカルPCでジョブを実行してみます。

# ローカルPCでジョブを実行
circleci local execute

# ↓出力結果
...省略
  CIRCLE_WORKING_DIRECTORY=~/project

The redacted variables listed above will be masked in run step output.====>> go version
  #!/bin/bash -eo pipefail
go version
go version go1.14 linux/amd64
Success!

Macだと下記のようなエラーが出たりするかもしれません。

Docker image digest: sha256:c4143f9042c7d5aee8ee03bd5ce1d414e9a4bbacfc89742c4b5410e170858106
docker: Error response from daemon: Mounts denied:
The path /Users/hogehoge/.circleci
is not shared from OS X and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.
See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.
.
ERRO[0000] error waiting for container: context canceled

↑これは指定のディレクトリのマウントが拒否されたときに発生するエラーです。dockerのファイル共有の設定で、該当のディレクトリを追加すれば解決します。

制約

ローカルPCでジョブを実行できるのは便利ですが、下記のような制限があります。

  • Workflowが使えない
  • キャッシュが使えない
  • オンラインコマンドが使えない
  • Web版で設定した環境変数が使えない

環境変数を使いたい場合は、 -e オプションをつけてexecuteコマンドを実行します。

# config.yml内の環境変数$HOGEを指定する場合
circleci local execute -e HOGE=hogehoge

ローカルPCでのcheckoutの動作について

CircleCIには checkout というジョブ定義があり、これを使うと現在のgitリポジトリのコードを取得することができます。

Web版だとGitHubのリポジトリから取得しますが、ローカルで実行した場合はローカルにあるリポジトリから取得します。

まとめ

CircleCIなかなかいいですね。CIツールはJenkinsにGCPのCloud Build、AWS CodeBuild、Azure Pipeline、GitHub Actionsとかいろいろあって戦国時代な雰囲気なので、今後どうなるのか要注目ですね。