くりにっき

フルスタックキュアエンジニアです

CircleCI 2.1 previewのcommandsが便利だった

https://github.com/CircleCI-Public/config-preview-sdk を見てたら commands が便利そうだったのでためしに個人プロダクトに入れてみた。

github.com

準備

Advanced Settingsの「Enable build processing (preview)」で有効にしないと使えないので注意

f:id:sue445:20180930092753p:plain

Before (CircleCI 2.0)

Ruby製のアプリのCIを構築してると

  • restore_cache でbundle installのキャッシュをリストア
  • bundle install
  • save_cache でキャッシュを保存

というのが頻出すぎてリファクタリングしたかった。

実際に使ってた設定を抜粋したのが下記です。

version: 2

save_bundle_cache_option: &save_bundle_cache_option
  key: v2-bundle-{{ checksum "Gemfile.lock" }}
  paths:
    - ~/app/vendor/bundle

restore_bundle_cache_option: &restore_bundle_cache_option
  keys:
    - v2-bundle-{{ checksum "Gemfile.lock" }}
    - v2-bundle

jobs:
  rspec:
    <<: *default

    steps:
      - checkout
      - restore_cache:
          <<: *restore_bundle_cache_option
      - run: ./.circleci/setup_bundle.sh
      - save_cache:
          <<: *save_bundle_cache_option
      - run: ./.circleci/setup_database.sh

      - run: bundle exec rspec
      - run: bundle exec codeclimate-test-reporter

https://github.com/sue445/chatwork_mention_task/blob/bd6d7ec65d4bc0a8e38d55e082e740539737e538/.circleci/config.yml

rspec以外にrubocopとかの実行でもbundle installが必要なのでDRYにするためにrestore_cachesave_cache のオプションを抽出したり、bundle installの処理をsetup_bundle.sh に抽出しています。

#!/bin/bash -xe

bundle install --jobs=4 --retry=3 --path vendor/bundle
bundle clean

# Resolve bundler version difference between Gemfile.lock and pre-installed in CI
gem install restore_bundled_with --no-document
restore-bundled-with

https://github.com/sue445/chatwork_mention_task/blob/bd6d7ec65d4bc0a8e38d55e082e740539737e538/.circleci/setup_bundle.sh

After (CircleCI 2.1 preview)

restore_cache , bundle install, save_cache の組み合わせを setup_bundle というcommandとして抽出できたので再利用しやすくなりました。

version: 2.1

commands:
  setup_bundle:
    description: "Setup bundle with cache"
    steps:
      - restore_cache:
          keys:
          - v2-bundle-{{ checksum "Gemfile.lock" }}
          - v2-bundle
      - run:
          name: Setup bundle
          command: |
            set -xe
            bundle install --jobs=4 --retry=3 --path vendor/bundle
            bundle clean

            # Resolve bundler version difference between Gemfile.lock and pre-installed in CI
            gem install restore_bundled_with --no-document
            restore-bundled-with

      - save_cache:
          key: v2-bundle-{{ checksum "Gemfile.lock" }}
          paths:
          - ~/app/vendor/bundle

jobs:
  rspec:
    <<: *default

    steps:
      - checkout
      - setup_bundle
      - run: ./.circleci/setup_database.sh

      - run: bundle exec rspec
      - run: bundle exec codeclimate-test-reporter

https://github.com/sue445/chatwork_mention_task/blob/654e5137002bd611f44674d2e69b8ae1b4d31102/.circleci/config.yml

bundle install系の処理が1つになったことでBeforeにあったsave_bundle_cache_optionsetup_bundle.sh にような工夫が不要になったのが嬉しい

所感

今回はcommandsしか使ってないですが他の機能を利用することでリファクタリングの余地が増えそう。

まだpreviewで色々変更ありそうなので個人プロダクト全部には投入しづらいけど、正式版になったら上のような修正を全部に入れたい。

作業PR

https://github.com/sue445/chatwork_mention_task/pull/184/files