WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

CircleCI 2.0の正式版がリリースされたので試してみた

始めまして、サーバエンジニアの山脇です。
サーバアプリケーションのテストと開発環境へのデプロイを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

②と③、④のように実行順を指定すると左側に実行順が早いものがきます。
実行順を指定しない場合 f:id:YHiroyuki:20170725162240p:plain 実行順を指定した場合 f:id:YHiroyuki:20170725162328p:plain

⑤ 特定のブランチだけで動作させたい場合はfiltersを追加います。
特定のブランチ以外を実行したい場合はonlyignoreに変更すれば指定したブランチ以外で実行が可能です。
ブランチの正規表現を使いたい場合は/でくくって内部で正規表現がかけます。(これは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はスキップされます。 f:id:YHiroyuki:20170725162917p:plain ⑥ 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を押すまで待機します) f:id:YHiroyuki:20170725160809p:plain

まとめ
jobとworkflowsを自分で設定できるようになったので必要な機能単位で設定しやすくなった。
実行順を変更しやすいため、ちょっとした入れ替えが簡単になった。
作業前にチェックしたいjobにはapprovalをいれる。

他にもできることはたくさんあるので公式のドキュメントを確認してみてください。
https://circleci.com/docs/2.0/