ローカルの環境をdockerで整えたので、次はCI環境を整備する。 dockerで構築したのだから、テストもdockerにしたい。 ちょうどCircleCi2.0がBetaテスト中で、さらにネイティブでdockerサポートが入っている。 これは試すしかないということでやってみた。
CricleCi2.0を使う
プロジェクトのホームディレクトリに .circleci ディレクトリを作成。 config.yml を作成する
config.yml の中身
version: 2
jobs:
build:
working_directory: ~/app
docker:
- image: hogehoge/mogemoge:latest
steps:
- checkout
- run: echo "hello world"
これでCircleCiを通すだけの準備は完了する。
imageはDockerHubのpublicディレクトリであれば普通に取ってこれる。privateリポは別途設定が必要。
config.yml の設定は、try & error で直して、pushして、CircleCI流して〜ってやるとかなり消耗する。
複雑なテストをやろうとすると死ねる。
CircleCi2.0ではローカルでほぼ同様のことが可能になっている。 (docker executorのみ使える。従来のCircleCiの主流であったmachine executorは使えない)
circleci コマンド
install
vagrant-ubuntu-trusty-64% sudo curl -o /usr/local/bin/circleci https://circle-downloads.s3.amazonaws.com/releases/build_agent_wrapper/circleci && sudo chmod +x /usr/local/bin/circleci
usage はこんな感じ
vagrant-ubuntu-trusty-64% circleci
Receiving latest version of circleci...
The CLI tool to be used in CircleCI.
Usage:
circleci [flags]
circleci [command]
Available Commands:
build run a full build locally
config validate and update configuration files
tests collect and split files with tests
version output version info
Flags:
-c, --config string config file (default is .circleci/config.yml)
--taskId string TaskID
--verbose emit verbose logging output
config fileのvalidate
vagrant-ubuntu-trusty-64% circleci config validate config file is valid
buildのhelp
vagrant-ubuntu-trusty-64% circleci build --help
run a full build locally
Usage:
circleci build [flags]
Flags:
--branch string Git branch
--checkout-key string Git Checkout key (default "~/.ssh/id_rsa")
--config string config file (default ".circleci/config.yml")
--index int node index of parallelism
--job string job to be executed (default "build")
--parallelism int parallelism level (default 1)
--repo-url string Git Url
--revision string Git Revision
--skip-checkout use local path as-is (default true)
-v, --volume value Volume bind-mounting (default [])
Global Flags:
--taskId string TaskID
--verbose emit verbose logging output
circleci build をふつうに叩いたらふつうに落ちた。
どうやら working_directroyが相対パスだとダメらしい。最初のymlで相対パスで設定させといてそれ?w
working_directory: /app に変更して通った。
最終的なかたち
version: 2
jobs:
build:
working_directory: /app
docker:
- image: docker image name
environment:
RACK_ENV: 'test'
- image: mysql:5.7.17
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
MYSQL_ROOT_HOST: '%'
steps:
- checkout
- run: bundle install
- run: bundle exec rails db:create
- run: bundle exec rails db:migrate
- run: bundle exec rspec
- deploy:
name: run deploy
command: |
if [ "${CIRCLE_BRANCH}" == "master" ]; then
apk add curl
curl --user ${CIRCLE_API_TOKEN}: \
--data build_parameters[CIRCLE_JOB]=deploy \
--data revision=$CIRCLE_SHA1 \
https://circleci.com/api/v1.1/project/github/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/tree/$CIRCLE_BRANCH \
>> /dev/null
fi
deploy:
working_directory: /app
docker:
- image: docker image name
environment:
RACK_ENV: 'production'
steps:
- checkout
- run: bundle install
- setup_remote_docker
- deploy:
name: deploy
command: echo 'hello'
docker-composeのように、imageがリンクされるわけではないので 127.0.0.01 でアクセスが出来るようにする必要があった。MYSQL_ROOT_HOST: '%'
config/database.yml にはこんな感じにかく host: <%= ENV['DB_HOST'] || ENV['MYSQL_ROOT_HOST'] || '127.0.0.1' %>
以下のサポートを参照した。 https://discuss.circleci.com/t/rails-mysql-container-connection/10604
deploy
こちらを参考にさせていただきました。 http://h3poteto.hatenablog.com/entry/2017/03/31/231410
別ジョブで実行するという方式。 残念ながら別ジョブはCLIコマンドではテストが出来ないので、 pushして try & error になってしまった。 ハックだし、いずれより良い形で公式にサポートがされるだろう。 現時点では docker executorでdeployするimageをbuildするいい方法がないかもしれない。
deployタスクは1.0のときのように、デフォルトで branchで別けれるようにしてほしかった。
【追記】 公式ドキュメントに増えた?昨日はなかった気がするのにw
This approach is a temporary workaround for the current features available during Beta. Soon we’ll be adding a much more elegant way to manage multiple jobs.
より良い方法をそのうち公開するっていってるのでよかったね
まとめ
deploy抜きで考えるならば、テスト、構築ともに速くなって非常にいいと思った。 そもそもここでdeploy用のimageをbuildするという方式も違うのかもしれない。 testが通ったwebhookで別のところでやってもいいかもしれない。 それも考えてみよう。