Blog

複数コンテナを使う CI のビルド時間を短縮したい

この記事は、ニフティグループ Advent Calendar 2025 19日目の記事です。

はじめに

おはようございます。IWS です

2025年アドベントカレンダーも19日目の記事です。
19日目のこの記事では、 GitHub Actions を使った CI について書こうかなと思います。

GitHub Actions での CI

私のチームでは以下のような構成のコンテナ環境を使用しています。

apl コンテナを中心に複数のコンテナを使う構成で開発しています。テスト実行には各コンテナが必要なため、これまで GitHub Actions で CI を組んでもビルドを含めて10分以上かかるような状態でした。

何かあって CI を回すたびに10分待たなければいけないというのはかなりのストレスなため少しでも早くできるように試していきたいと思います。

イメージの準備

テスト実行にコンテナのDB等が必要な都合、GitHub Actions 上でもビルドが必要になります。CI にかかる時間の半分はビルドにかかった時間です。

今回は必要なコンテナが4つあり、すべてをビルドするのはかなりの時間がかかるため少しでも CI 実行時間を抑えられるようにしていきます。

GHCR にあらかじめイメージを保存しておく

もしほとんど変更がなく都度ビルドする必要がないような場合は GHCR (GitHub Container Registry) にイメージをあらかじめ保存しておくことで CI 時のビルドを省くことができます。GHCR は GitHub が提供している コンテナレジストリです。


以下のコマンドでイメージを push することができます。

GHCR ではストレージや pull, push などのデータ転送の無料枠を超えた分の利用については課金が必要になるのですが、GitHub Actions からの利用に関しては Free としてカウントされるため課金を気にせず使用ができます。(データ転送のみ、詳しくは https://docs.github.com/ja/billing/concepts/product-billing/github-packages

 Push ができると GitHub の Packages からイメージの一覧を見ることができます。

 

WF からは↓のようにすればイメージを pull できます。ログインの action を呼びだし docker pull コマンドをするだけです。

 

複数ビルドするときは matrix で並列にビルド

WF 上で複数イメージのビルドが必要な場合は matrix を使い並列にビルドすることで WF の実行時間を抑えることができます。

 

GitHub Actions では job ごとに別のランナーで処理されるため、通常 job A でビルドしたイメージを job B で使用することはできません。そのため GHCR などに一度イメージを保存して job B で pull するといった方法が必要になる……

と思っていたのですが「同じ key, 同じ path のキャッシュを使うことでファイルの共有をする」という方法があるそうでこちらの記事を参考にやってみました。

【裏技】別ファイルに切り出した Job 間で Docker イメージを共有し,高速に GitHub Actions をぶん回す

のようにすることで

  1. 並列にイメージをビルド
  2. tar としてイメージをキャッシュに保存
  3. 後続の job で tar からイメージを復元

し、コンテナ起動時に作成されたイメージを使うことができました。

キャッシュも保存されるため2回目移行はさらに早くなるのも good ポイントですね。

テスト実行

おまけのようなものですが、WF 上でどうテストを実行しているかも書いておきます。

コンテナ起動〜テストコマンド実行には @devcontainers/cli を使用しました。
devcontainer up で立ち上げ、 devcontainer exec でコマンドの実行が行えます。

 

lint に失敗した際も test の実行をしてもらいたいため lint の step に continue-on-error: true を追加しています。エラーを無視して後続 step を実行する設定です。ただし、このままだと lint 失敗時も job が成功となってしまうため if lint failed step で落とすようにしています。

まとめ

ビルドしつつもかかる時間を抑えて CI を実装する話を書いてみました。

ちなみに現在は CI に約5分程度かかっています。最初の頃の10分↑と比べれば半分以下にはなったのですがやはりまだ長いなとは感じるので他にも短縮要素がないか試してみようと思います!

明日は namiki_ さんのアドベントカレンダー20日目です!おたのしみに!

 

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!