始めまして、サーバエンジニアの山脇です。
サーバアプリケーションのテストと開発環境へのデプロイをCircleCIに任せているのですが、最近CircleCIが2.0リリースされたのでどんなことができるのか試してみたのでその内容を書きたいと思います。
1.0と2.0の比較
まず1.0から2.0に変わった点として設定ファイルの配置場所が変わりました。
1.0ではリポジトリ直下の circle.yml
に設定ファイルを配置していましたが、2.0ではリポジトリ直下から .circleci/config.yml
に設定ファイルを配置するようになりました。
以下で1.0と2.0でそれぞれテストをして動かし、masterブランチの場合デプロイする例(実行するコマンドはただのechoです)を記述してみました。
1.0の書き方
machine: python: version: 3.4.2 test: override: - echo test deployment: deploy: branch: master commands: - echo deploy
1.0ではmachineのsetupやtest、deploymentなどをそれぞれ書くようになっていました。
実行順はあらかじめ決められており、上の場合だとmachine -> test -> deploymentの順に実行されていきます。
2.0の書き方
version: 2 jobs: build: docker: - image: python:3.4.2 steps: - checkout test: docker: - image: python:3.4.2 steps: - checkout - run: echo test deploy: machine: True steps: - run: echo deploy workflows: version: 2 build_and_test: jobs: - build - test: requires: - build - deploy: requires: - test filters: branches: only: master
2.0では自分たちでjobsで実行するタスクを定義して、workflowsでその実行順を定義するようになりました。
実際にCircleCIを使っていた際にdeployなどで「このコマンドは何をしているんだ?」という状態に陥ったことが何度もあるのでjobごとにやることを分けるのはすごくありがたいと感じています。
2.0の設定できること
① jobsで定義するjobはmachineとdockerがあります。machineの場合VMに、dockerはdockerのコンテナに必要な環境を構築してstepsの内容を実行します。
dockerを利用した場合にCircleCIのCLIでローカルマシンでの確認もできるようなので便利です。
② workflowsのjobsで実行するjobを呼びます。ここで定義されているjobが実行されるものになります。
(jobsに定義されていないjobを呼ぼうとするともちろんエラーになります。)
version: 2 jobs: build: docker: # ① - image: python:3.4.2 steps: - checkout - run: echo build test1: docker: - image: python:3.4.2 steps: - checkout - run: python --version test2: docker: - image: python:2.7.13 steps: - checkout - run: python --version deploy: machine: True # ① steps: - run: echo deploy workflows: version: 2 build_and_test: jobs: # ② - build - test1 - test2 - deploy
③ jobsで実行順番を指定したい場合はrequiresにどのjobが終了したらこのjobを実行するかを定義できます。
複数のjobが終了した時に動作されたい場合はリストにjobを追加(④ )するだけです。
workflows: version: 2 build_and_test: jobs: - build - test1 requires: # ③ - build - test2 requires: # ③ - build - deploy requires: # ④ - test1 - test2
②と③、④のように実行順を指定すると左側に実行順が早いものがきます。
実行順を指定しない場合
実行順を指定した場合
⑤ 特定のブランチだけで動作させたい場合はfiltersを追加います。
特定のブランチ以外を実行したい場合はonly
をignore
に変更すれば指定したブランチ以外で実行が可能です。
ブランチの正規表現を使いたい場合は/
でくくって内部で正規表現がかけます。(これは1.0と同じです)
workflows: version: 2 build_and_test: jobs: - build - test1: requires: - build - test2: requires: - build - deploy: requires: - test1 - test2 filters: # ⑤ branches: only: master
↓ブランチを指定した状態で別ブランチをプッシュした場合deployのjobはスキップされます。
⑥ jobの実行前に「approve」しないと次のタスクを実行しないこともできます。
workflows: version: 2 build_and_test: jobs: - build - test1: requires: - build - test2: type: approval # ⑥ requires: - build - deploy: requires: - test1 - test2 filters: branches: only: master
approve待ちの状態(ユーザがapproveを押すまで待機します)
まとめ
jobとworkflowsを自分で設定できるようになったので必要な機能単位で設定しやすくなった。
実行順を変更しやすいため、ちょっとした入れ替えが簡単になった。
作業前にチェックしたいjobにはapprovalをいれる。
他にもできることはたくさんあるので公式のドキュメントを確認してみてください。
https://circleci.com/docs/2.0/