CircleCi2.0が最高かもしれん
ローカルの環境を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で別のところでやってもいいかもしれない。 それも考えてみよう。