kakakakakku blog

Weekly Tech Blog: Keep on Learning!

CircleCI 2.0 の「ワークフロー機能」を学べる公式デモ用リポジトリ circleci-demo-workflows

前回の記事に続き,CircleCI 2.0 の調査をしている.今回は CircleCI から公式に提供されている「ワークフローデモ用リポジトリ」を活用して,CircleCI 2.0 の新機能である「ワークフロー機能」の仕組みと,設定ファイルのポイントを学んだ.「ワークフローデモ用リポジトリ」では,以下の4種類(+1種類)のデモがある.

  • Parallel Jobs
  • Sequential Job / Branch-Level
  • Fan-in / Fan-out
  • Workspace Forwarding
  • Schedule

github.com

Parallel Jobs

CircleCI 2.0 の「ワークフロー機能」では,複数のジョブを並列に実行することができる(デフォルトで並列に実行される).デモでは,3種類の異なる Ruby バージョンで並列にテストを実行しているため,CI の実行時間を短縮することができる.CI の実行時間が伸びるとツライため,並列に実行できるのは素晴らしい!

workflows:
  version: 2
  build:
    jobs:
      - "ruby-2.2"
      - "ruby-2.3"
      - "ruby-2.4"

f:id:kakku22:20180322024726p:plain

Sequential Job

並列に実行できるのは素晴らしいけど,意図的に直列に実行したいという場合も多くある.そんなときは requires を使う.デモでは build ジョブを実行した後に deploy ジョブを実行するようになっている.また,ジョブに対して実行するブランチを制限する filters も使われていて,参考になる.

workflows:
  version: 2
  build-and-deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build
          filters:
            branches:
              only: sequential-branch-filter

さらに,デモでは .circleci/setup-heroku.sh が用意されていて config.yml から以下のように呼び出されている.このあたりのテクニックは CircleCI 1.0 と同じだけど,できる限り config.yml の設定を薄く維持するというのは今後も意識したいと思う.

jobs:
  (中略)
  deploy:
    (中略)
    steps:
      - checkout
      - run:
          name: Setup Heroku
          command: bash .circleci/setup-heroku.sh

f:id:kakku22:20180322024740p:plain

Fan-in / Fan-out

Fan-in と Fan-out は,一言で言えば「集約」のことで,ジョブパイプラインのようにジョブを直列に実行したり,並列に実行したり,複数のジョブの完了を待機することができる.ただし,これは既に紹介した requires を使うだけで,専用の機能があるわけではなかった.設定ファイルだけだと読みにくいけど,ワークフロー図を見れば,意図した通りに構成できているかはすぐにわかる.

workflows:
  version: 2
  build-and-deploy:
    jobs:
      - checkout_code
      - bundle_dependencies:
          requires:
            - checkout_code
      - rake_test:
          requires:
            - bundle_dependencies
      - precompile_assets:
          requires:
            - bundle_dependencies
      - deploy:
          requires:
            - rake_test
            - precompile_assets

f:id:kakku22:20180322024756p:plain

Workspace Forwarding

CircleCI 2.0 の「ワークフロー機能」では,ジョブごとに独立したコンテナで実行されるため,一時ファイルなどを共有する場合,ジョブで作成したファイルをワークフローのワークスペースに保存し,他のジョブでマウントする必要がある.この機能は非常に便利だし,逆に知らないとワークフローの設定で苦労しそう.

設定としては2種類あり,まず attach_workspace でワークフローのワークスペースをコンテナにマウントすることができる.次に persist_to_workspace でワークフローのワークスペースにファイルを永続化する.なお,ワークフローのワークスペースにあるファイルを削除することはできず,あくまで追加だけとなる.また,CircleCI を使うなら,以下の3種類のデータの違いを理解しておく必要があるとドキュメントに書いてあった.

  • Artifacts
  • Workspaces
  • Caches

circleci.com

version: 2.0

jobs:
  bundle_dependencies:
    docker:
      - image: circleci/ruby:2.4-node
      - image: circleci/postgres:9.4.12-alpine
    working_directory: ~/circleci-demo-workflows
    steps:
      - checkout
      - attach_workspace:
          at: ~/circleci-demo-workflows
      - restore_cache:
          keys:
            - v1-bundle-{{ checksum "Gemfile.lock" }}
      - run: bundle install --path vendor/bundle
      - save_cache:
          key: v1-bundle-{{ checksum "Gemfile.lock" }}
          paths:
            - ~/circleci-demo-workflows/vendor/bundle
      - persist_to_workspace:
          root: .
          paths: vendor/bundle

  rake_test:
    docker:
      - image: circleci/ruby:2.4-node
      - image: circleci/postgres:9.4.12-alpine
    working_directory: ~/circleci-demo-workflows
    steps:
      - checkout
      - attach_workspace:
          at: ~/circleci-demo-workflows
      - run: bundle --path vendor/bundle
      - run: bundle exec rake db:create db:schema:load
      - run:
          name: Run tests
          command: bundle exec rake
(中略)

f:id:kakku22:20180322024901p:plain

Schedule

GitHub の README.md には書かれていなかったけど,ブランチ一覧を見てみたところ「スケジュール実行」のデモも用意されていた.CircleCI 2.0 では schedule で cron 形式のジョブ実行ができる.よって,全ての git push に hook するのではなく,深夜に1回実行するジョブ(例えば)を作ることができる.この機能を知らない人が結構いる気がして,知っておくと CI の幅が広がるのでオススメ!

workflows:
  version: 2
  commit-workflow:
    jobs:
      - build 
  scheduled-workflow:
    triggers:
      - schedule:
          cron: "0 1 * * *"
          filters:
            branches:
              only: try-schedule-workflow

f:id:kakku22:20180322024914p:plain

関連記事

CircleCI 1.0 の設定ファイルを CircleCI 2.0 にマイグレーションをする「config-translation API」の紹介を前に書いた.

kakakakakku.hatenablog.com