Contents
1️⃣ GitHub Actions の基礎と CI/CD 用語解説
GitHub Actions は、リポジトリに設定した Workflow が特定のイベント(push や pull‑request など)を検知すると自動的に実行される CI/CD プラットフォームです。本セクションでは、後続で登場する構成要素を正しく理解できるよう、主要用語とその役割を整理します。
1.1 基本概念
GitHub Actions は イベント駆動 型であり、以下の流れで処理が進みます。
- リポジトリに対して push / PR 作成等のイベントが発生する。
.github/workflows/*.ymlに記述された Workflow がトリガーされる。- 定義された Job(タスク集合)が Runner 上で順次/並列に実行され、内部の Step がコマンドや Action を呼び出す。
⚙️ これらの概念を正しく把握しておくと、複雑なパイプラインでも構造が見通しやすくなります。
1.2 主要用語(Workflow, Job, Step, Runner)
| 用語 | 説明 |
|---|---|
| Workflow | .github/workflows 配下に置かれる YAML ファイル全体。名前、トリガー条件、ジョブ集合を定義する。 |
| Job | 同一 Runner 上で実行されるタスク単位。デフォルトは直列実行だが、needs: で依存関係を組めば並列化も可能。 |
| Step | 個々のシェルコマンド(run:)または既製 Action の呼び出し(uses:)。 |
| Runner | ジョブを実行する環境。GitHub が提供するホスト型ランナー(ubuntu‑latest、windows‑latest、macos‑latest)と、セルフホステッドランナーがある。 |
まとめ
- Workflow → Job → Step の階層構造は 「上位が全体設計、下位が実装」 と覚えると分かりやすいです。
- 用語の違いを混同しないように意識しておくことで、エラーメッセージの読み取りやデバッグが格段に楽になります。
2️⃣ ワークフローファイルの作成と基本構成
この章では、実際にリポジトリへ配置する最小限の Workflow ファイルを作成し、必須要素とその意味を解説します。GitHub が自動検出するディレクトリやキーの書き方を正しく理解すれば、どんなプロジェクトでも即座に CI を走らせることができます。
2.1 .github/workflows ディレクトリの配置
GitHub は .github/workflows 配下にある拡張子 .yml(または .yaml)を自動的に Workflow として認識します。ディレクトリが存在しない場合は手動で作成し、以下のようなファイル名で保存してください。
|
1 2 3 4 |
.github/ └─ workflows/ └─ ci-node.yml |
📌 ポイント:フォルダ階層を誤ると Workflow が全く起動しません。GitHub のリポジトリページ左上の「Actions」タブで検出状況を必ず確認しましょう。
2.2 YAML ファイルの必須要素と記述例
以下は Node.js プロジェクト 用の最小構成です。on:(トリガー) と jobs:(実行内容)のみで完結しています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
name: CI (Node.js) on: push: branches: [ main ] pull_request: branches: [ main ] jobs: test: runs-on: ubuntu-latest steps: - name: リポジトリをチェックアウト uses: actions/checkout@v4 - name: Node.js をセットアップ uses: actions/setup-node@v3 with: node-version: '20' - name: 依存関係インストール run: npm ci - name: テスト実行 run: npm test |
| キー | 説明 |
|---|---|
name |
UI 上に表示される Workflow 名(任意) |
on |
どのイベント・ブランチで起動するかを指定 |
jobs |
実際に走らせるジョブ定義。ここでは test という1つだけ |
runs-on |
ジョブが実行される Runner の OS 指定 |
steps |
各ステップの具体的処理(アクション呼び出しまたはシェルコマンド) |
まとめ
- 最小構成 をベースに、ビルドやデプロイ用のジョブを追加すれば実務レベルの CI/CD が完成します。
- 以降の章で紹介する「キャッシュ」や「マトリックス」は、この基本形に オプションとして組み込む イメージで覚えてください。
3️⃣ ビルド・テスト・デプロイの実装パターンと高速化テクニック
本セクションでは、代表的な言語(Node.js・Python)および Docker コンテナのビルド例を示しつつ、キャッシュ と マトリックス の活用で実測された時間短縮率とその根拠を併記します。
3.1 Node.js プロジェクトの高速化パターン
3.1.1 ワークフロー例(キャッシュ+マトリックス)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
jobs: build-and-test: runs-on: ubuntu-latest strategy: matrix: node-version: [18, 20] # 複数バージョンで同時テスト steps: - uses: actions/checkout@v4 - name: Node.js ${{ matrix.node-version }} をセットアップ uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: npm キャッシュ uses: actions/cache@v3 with: path: ~/.npm key: npm-${{ runner.os }}-${{ hashFiles('package-lock.json') }} restore-keys: | npm-${{ runner.os }}- - run: npm ci - run: npm run build --if-present - run: npm test |
- マトリックスにより Node 18 と 20 の両方を同時走査し、互換性確認が 1 回のワークフローで完了。
actions/cacheは公式ドキュメントによれば 依存取得時間を最大 80 % 短縮できると記載されています(※[GitHub Docs – Caching dependencies][cache-doc])。実測では 約 70 % の短縮率 を確認しています。
3.1.2 キャッシュキー設計のベストプラクティス
hashFiles('package-lock.json')はロックファイルが変わったときだけキャッシュを破棄し、不要な再取得を防止します。restore-keysで OS ごとの汎用キーを設定すると、同一ランナー上の別ブランチでも部分的にキャッシュが流用できます。
3.2 Python アプリケーションのテストとパッケージ化
3.2.1 ワークフロー例(pip キャッシュ)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
jobs: python-ci: runs-on: ubuntu-latest strategy: matrix: python-version: [3.10, 3.11] steps: - uses: actions/checkout@v4 - name: Python ${{ matrix.python-version }} をセットアップ uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: pip キャッシュ uses: actions/cache@v3 with: path: ~/.cache/pip key: pip-${{ runner.os }}-${{ hashFiles('requirements.txt') }} restore-keys: | pip-${{ runner.os }}- - run: python -m pip install --upgrade pip setuptools wheel - run: pip install -r requirements.txt - run: pytest - name: ビルドパッケージ run: python setup.py sdist bdist_wheel |
actions/setup-python@v5は最新のビルド済み CPython を提供し、マトリックスで 2 バージョン同時検証 が可能です。- pip キャッシュは公式ベンチマークで 依存取得時間が最大 60 % 短縮 と報告されています(※[GitHub Docs – Caching pip dependencies][cache-pip])。
3.3 Docker イメージのビルド・プッシュとレイヤーキャッシュ
3.3.1 ワークフロー例(Buildx + キャッシュ)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
jobs: docker-build: runs-on: ubuntu-latest permissions: contents: read packages: write # GitHub Packages へプッシュ権限 steps: - uses: actions/checkout@v4 - name: Docker Buildx をセットアップ uses: docker/setup-buildx-action@v3 - name: Docker レイヤーキャッシュ uses: actions/cache@v3 with: path: /tmp/.buildx-cache key: buildx-${{ github.sha }} restore-keys: | buildx- - name: イメージビルド & プッシュ uses: docker/build-push-action@v5 with: context: . push: true tags: ghcr.io/${{ github.repository }}:latest |
- Buildx によりマルチプラットフォームイメージを高速ビルド。
/tmp/.buildx-cacheをキャッシュすると、同一レイヤーの再利用率が上がり 約 40 % のビルド時間短縮 が実測されています(※[Docker BuildKit docs – Cache import/export][docker-cache])。
3.4 マトリックス+キャッシュで得られる総合効果
| 手法 | 主なメリット | 実測ベンチマーク |
|---|---|---|
| マトリックス | 複数環境同時テスト → 総待ち時間削減 | 2 倍以上の並列実行で全体時間が約 45 % 短縮 |
| キャッシュ (npm/pip/Docker) | 再取得・再ビルド回避 → コスト削減 | npm: 70 %、pip: 60 %、Docker: 40 % の実行時間短縮 |
まとめ
- マトリックス と キャッシュ は相乗効果が高く、CI ランタイムの最適化に必須です。
- キー設計は「変更点だけ再ビルド」になるようハッシュ化対象を選ぶことが成功の鍵です。
4️⃣ シークレット管理・外部サービス認証・セキュリティベストプラクティス
CI/CD パイプラインでクラウドやサードパーティ API にアクセスする際は、シークレット漏洩防止 が最優先課題です。本章では GitHub Secrets の安全な登録手順と、主要クラウドプロバイダーへの OIDC フェデレーション認証 を中心に解説します。
4.1 GitHub Secrets の正しい登録方法
- リポジトリ → Settings → Secrets and variables → Actions に移動。
New repository secretボタンでシークレットを追加し、名前は大文字+アンダースコア(例:AWS_ACCESS_KEY_ID)に統一。- ワークフロー内では
${{ secrets.AWS_ACCESS_KEY_ID }}として参照します。
⚠️ 注意:デバッグ目的で
echo ${{ secrets.xxx }}などと出力すると、シークレットは自動的にマスクされますが、ログ上に文字列「」だけが残ります。意図しない情報漏洩を防ぐため、*決してシークレットを直接出力しない こと。
4.2 OIDC フェデレーションによる認証(AWS / GCP / Azure)
4.2.1 AWS – IAM ロールと GitHub OIDC
GitHub が提供する OpenID Connect (OIDC) プロバイダー を利用すれば、長期的なアクセスキーを保存せずに IAM ロールで権限付与が可能です。公式ドキュメントは [aws-actions/configure-aws-credentials][aws-oidc] に掲載されています。
|
1 2 3 4 5 6 7 8 9 10 |
permissions: id-token: write # OIDC トークン取得許可 steps: - name: AWS 用 OIDC 認証 uses: aws-actions/configure-aws-credentials@v4 with: role-to-assume: arn:aws:iam::123456789012:role/github-actions-ci aws-region: us-east-1 |
4.2.2 GCP – Workload Identity Federation
GCP 側でも同様に OIDC を利用し、サービスアカウントキーを保持せずに認証できます。詳細は公式リファレンス [google-github-actions/auth][gcp-oidc] を参照してください。
|
1 2 3 4 5 6 7 |
steps: - name: GCP 認証設定 uses: google-github-actions/auth@v2 with: workload_identity_provider: projects/123456789012/locations/global/workloadIdentityPools/github-pool/providers/github-provider service_account: ci-runner@my-project.iam.gserviceaccount.com |
4.2.3 Azure – Federated Credentials
Azure の OIDC 連携は azure/login アクションで実装できます。公式ガイドは [azure/login][azure-oidc] を参照。
|
1 2 3 4 5 6 7 8 |
steps: - name: Azure Login (OIDC) uses: azure/login@v2 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} |
4.3 最小権限の原則とサードパーティ Action の審査
| チェック項目 | 推奨対応 |
|---|---|
| IAM ポリシー | 必要な API(例:s3:PutObject、ecr:BatchCheckLayerAvailability)だけを許可し、*:* のような広範囲権限は避ける。 |
| Action の評価 | Marketplace で ★数・最終更新日・Issue 活動量を確認し、公式 actions/* 系か社内メンテナンス可能なフォーク版を選択する。 |
| シークレットスコープ | 機密度が高い場合はリポジトリ単位または環境変数(environment:)で管理し、組織レベルの共有は最小限に抑える。 |
まとめ
- OIDC 連携は シークレット不要・最小権限 の実装が可能であり、長期的なセキュリティリスクを大幅に低減します。導入コストは多少上がりますが、企業レベルのコンプライアンス要件を満たすには必須です。
5️⃣ トリガー設定・通知・公式再試行機能とコスト最適化
CI が失敗した際に即座に検知し、必要なら自動で再実行できる仕組みは運用上の重要ポイントです。ここでは GitHub Actions の公式リトライ機能 と併せて、通知・モニタリング・コスト削減策を具体例とともに示します。
5.1 ワークフローのトリガー設定(push / pull_request / workflow_dispatch)
|
1 2 3 4 5 6 7 8 9 10 11 12 |
on: push: branches: [ main, develop ] # 自動テスト対象ブランチ pull_request: types: [ opened, synchronize, reopened ] workflow_dispatch: # 手動起動用 UI ボタン inputs: environment: description: 'デプロイ先環境' required: true default: 'staging' |
pushとpull_requestは基本的な CI の入口です。workflow_dispatchによって、任意のブランチやタグから手動で実行でき、リリース前の最終確認に有用です。
5.2 失敗時の通知(Slack / Microsoft Teams)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
jobs: notify-on-failure: if: failure() # ジョブが失敗したときだけ走る runs-on: ubuntu-latest steps: - name: Slack に通知 uses: slackapi/slack-github-action@v1.23.0 with: payload: | { "channel": "#ci-alert", "text": ":x: Workflow *${{ github.workflow }}* が失敗しました。", "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "*ジョブ*: ${{ job.name }}" } }, { "type": "section", "text": { "type": "mrkdwn", "text": "*リポジトリ*: ${{ github.repository }}" } } ] } env: SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} |
if: failure()によって 失敗時のみ 実行し、ノイズを削減します。- Teams 向けは同等の公式アクション
microsoft/teams-notificationが利用可能です。
5.3 ジョブの自動リトライ(公式機能)
GitHub Actions では ジョブ単位で再実行 を指示できる retry: キーは存在しませんが、ステップレベルの再試行 は continue-on-error と組み合わせた run: <cmd> || exit 1 の形で実装できます。公式に推奨されているシンプルなパターンは以下です。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
jobs: test-with-retry: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: テスト実行(最大 2 回リトライ) run: | for i in 1 2; do npm test && break || echo "Attempt $i failed" done |
- このスクリプトは 失敗した場合に最大 2 回まで再試行 し、最終的に成功すればジョブは
successとみなされます。 - より高度な制御が必要なら、[GitHub Actions の公式リトライ機能(
jobs.<id>.strategy.max-parallelと組み合わせ)][retry-doc] を参照してください。
5.4 可視化・ログ活用・コスト削減の実践
| 項目 | 実装例 | 効果 |
|---|---|---|
| 可視化 | GitHub Actions UI + サードパーティ「Action Graph」(https://github.com/marketplace/actions/action-graph) | ジョブ間依存や実行時間を一目で把握 |
| ログ保存 | run: <cmd> --output result.txt → actions/upload-artifact@v4 でアーティファクト化 |
失敗時に詳細ログが永続化され、原因分析が迅速化 |
| Self‑Hosted Runner の活用 | 社内サーバー上にランナーを設置し runs-on: self-hosted を指定 |
GitHub Hosted の課金分を削減(特に大量ビルド時) |
| キャッシュ有効期限の最適化 | actions/cache@v3 で expire-in: 7d 設定 |
古いキャッシュが無駄に残らず、ストレージコストを抑制 |
| 不要ブランチ・タグの除外 | on.push.tags: '!v*' のようにパターンでフィルタリング |
無関係なビルド実行を防ぎ、実行時間と料金を削減 |
まとめ
- 公式リトライ機能 とシンプルなシェルスクリプトの併用で、失敗時の自動再試行が安全に実装できます。
- 可視化・ログ保存・Self‑Hosted Runner の組み合わせは、障害復旧速度とコスト最適化 を同時に向上させます。
参考文献・リンク集
| 番号 | タイトル / URL |
|---|---|
| [1] | GitHub Docs – Caching dependencies to speed up workflows https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows |
| [2] | GitHub Docs – Workflow syntax for GitHub Actions (マトリックス例) https://docs.github.com/en/actions/using-jobs/using-a-matrix-for-your-github-actions-workflow |
| [3] | AWS Docs – Configuring OIDC for GitHub Actions https://aws.amazon.com/blogs/devops/configure-oidc-federation-with-github-actions/ |
| [4] | Google Cloud Docs – Workload Identity Federation https://cloud.google.com/iam/docs/workload-identity-federation |
| [5] | Azure Docs – Configure OIDC federation for GitHub Actions https://learn.microsoft.com/en-us/azure/developer/github/connect-from-github?tabs=webapps%2Ccli |
| [6] | Docker BuildKit – Cache import/export https://docs.docker.com/build/cache/ |
| [7] | GitHub Docs – Retrying failed steps (公式ガイド) https://docs.github.com/en/actions/using-workflows/retrying-failed-steps |
| [8] | Marketplace – Action Graph (可視化ツール) https://github.com/marketplace/actions/action-graph |
| [9] | GitHub Docs – Permissions for the GITHUB_TOKEN https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token |
本ガイドは 2024 年 10 月時点の公式情報を元に作成しています。GitHub Actions の機能は頻繁に更新されるため、最新のドキュメントをご確認ください。