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


## 1. 依存関係のキャッシュ活用

- `actions/cache`や各セットアップアクション（例：`actions/setup-node`）のキャッシュ機能を利用することで、依存関係のインストール処理をスキップでき、全体の処理時間を短縮できる。
	- ビルドやテストで毎回インターネットから依存ライブラリを取得すると、処理時間が長くなる。
	- 特にNode.jsプロジェクトでは、大量のnpmパッケージを毎回インストールする際、キャッシュ活用により無駄な処理を省ける。
	- これにより、ネットワーク転送量が削減され、ビルド時間が数十秒から数分短縮される可能性がある。
### 設定例
```yaml
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. ジョブの並列実行とワークフローの簡素化

- 複数のタスク（ビルド、テスト、リンターチェックなど）が互いに依存していない場合、これらを並列に実行することで全体の実行時間を短縮する。
    - ワークフローが複数のステップで構成され、各ステップが順次実行されると、全体の所要時間が延びる。
	- 並列実行により、各ジョブが独立して開始されるため、待ち時間の削減につながる。
### 設定例
```yaml
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コンテナのビルドや大規模なテスト）において、処理速度の向上が期待できる。
### 設定例
```yaml
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パイプラインの効率を向上させる。
### 設定例
```yaml
on:
  push:
    branches: [ main ]
    paths-ignore:
      - 'docs/**'
      - '*.md'
  pull_request:
    branches: [ main ]
```
※ `docs/`配下やMarkdownファイルの変更ではワークフローが実行されなくする例

## 5. 秘密情報の管理

- 秘密情報の適切な管理により、CI/CDパイプライン内での不正アクセスや情報漏洩のリスクを低減する。
	- 長期間利用するシークレット情報やアクセスキーが漏洩すると、重大なセキュリティ事故につながるため、OIDCを活用した動的認証方式などを導入する。
### 設定例
```yaml
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）を適切に設定することで、キャッシュヒット率を向上させ、古いキャッシュの再生成を防止する。
	- 再ビルドや再ダウンロードの回数を減らすことで、全体の処理時間が短縮される。
	- 頻繁に変更されない依存関係や成果物は、長期間キャッシュしておくことで、毎回の再取得を防ぐ。

### 設定例
```yaml
- 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`を設定して最新の実行のみを有効にする。
	- 頻繁にコミットが行われるプロジェクトでは、前のジョブが残ったままになるとリソースが無駄になり、全体の効率が低下する。
	- 重複実行を防ぎ、無駄なリソース消費を削減できる。

### 設定例
```yaml
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
```

## 8. 適切なタイムアウトの設定

- 長時間動作するジョブにタイムアウトを設定することで、ハングアップや異常時の無限待機を防ぐ。
	- ネットワークや外部APIのレスポンス待ちなどでジョブが延長されると、全体のパイプラインが遅延するため、タイムアウト設定により異常時の早期検知と影響軽減が可能。
	- 特定の処理が予期せず長時間停止することを防ぎ、無駄なリソースの消費を抑える。
### 設定例
```yaml
jobs:
  build:
    timeout-minutes: 15
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      ...
```

## 参考文献
- GitHub Actions公式ドキュメント  
    [https://docs.github.com/en/actions](https://docs.github.com/en/actions)