ローカルで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
workflows:
version: 2
nightly:
triggers:
- schedule:
cron: "0 0 * * *"
filters:
branches:
only:
- master
jobs:
- coverage
最新版のライブラリで動き続けるかのチェックを行って、失敗した際にslackに通知するとか仕込んでおけば、脆弱性への対策になるかもしれない(まだやっていない...