paranitips

Never stop learning! がモットーのゆるふわエンジニアブログ

アセットの変更がない場合、assets:precompileをスキップすることでCIの速度を改善した

f:id:paranishian:20181120150741p:plain

assets:precompileに毎回1分ほどかかっていたので嬉しい速度改善 😋

以下の記事を参考にさせていただきました 🙏
CircleCI 2.0に移行して新機能を活用したらCIの実行時間が半分になった話 - クラウドワークス エンジニアブログ

仕組みとしては、precompile対象のアセットの変更をgitのrevisionを使ってチェックして、変更があればprecompile、なければスキップする、という流れです。

自分のプロジェクトではwebpacker + react-railsを使ってるので以下を考慮しました。

  • compile対象のディレクトリ(app/javascript)の変更もチェックする
  • compile後のassets(public/packs-test)もキャッシュする

.circleci/config.yml

...
    steps:

      ...

      # precompile対象のassetsのgitのrevisionをkeyにする
      - run:
          name: create key for cashing assets
          command: |
            git rev-parse $(git log --oneline -n 1 app/assets lib/assets vendor/assets Gemfile.lock app/javascript | awk '{{print $1}}') > VERSION

      - restore_cache:
          keys:
            - asset-cache-{{ arch }}-{{ .Branch }}-{{ checksum "VERSION" }}
            - asset-cache-{{ arch }}-{{ .Branch }}
            - asset-cache

      # assetsのrevisionが変わってなければキャッシュから使う。変わっていればprecompile
      - run:
          name: assets:precompile
          command: |
            current_revision=VERSION
            previous_revision=public/assets/VERSION

            if [ ! -e $previous_revision ] || ! diff $previous_revision $current_revision; then
              bundle exec rake assets:precompile
              cp -f $current_revision $previous_revision
            else
              echo "Skipped."
            fi

      - save_cache:
          key: asset-cache-{{ arch }}-{{ .Branch }}-{{ checksum "VERSION" }}
          paths:
            - public/assets
            - public/packs-test
            - tmp/cache/assets/sprockets

どんどん改善していくでー 💪

参考