ストーリー
共有ライブラリの設計
アーキテクチャ
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分 |
| 2 | language パラメータを設定 | 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分