emahiro/b.log

日々の勉強の記録とか育児の記録とか。

CircleCIの高速化ログ

Overview

circleci でのビルド時間の高速化をやったので、その備忘録です。

方針

circleci の高速化 = ビルド時間の短縮になるんですが、そんなことしたことなかったのでまず何をするかを考えました。
circleci の中でやってることは基本的には、手動で叩いてるコマンド群を設定することで自動でゴリゴリタスクを回してる、というだけです。
そのため、このタスクの実行時間を短縮することがそのまま circleci のビルド時間の短縮に繋がります。

やったこと

cacheを使う

npm install した結果の node_modules や パッケージ管理ツールで取得した中身をキャッシュして、キャッシュが存在する場合は、パッケージのインストールプロセスをスキップするようにしました。

circleci.com

steps:
      - restore_cache:
         keys: cache-yarn-{{ package.json }} // key名は適当
      - run:
          name: install node_modules
          command: |
            if [ ! -e node_modules ]; then
              yarn install // node_modulesがなければ yarn install が走る。cacheを解凍してすでにあれば走らない。
            fi
      - save_cache:
         key: cache-yarn-{{ package.json }}
         path: 
           - ./workingDir/node_modules

なんだかんだこれが一番効果がありました。npm にしろ yarn にしろ1分近くかかっていたのでcacheするだけで丸々1分削除できたのは大きかったです。

unittestを高速化する

普段 gae/go で開発をしているので、GitHub - favclip/testerator: test accelerator for appengine/go を使って appengine を使ったテストを高速化しました。
なぜ高速化できるのかについては以前のエントリでも記載しました。

ema-hiro.hatenablog.com

詳しくは testerator - GoDoc にある通りですが、インスタンスの残機が1つ以上残ってるケースではインスタンスを完全に落とさないので、起動が早くなります。 TestMain をうまく使いながら常に残機が1以上残ってるようにテストを組み立てると恩恵が大きいです。

fmtかけるファイルを減らす

gofmt などの format や lintツールを使ってる場合 vendor ディレクトリを検査対象から外すことで多少速くなります。

まとめ

circleci のビルド時間短縮なんてやったことなかったですが、案外やり始めると楽しかったです。
少しでも他の開発者の人が待ち時間少なくなると嬉しいなと思いました。