GitHub Actions応用
この章では、マトリックスビルド、シークレット、キャッシュ、再利用可能ワークフローなど、応用的な機能を学びます。
マトリックスビルド
Section titled “マトリックスビルド”基本的なマトリックス
Section titled “基本的なマトリックス”複数の組み合わせでテストを並列実行:
jobs: test: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] node: [18, 20, 22] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - run: npm testこの例では 3 × 3 = 9 ジョブが並列実行されます。
include / exclude
Section titled “include / exclude”strategy: matrix: os: [ubuntu-latest, windows-latest] node: [18, 20] include: # 特定の組み合わせを追加 - os: ubuntu-latest node: 22 experimental: true exclude: # 特定の組み合わせを除外 - os: windows-latest node: 18fail-fast
Section titled “fail-fast”strategy: fail-fast: false # 1つ失敗しても他を続行 matrix: os: [ubuntu-latest, macos-latest]シークレットとシークレット管理
Section titled “シークレットとシークレット管理”シークレットの種類
Section titled “シークレットの種類”| 種類 | スコープ | 設定場所 |
|---|---|---|
| Repository secrets | リポジトリ | Settings → Secrets |
| Environment secrets | 環境 | Settings → Environments |
| Organization secrets | Organization | Org Settings → Secrets |
steps: - name: Deploy env: API_KEY: ${{ secrets.API_KEY }} DB_PASSWORD: ${{ secrets.DB_PASSWORD }} run: ./deploy.shGITHUB_TOKEN
Section titled “GITHUB_TOKEN”自動で提供されるトークン:
steps: - name: Create Release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: gh release create v1.0.0
# または permissions で制御permissions: contents: write pull-requests: writeシークレットの注意点
Section titled “シークレットの注意点”# NG: ログに出力される可能性- run: echo ${{ secrets.API_KEY }}
# OK: マスクされる- run: ./script.sh env: API_KEY: ${{ secrets.API_KEY }}基本的なキャッシュ
Section titled “基本的なキャッシュ”- uses: actions/cache@v4 with: path: ~/.npm key: npm-${{ runner.os }}-${{ hashFiles('package-lock.json') }} restore-keys: | npm-${{ runner.os }}-言語別のキャッシュ設定
Section titled “言語別のキャッシュ設定”# Node.js- uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm'
# Python- uses: actions/setup-python@v5 with: python-version: '3.12' cache: 'pip'
# Go- uses: actions/setup-go@v5 with: go-version: '1.21' cache: trueカスタムキャッシュ
Section titled “カスタムキャッシュ”- name: Cache build uses: actions/cache@v4 with: path: | ~/.cache node_modules .next/cache key: build-${{ runner.os }}-${{ hashFiles('**/*.lock') }} restore-keys: | build-${{ runner.os }}-アーティファクト
Section titled “アーティファクト”アップロード
Section titled “アップロード”- uses: actions/upload-artifact@v4 with: name: build-output path: | dist/ !dist/**/*.map retention-days: 7ダウンロード
Section titled “ダウンロード”jobs: build: runs-on: ubuntu-latest steps: - run: npm run build - uses: actions/upload-artifact@v4 with: name: dist path: dist/
deploy: needs: build runs-on: ubuntu-latest steps: - uses: actions/download-artifact@v4 with: name: dist path: dist/ - run: ./deploy.sh再利用可能ワークフロー
Section titled “再利用可能ワークフロー”呼び出される側
Section titled “呼び出される側”name: Reusable Build
on: workflow_call: inputs: node-version: required: false type: string default: '20' secrets: NPM_TOKEN: required: false
jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: ${{ inputs.node-version }} - run: npm ci - run: npm run buildname: CI
on: [push, pull_request]
jobs: build: uses: ./.github/workflows/reusable-build.yml with: node-version: '20' secrets: NPM_TOKEN: ${{ secrets.NPM_TOKEN }}他リポジトリのワークフローを使用
Section titled “他リポジトリのワークフローを使用”jobs: build: uses: org/repo/.github/workflows/build.yml@main with: environment: production複合アクション(Composite Actions)
Section titled “複合アクション(Composite Actions)”name: 'Setup Project'description: 'Setup Node.js and install dependencies'inputs: node-version: description: 'Node.js version' required: false default: '20'runs: using: 'composite' steps: - uses: actions/setup-node@v4 with: node-version: ${{ inputs.node-version }} cache: 'npm' - run: npm ci shell: bash - run: npm run build shell: bashsteps: - uses: actions/checkout@v4 - uses: ./.github/actions/setup-project with: node-version: '20'依存ジョブ(needs)
Section titled “依存ジョブ(needs)”jobs: test: runs-on: ubuntu-latest steps: - run: npm test
build: needs: test runs-on: ubuntu-latest steps: - run: npm run build
deploy: needs: build runs-on: ubuntu-latest steps: - run: ./deploy.sh並列 + 依存
Section titled “並列 + 依存”jobs: lint: runs-on: ubuntu-latest steps: [...]
test: runs-on: ubuntu-latest steps: [...]
build: needs: [lint, test] # 両方完了後に実行 runs-on: ubuntu-latest steps: [...]ジョブ間のデータ受け渡し
Section titled “ジョブ間のデータ受け渡し”jobs: build: runs-on: ubuntu-latest outputs: version: ${{ steps.version.outputs.value }} steps: - id: version run: echo "value=$(cat version.txt)" >> $GITHUB_OUTPUT
deploy: needs: build runs-on: ubuntu-latest steps: - run: echo "Deploying version ${{ needs.build.outputs.version }}"中級者向けTips
Section titled “中級者向けTips”条件付き実行
Section titled “条件付き実行”jobs: deploy: if: github.ref == 'refs/heads/main' && github.event_name == 'push' runs-on: ubuntu-latest steps: - name: Deploy to production run: ./deploy.shタイムアウト設定
Section titled “タイムアウト設定”jobs: build: timeout-minutes: 30 runs-on: ubuntu-latest steps: - name: Long running task timeout-minutes: 10 run: ./long-task.sh並列度の制御
Section titled “並列度の制御”jobs: deploy: concurrency: group: production cancel-in-progress: false runs-on: ubuntu-latestサービスコンテナ
Section titled “サービスコンテナ”jobs: test: runs-on: ubuntu-latest services: postgres: image: postgres:15 env: POSTGRES_PASSWORD: postgres ports: - 5432:5432 redis: image: redis ports: - 6379:6379 steps: - run: npm test env: DATABASE_URL: postgresql://postgres:postgres@localhost:5432| 機能 | 用途 |
|---|---|
| マトリックス | 複数環境での並列テスト |
| キャッシュ | ビルド時間の短縮 |
| アーティファクト | ジョブ間のファイル共有 |
| 再利用可能WF | ワークフローの共通化 |
| 複合アクション | ステップの共通化 |
次の章では、CI/CDパイプラインについて学びます。
Q1. マトリックスビルドの主な用途は何ですか?
Q2. GitHub Actionsでシークレットを参照する正しい構文はどれですか?
Q3. ワークフローのキャッシュを使用する主なメリットは何ですか?