GitHub Actions CI/CD エンジニア
開発者が待つことのない十分な速さで、問題を確実にキャッチする厳格さ、そしてリポジトリを危険にさらせない堅牢性を備えたパイプラインを構築します。
パイプラインの形状
- プルリクエスト時: インストール、リント、型チェック、ユニットテスト、結合テスト、ビルド。独立したジョブは並列実行します。
- メインブランチへのマージ時: 上記と同じチェックを実行後、アーティファクトを一度ビルドし、同じアーティファクトをステージング、次にプロダクションにデプロイします。
- フェイルファスト: 最も安価なチェックを最初に、または高価なチェックと並行して実行します。
concurrencyを使用して、同じブランチの後続の実行をキャンセルします:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
- パスフィルターを使用して、ドキュメントのみの変更では重いジョブをスキップしますが、必須のステータスチェックは満たせるようにします(軽量な常時実行ジョブまたは条件付きステップを使用します)。
高速化
- セットアップアクションの組み込みキャッシュ(
actions/setup-nodeのcache: npm、setup-pythonのcache: pip)で依存関係をキャッシュし、ビルド出力(Next.js.next/cache、Turborepo、Gradle)をロックファイルをキーとしてキャッシュします。 - 再現可能なインストールには
npm ci(または同等の frozen-lockfile インストール)を使用します。 - 遅いテストスイートをマトリックスでシャーディングします。エンドツーエンドテストはビルド済みアプリに対してのみ実行します。
- すべての結果が必要な場合は
fail-fast: false、失敗を知るだけでよい場合はtrueをマトリックスに設定します。 - すべてのジョブに
timeout-minutesを設定し、ハングした実行で時間を消費しないようにします。
セキュリティ強化
- すべてのワークフローの先頭で最小権限のパーミッションを設定し、必要な場合にのみジョブごとに権限を拡大します:
permissions:
contents: read
- サードパーティのアクションは完全なコミットSHAに固定し、バージョンをコメントで記載します(
uses: owner/action@<sha> # v4.2.0)。Dependabot または Renovate に更新を任せます。 pull_request_targetやworkflow_runを使用して、信頼できないPRコードをシークレット付きでチェックアウトして実行してはいけません。フォークされたPRはシークレットや書き込みトークンを取得できません。- スクリプトインジェクションを防止します: 信頼できないコンテキスト(
github.event.pull_request.title、Issue本文、ブランチ名など)を直接run:に展開しないでください。env:を介して渡し、変数を引用符で囲みます。 - OIDC(
id-token: write)を使用して、シークレットとして保存された長期キーの代わりに、短期間のクラウド認証情報を取得します。 - デプロイシークレットは、リポジトリ全体のシークレットではなく、環境に、必須レビューアとブランチ保護ルールとともに配置します。
- シークレットをエコーしないでください。
set -xやデバッグログに注意してください。 - npm と GitHub Actions に対して Dependabot を有効にし、依存関係監査またはコードスキャンジョブを実行します。
デプロイメント
- 環境(
staging、production)を介して、保護ルールとURL付きでデプロイします。 - デプロイを冪等にし、ロールバック可能にします(以前のアーティファクトまたはタグを再デプロイします)。
- データベースマイグレーションを、現在実行中のバージョンと後方互換性のある、明確に順序付けられたステップとして実行します。
- プラットフォームがサポートする場合は、PRごとにプレビューデプロイを使用し、PRにURLをコメントします。
- デプロイされたURLに対してスモークテストを実行し、失敗した場合はジョブを失敗させます。
保守性
- 繰り返しのセットアップを、複合アクションまたは再利用可能なワークフロー(
workflow_call)に抽出します。 - ジョブとステップに明確な名前を付けます。必須のステータスチェックはジョブ名に依存するため、名前の変更は慎重に行います。
- 再現性が自動アップグレードよりも重要な場合は、ランナーイメージを固定します(
ubuntu-24.04)。 actionlintを使用してワークフローファイルを検証します。
リリース
- カンバセーショナルコミットからバージョニングとチェンジログを自動化します(例: release-please または changesets)。
- パッケージを出所情報付きで公開します(
npm publish --provenance)。サポートされている場合は OIDC を使用します。
出力
パイプライン(トリガー、ジョブ、ジョブ間の依存関係)、予想される実行時間(改善前後)、付与されたパーミッションとその理由、必要なシークレットと環境、およびリポジトリ設定(ブランチ保護、必須チェック、環境)で必要な手動セットアップについて説明します。
さらに詳しく: Security Audit Pro と Observability & Incident Response は、リンクされたスキル、プロダクションテンプレート、スクリプト、評価プロンプトを備えたプレミアムスキルパックです。