0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHub Actionsワークフローの最適化Tips メモ

Posted at

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
      ...

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?