1. 依存関係のキャッシュ活用
-
actions/cache
や各セットアップアクション(例:actions/setup-node
)のキャッシュ機能を利用することで、依存関係のインストール処理をスキップでき、全体の処理時間を短縮できる。- ビルドやテストで毎回インターネットから依存ライブラリを取得すると、処理時間が長くなる。
- 特にNode.jsプロジェクトでは、大量のnpmパッケージを毎回インストールする際、キャッシュ活用により無駄な処理を省ける。
- これにより、ネットワーク転送量が削減され、ビルド時間が数十秒から数分短縮される可能性がある。
設定例
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '16'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run build
run: npm run build
2. ジョブの並列実行とワークフローの簡素化
- 複数のタスク(ビルド、テスト、リンターチェックなど)が互いに依存していない場合、これらを並列に実行することで全体の実行時間を短縮する。
- ワークフローが複数のステップで構成され、各ステップが順次実行されると、全体の所要時間が延びる。
- 並列実行により、各ジョブが独立して開始されるため、待ち時間の削減につながる。
設定例
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14, 16, 18]
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
※ 異なるNode.jsバージョンでテストを並列実行する例
3. ランナーリソースの最適化
- セルフホストランナーや、より高スペックのホストランナーを利用することで、リソース不足による遅延を防ぎ、処理速度を向上させる。
- GitHubホストランナーは標準で一定のリソース(CPU、メモリ)を提供するが、ジョブが重い場合、リソース不足がボトルネックになる可能性がある。
- 高負荷なジョブ(例:Dockerコンテナのビルドや大規模なテスト)において、処理速度の向上が期待できる。
設定例
jobs:
build:
runs-on: self-hosted
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '16'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run build
run: npm run build
※ セルフホストランナーを利用する場合、あらかじめ高性能なマシン(高CPU・高メモリ)を用意する必要がある。
4. トリガー条件の見直し
- ワークフロー実行を開始するトリガー条件を最適化することで、不要な実行(例えば、ドキュメント更新のみの場合など)を回避する。
- 無駄な実行回数を減らすことで、全体の実行時間とリソース消費が低減できる。
- 不要なジョブの実行を防ぎ、CI/CDパイプラインの効率を向上させる。
- 無駄な実行回数を減らすことで、全体の実行時間とリソース消費が低減できる。
設定例
on:
push:
branches: [ main ]
paths-ignore:
- 'docs/**'
- '*.md'
pull_request:
branches: [ main ]
※ docs/
配下やMarkdownファイルの変更ではワークフローが実行されなくする例
5. 秘密情報の管理
- 秘密情報の適切な管理により、CI/CDパイプライン内での不正アクセスや情報漏洩のリスクを低減する。
- 長期間利用するシークレット情報やアクセスキーが漏洩すると、重大なセキュリティ事故につながるため、OIDCを活用した動的認証方式などを導入する。
設定例
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Configure AWS credentials from GitHub OIDC
uses: aws-actions/configure-aws-credentials@v2
with:
role-to-assume: arn:aws:iam::123456789012:role/GitHubOIDCRole
aws-region: us-east-1
- name: Deploy to ECS
run: aws ecs update-service --cluster my-cluster --service my-service --force-new-deployment
※ GitHub ActionsからAWSへのアクセスをOIDCを利用する例
6. キャッシュの保存期間と条件の最適化
- キャッシュキーの有効期間(TTL)を適切に設定することで、キャッシュヒット率を向上させ、古いキャッシュの再生成を防止する。
- 再ビルドや再ダウンロードの回数を減らすことで、全体の処理時間が短縮される。
- 頻繁に変更されない依存関係や成果物は、長期間キャッシュしておくことで、毎回の再取得を防ぐ。
設定例
- name: Cache build artifacts
uses: actions/cache@v3
with:
path: build/
key: ${{ runner.os }}-build-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-
7. ジョブキャンセルと再実行の最適化
- 不要な古いジョブが走り続けないように、
concurrency
を設定して最新の実行のみを有効にする。- 頻繁にコミットが行われるプロジェクトでは、前のジョブが残ったままになるとリソースが無駄になり、全体の効率が低下する。
- 重複実行を防ぎ、無駄なリソース消費を削減できる。
設定例
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
8. 適切なタイムアウトの設定
- 長時間動作するジョブにタイムアウトを設定することで、ハングアップや異常時の無限待機を防ぐ。
- ネットワークや外部APIのレスポンス待ちなどでジョブが延長されると、全体のパイプラインが遅延するため、タイムアウト設定により異常時の早期検知と影響軽減が可能。
- 特定の処理が予期せず長時間停止することを防ぎ、無駄なリソースの消費を抑える。
設定例
jobs:
build:
timeout-minutes: 15
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
...
参考文献
- GitHub Actions公式ドキュメント
https://docs.github.com/en/actions