🐳

Github Actionsでdocker composeのlayer cacheを使って実行時間を約3分短縮

2023/03/07に公開

背景

  • Github ActionsでCIを回しています。
  • 昔にセットアップしたプロジェクトでGithub Actionsのcache機能が使われていませんでした。

アプローチ

  • いろいろな設定方法がありますがコード量が多くてきれいじゃないです。
  • docker compose を利用しているのでdockerのbuild cacheを流用できたら楽だなぁと思ってました。
  • CircleCIではDocker レイヤーキャッシュ (DLC) によってbuild cacheが保管されるのですがGithub Actionsではこれに対応する機能がありません。
  • 今回見つけたactionsでは、Github ActionsのCache機能を使ってDLCをエミュレートしてくれるような動きをしてくれます。

設定

差分はこれだけです。
この追加したactionの中でキャッシュストレージへの保存と読み込みをやってくれます。


jobs:
  rspec:
    runs-on: ubuntu-latest
    timeout-minutes: 30
    env:
      TZ: Asia/Tokyo
      RAILS_ENV: test
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive
+      - uses: docker/setup-buildx-action@v2
+      - uses: docker/build-push-action@v4
+        with:
+          context: .
+          cache-from: type=gha
+          cache-to: type=gha,mode=max
      - name: Setup docker
        shell: bash
        run: |
          docker compose -f docker-compose.ci.yml build --progress=plain
          docker compose -f docker-compose.ci.yml pull -q

上記の設定を入れた上で、Github ActionsでCIを回してみた結果です。

実行

ActionsのCachesには以下のように保存されています。

ベンチマーク

CI全体で2分47秒が短縮されました。
実行時間比率で言えば、19.8%短縮しました。

実行時間の内訳

3分29秒かかっていたbuildが42秒で終わるようになっています。

初回実行

cacheからロードして実行

考察

  • docker buildにタグ付けしてロードしたりキャッシュしたりするようなロジックを書いているケースに対しても、今回紹介した設定に置き換えるだけで同等の効果があると思います。
  • 今までは、キャッシュの操作を手動で書いていたのが、dockerの中間キャッシュに完全に任せられるので楽になると思います。
  • Dockerの中間キャッシュを使うロジックを理解した上で使う必要があります。
  • 今回はrspec用のテストの紹介ですが、ECSにdeployするときのimageを作る際にも使えると思います。

まとめ

  • Github ActionsのCacheを使って、docker composeのbuild時に使用するlayer cacheを有効利用するようにしました。
  • 実行時間が3分近く短縮しました。
株式会社マインディア テックブログ

Discussion