あすたぴのブログ

astap(あすたぴ)のブログ

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

circleci.com

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で別のところでやってもいいかもしれない。 それも考えてみよう。