LESSON 30分

ストーリー

田中VPoE
フェデレーション型ガバナンスを実現するには、技術的な基盤が必要だ。その中核が「共有パイプラインライブラリ」だ
あなた
GitHub ActionsのReusable Workflowのことですか?
田中VPoE
Reusable Workflowはその一つの手段だ。だが、組織全体のライブラリとして設計するには、バージョニング、テスト、ドキュメント、移行戦略まで考える必要がある。単にワークフローを共有するだけでは不十分だ

共有ライブラリの設計

アーキテクチャ

org/shared-workflows/          # メインリポジトリ
├── .github/
│   └── workflows/
│       ├── ci-standard.yml    # 標準CIパイプライン
│       ├── cd-staging.yml     # ステージングデプロイ
│       ├── cd-production.yml  # 本番デプロイ
│       ├── security-scan.yml  # セキュリティスキャン
│       └── release.yml        # リリースワークフロー
├── actions/                   # Composite Actions
│   ├── setup-node/
│   ├── setup-python/
│   ├── setup-go/
│   ├── docker-build/
│   ├── helm-deploy/
│   └── security/
│       ├── sast/
│       ├── sca/
│       └── container-scan/
├── policies/                  # OPAポリシー
├── templates/                 # テンプレート
└── docs/                      # ドキュメント

Reusable Workflow の設計原則

原則説明
単一責任1つのワークフローは1つの責務のみ
設定可能性inputsで柔軟にカスタマイズ可能
デフォルト値合理的なデフォルト値で、最小限の設定で利用開始可能
バージョニングSemVerでタグ付け、破壊的変更はMajorバージョンアップ
テストライブラリ自体のCI/CDテスト

呼び出しインターフェース

# 各チームのリポジトリでの呼び出し例
name: CI/CD Pipeline
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  ci:
    uses: org/shared-workflows/.github/workflows/ci-standard.yml@v2
    with:
      language: "typescript"
      node-version: "20"
      test-command: "npm test"
      coverage-threshold: 80
    secrets: inherit

  deploy-staging:
    needs: ci
    if: github.ref == 'refs/heads/main'
    uses: org/shared-workflows/.github/workflows/cd-staging.yml@v2
    with:
      service-name: "my-service"
      cluster: "staging-eks"
    secrets: inherit

バージョニング戦略

SemVer によるバージョン管理

バージョン変更内容チームの対応
Major (v1→v2)破壊的変更(inputsの廃止等)マイグレーションが必要
Minor (v2.0→v2.1)新機能追加、後方互換任意でアップデート
Patch (v2.1.0→v2.1.1)バグ修正、セキュリティパッチ自動適用推奨

移行サポート

メジャーバージョンアップ時は、移行期間と移行ガイドを提供します。

バージョン移行タイムライン:

v1 (現行)  ──────────────→ サポート終了
                           ↑ 6ヶ月の移行期間
v2 (新版)  ───────→ 推奨 ──→ 必須
           リリース  3ヶ月   6ヶ月

Composite Action の設計

Reusable Workflowよりも粒度の細かい共有単位として、Composite Actionを設計します。

# actions/docker-build/action.yml
name: "Docker Build & Push"
description: "標準的なDockerイメージのビルドとプッシュ"
inputs:
  image-name:
    description: "イメージ名"
    required: true
  dockerfile:
    description: "Dockerfileのパス"
    default: "Dockerfile"
  push:
    description: "プッシュするかどうか"
    default: "true"
outputs:
  image-tag:
    description: "生成されたイメージタグ"
    value: ${{ steps.meta.outputs.tags }}

runs:
  using: "composite"
  steps:
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v3

    - name: Login to GHCR
      uses: docker/login-action@v3
      with:
        registry: ghcr.io
        username: ${{ github.actor }}
        password: ${{ github.token }}

    - name: Build and Push
      uses: docker/build-push-action@v6
      with:
        context: .
        file: ${{ inputs.dockerfile }}
        push: ${{ inputs.push }}
        tags: ${{ steps.meta.outputs.tags }}
        cache-from: type=gha
        cache-to: type=gha,mode=max

共有ライブラリのテスト

ライブラリ自体の品質を担保するために、テストを実施します。

テスト種別内容頻度
LintチェックYAMLのバリデーション、actionlint全PR
ユニットテスト個々のActionの動作確認全PR
統合テストワークフロー全体の実行テストリリース前
スモークテストサンプルリポジトリでの動作確認リリース後

チームへのオンボーディング

セルフサービスオンボーディング

新しいチームが共有ライブラリを即座に使い始められるようにします。

ステップ内容所要時間
1テンプレートリポジトリからプロジェクトを作成5分
2language パラメータを設定5分
3最初のPushでパイプラインが自動実行0分
4カスタマイズ(必要に応じて)30分

「30分以内にパイプラインが動く状態にできなければ、そのライブラリは使われない。DX(Developer Experience)を最優先で設計しろ」 — 田中VPoE


まとめ

ポイント内容
アーキテクチャReusable Workflow + Composite Actions の2層構造
バージョニングSemVerで管理、メジャーバージョンアップ時は移行期間を設ける
テストライブラリ自体のCI/CDを実施
オンボーディング30分以内にパイプラインが動く状態を目指す

チェックリスト

  • 共有ライブラリのアーキテクチャを理解した
  • Reusable WorkflowとComposite Actionの使い分けを理解した
  • バージョニングと移行戦略を理解した
  • チームオンボーディングの重要性を理解した

次のステップへ

次は「テンプレートとポリシーエンジン」です。共有ライブラリをさらに発展させ、テンプレートリポジトリとポリシーエンジンによるガバナンスの自動化を学びましょう。


推定読了時間: 30分