自分で作ったサービスのCIが未だにCircleCI 1系だったので重い腰を上げて2系にマイグレーションしました。
マイグレーションしたと言ってもカスタマイズらしいカスタマイズもしていなかったのでほとんど0から設定の作り直しです。とりあえず最低限テストを行える状態までこぎつけたので、備忘録がてら残しておこうと思います
操作する環境
環境は以下のような感じ
名前 | バージョン |
---|---|
Ruby | 2.5.1 |
Rails | 5.2 |
MySQL | 5.7 |
.circleci/config.yml
.circleci/config.ymlは以下
version: 2.1 executors: default: docker: - image: circleci/ruby:2.5.1 environment: BUNDLE_JOBS: 3 BUNDLE_RETRY: 3 BUNDLE_PATH: vendor/bundle RAILS_ENV: test DB_USERNAME: root DB_HOST: 127.0.0.1 - image: mysql:5.7 environment: MYSQL_USER: root MYSQL_ALLOW_EMPTY_PASSWORD: yes working_directory: ~/app jobs: checkout_code: executor: default steps: - checkout - save_cache: key: app-code-{{ .Environment.CIRCLE_SHA1 }} paths: ~/app bundle_install: executor: default steps: - restore_cache: key: app-code-{{ .Environment.CIRCLE_SHA1 }} - restore_cache: key: app-gems-{{ checksum "Gemfile.lock" }} - run: bundle install - save_cache: key: app-gems-{{ checksum "Gemfile.lock" }} paths: - vendor/bundle test_rspec: executor: default steps: - restore_cache: key: app-code-{{ .Environment.CIRCLE_SHA1 }} - restore_cache: key: app-gems-{{ checksum "Gemfile.lock" }} - run: name: Database setup command: | bundle exec rails db:create db:schema:load db:migrate - run: bundle exec rspec spec/ workflows: version: 2 test: jobs: - checkout_code - bundle_install: requires: - checkout_code - test_rspec: requires: - bundle_install
せっかくなので2.1基準で作りました。
executors
executors
は2.1で新しく入ったキーです。ジョブで共通で使用する実行環境に名前をつけることが出来ます。今回の例では default
という名前の実行環境を定義しています。
executors: default: docker: - image: circleci/ruby:2.5.1 environment: BUNDLE_JOBS: 3 BUNDLE_RETRY: 3 BUNDLE_PATH: vendor/bundle RAILS_ENV: test DB_USERNAME: root DB_HOST: 127.0.0.1 - image: mysql:5.7 environment: MYSQL_USER: root MYSQL_ALLOW_EMPTY_PASSWORD: yes working_directory: ~/app
default
という名前の後に docker
キーで設定を書きます。ここの書き方は今まで jobs
で設定していたように image
と environment
が書けます。
jobs
jobs
はジョブを定義するキーです。 jobs
のあとに続くマップで名前を定義し、中で実行環境と実行の手順を書いていきます。
jobs: checkout_code: executor: default steps: - checkout - save_cache: key: app-code-{{ .Environment.CIRCLE_SHA1 }} paths: ~/app bundle_install: executor: default steps: - restore_cache: key: app-code-{{ .Environment.CIRCLE_SHA1 }} - restore_cache: key: app-gems-{{ checksum "Gemfile.lock" }} - run: bundle install - save_cache: key: app-gems-{{ checksum "Gemfile.lock" }} paths: - vendor/bundle
executor
では executors
で定義した実行環境の名前を指定します。 steps
では実行するタスクを run
で書いていきます。
save_cache
は key
で指定した名前で path
で指定したディレクトリをキャッシュします。 restore_cache
は save_cached
でキャッシュした内容をリストアします。依存するパッケージなどをキャッシュすることで、外部からのダウンロードの時間を省きCIを早くすることが出来ます。
workflows
workflows
はジョブをまとめて実行順を制御しCIを行うための設定を書きます。
workflows: version: 2 test: jobs: - checkout_code - bundle_install: requires: - checkout_code - test_rspec: requires: - bundle_install
ここでは test
という名前のワークフローを定義し、中の jobs
で定義したジョブを呼び出しています。各ジョブ間の依存も書くことが出来 requires
で依存するジョブの名前を書きます。
参考書籍
CircleCIについての書籍はあまりないのですが、このあいだ出たWEB+DB PRESSの最新号がまさにCircleCI特集で、これを見て今回のCI環境を整えました。しばらくは唯一日本語でまとまったCircleCIの資料になると思います。
- 作者: 大竹智也,浦井誠人,平野朋也,村田紘司,上野学,末永恭正,久保田祐史,吉川竜太,上野博司,牧大輔,西郡卓矢,桑原仁雄,小林謙太,竹馬光太郎,池田拓司,はまちや2,竹原,長谷川智希,北村壮大,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2018/10/24
- メディア: 単行本
- この商品を含むブログ (1件) を見る
まとめ
CircleCI設定を書いていきました。今後やりたいこととしてはCircleCI上でDockerのコンテナをビルドしECRにデプロイするところまでをやってみたいと考えています。