依存関係のキャッシュによる高速化
生成済みの依存関係やビルド成果物を再利用するキャッシュを実装し、ワークフローの実行を大幅に高速化します。
「依存関係のキャッシュによる高速化」はCoddyKit上の無料DevOps Bootcampレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDevOps Bootcamp学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 DevOps Bootcampコースには全4レッスンが含まれています。
キャッシュでワークフローを高速化
ワークフローを実行するたびに、同じ依存関係を再ダウンロードしていることに気づいたことはありませんか。処理が遅くなってしまいます。
GitHub Actions のキャッシュを使うと、前回の実行で使用したファイルを保存して再利用できます。これにより、以降のワークフロー実行を大幅に高速化できます。
Cache アクションの紹介
GitHub は actions/cache@v3 という専用のアクションを提供しています。このアクションは、ワークフローを高速化するためにファイルを保存、復元するよう設計されています。
このアクションは、復元を試みる前にキャッシュがすでに存在するか確認し、存在しない場合はキャッシュを保存するという賢い仕組みになっています。
キャッシュキーとパス
actions/cache で重要な2つのパラメーターは、key と path です。
key:キャッシュを識別する一意の文字列です。このキーのキャッシュが見つかると、復元されます。path:キャッシュするファイルのパスまたはディレクトリです。アクションで保存、復元する対象を指定します。
キーには依存関係ファイルのハッシュを含めることが多く、依存関係が変更されたときにキャッシュを無効化できます。
Node.js の依存関係をキャッシュする
Node.js プロジェクトの node_modules をキャッシュしてみましょう。hashFiles を使い、package-lock.json に基づく動的なキーを作成します。
次の簡単なワークフロースニペットを実行してみてください。
name: Node.js CI with Cache
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Cache Node.js modules
uses: actions/cache@v3
with:
path: node_modules
key: npm-${{ hashFiles('package-lock.json') }}
restore-keys: |
npm-
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm testRestore キーによるフォールバック
指定した key と一致するキャッシュがない場合はどうなるでしょうか。そのときに役立つのが restore-keys です。
restore-keys には、検索時に使うフォールバックキーのリストを指定します。プライマリキー(例:npm-${{ hashFiles(...) }})で見つからなかった場合、GitHub Actions は restore-keys を順番に使ってキャッシュを検索します。
この例では、npm- によって「npm-」で始まるキャッシュを探します。依存関係のバージョンが少しだけ変更された場合に便利です。
Python の依存関係をキャッシュする
キャッシュは Node.js 専用ではありません。Python など、ほかの言語にも同じ原則を適用できます。ここでは、Python の仮想環境と pip のキャッシュを保存します。
ここでのキーには hashFiles('requirements.txt') を使い、パスには仮想環境と pip のキャッシュディレクトリを指定します。
name: Python CI with Cache
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Cache Python dependencies
uses: actions/cache@v3
with:
path: |
~/.cache/pip
.venv
key: pip-${{ hashFiles('requirements.txt') }}
restore-keys: |
pip-
- name: Install dependencies
run: |
python -m venv .venv
.venv/bin/pip install -r requirements.txt
- name: Run tests
run: .venv/bin/python -m unittest discoverキャッシュを無効化するタイミング
キャッシュは、十分に新しい場合にのみ役立ちます。依存関係が変更されたら、キャッシュも更新する必要があります。
プライマリ key(例:npm-${{ hashFiles('package-lock.json') }})が変わると、キャッシュは自動的に無効化されます。package-lock.json が更新されるとハッシュが変わり、新しいキャッシュが作成されます。
キーを手動で変更して、キャッシュを再構築することもできます。たとえば、npm-v2-${{ hashFiles(...) }} のようにバージョンサフィックスを追加します。
キャッシュの範囲と制限
キャッシュが内部でどのように機能するかを知っておくとよいでしょう。
- 範囲:キャッシュはリポジトリごと、ブランチごとに管理されます。
mainブランチのキャッシュは、lookup-pathを明示的に設定しない限り、フィーチャーブランチでは使用されません。 - サイズ制限:各キャッシュの最大容量は 10GB です。
- 保持期間:キャッシュは最後にアクセスしてから7日間保持されます。古くて使用されていないキャッシュは自動的に削除されます。
効率的なキャッシュの実践方法
キャッシュを最大限に活用するには、次の点に注意してください。
hashFilesを使う:キャッシュキーは、依存関係マニフェストファイル(例:package-lock.json、requirements.txt)に必ず関連付けてください。pathを具体的に指定する:必要なものだけをキャッシュしてください(例:node_modules、~/.cache/pip)。restore-keysを使う:キャッシュヒット率を高めるため、フォールバックを指定してください。- 変動の多いデータをキャッシュしない:頻繁に変更されるファイルや、実行ごとに異なりサイズも大きいファイル(デプロイ用のビルド成果物など)はキャッシュしないでください。
キャッシュキーの課題
Maven を使用する Java プロジェクトがあり、依存関係が pom.xml に定義されているとします。Maven は通常、ダウンロードした JAR を ~/.m2/repository に保存します。
pom.xml が変更されたときに、Maven の依存関係を確実にキャッシュし、正しく無効化できるキャッシュ設定はどれですか?
振り返り:キャッシュで高速化
よくできました!GitHub Actions でキャッシュを実装し、CI/CD ワークフローを大幅に高速化する方法を学びました。
actions/cacheアクションを使います。keyとpathで、何をどのようにキャッシュするかを定義します。hashFilesによって、キャッシュを適切に無効化するための動的なキーを作成できます。restore-keysは有用なフォールバックを提供します。
依存関係を適切にキャッシュすることで、ビルド時間と計算リソースを節約し、パイプラインをより効率的にできます。
よくある質問
「依存関係のキャッシュによる高速化」レッスンは無料ですか?
はい。「依存関係のキャッシュによる高速化」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、DevOps Bootcampコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 DevOps Bootcampコースには全4レッスンが含まれています。
「依存関係のキャッシュによる高速化」で何を学びますか?
生成済みの依存関係やビルド成果物を再利用するキャッシュを実装し、ワークフローの実行を大幅に高速化します。 ブラウザで直接実行するハンズオンコードでDevOps Bootcampを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
DevOps Bootcampを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのDevOps Bootcampは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「依存関係のキャッシュによる高速化」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このDevOps Bootcampレッスンでコードを書いて実行できますか?
はい。すべてのDevOps Bootcampレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 複数環境向けのマトリックスビルド
- 依存関係のキャッシュによる高速化
- 再利用可能なワークフローと Actions
- 条件付き実行とジョブの依存関係