LESSON 30分

ストーリー

田中VPoE
CI/CD基盤自体もコードで管理する。いわば「CI/CDのためのCI/CD」だ
あなた
メタ的ですね。具体的にはどんなインフラをコード化するんですか?
田中VPoE
GitHub Organizationの設定、ランナーの構成、ネットワーク設定、シークレット管理 — CI/CDを支えるインフラのすべてだ。手動で設定すると、変更履歴が追えず、再現性もない。これをIaCで管理する

IaCで管理すべきCI/CDインフラ

管理対象

カテゴリ管理対象IaCツール
GitHub設定Organization設定、Ruleset、チーム権限Terraform (github provider)
ランナーセルフホストランナー、スケーリング設定Terraform + Kubernetes
ネットワークVPC、サブネット、セキュリティグループTerraform
シークレットVault設定、KMS鍵、GitHub SecretsTerraform + SOPS
監視ダッシュボード、アラートルールTerraform (datadog/grafana provider)

GitHub Organization as Code

# Terraform: GitHub Organization設定
resource "github_organization_ruleset" "main_protection" {
  name        = "main-branch-protection"
  target      = "branch"
  enforcement = "active"

  conditions {
    ref_name {
      include = ["~DEFAULT_BRANCH"]
    }
  }

  rules {
    required_status_checks {
      required_check {
        context = "security/sast"
      }
      required_check {
        context = "security/sca"
      }
      required_check {
        context = "test/unit"
      }
    }

    pull_request {
      required_approving_review_count   = 2
      dismiss_stale_reviews_on_push     = true
      require_code_owner_review         = true
    }
  }
}

resource "github_repository" "service" {
  for_each = var.repositories

  name        = each.key
  description = each.value.description
  visibility  = "internal"

  template {
    owner      = "org"
    repository = each.value.template
  }
}

セルフホストランナーの管理

ランナーアーキテクチャ

GitHub Actions
    ↓ ジョブディスパッチ
┌─────────────────────────────────┐
│   Actions Runner Controller      │
│   (Kubernetes Operator)          │
├─────────────────────────────────┤
│   Runner Pod Pool                │
│   ┌──────┐ ┌──────┐ ┌──────┐  │
│   │Runner│ │Runner│ │Runner│  │
│   │Pod 1 │ │Pod 2 │ │Pod N │  │
│   └──────┘ └──────┘ └──────┘  │
│   Auto-scaling: 0 → 30 Pods    │
└─────────────────────────────────┘

Actions Runner Controller (ARC) の設定

# Helm values for ARC
apiVersion: actions.summerwind.dev/v1alpha1
kind: RunnerDeployment
metadata:
  name: org-runners
spec:
  template:
    spec:
      organization: "org-name"
      labels:
        - "self-hosted"
        - "linux"
        - "x64"
      resources:
        requests:
          cpu: "2"
          memory: "4Gi"
        limits:
          cpu: "4"
          memory: "8Gi"
---
apiVersion: actions.summerwind.dev/v1alpha1
kind: HorizontalRunnerAutoscaler
metadata:
  name: org-runners-autoscaler
spec:
  scaleTargetRef:
    name: org-runners
  minReplicas: 2
  maxReplicas: 30
  metrics:
    - type: TotalNumberOfQueuedAndInProgressWorkflowRuns
      scaleUpThreshold: "0.75"
      scaleDownThreshold: "0.25"
      scaleUpFactor: "2"
      scaleDownFactor: "0.5"

シークレット管理

階層型シークレット管理

Organization Secrets(全リポジトリ共通)
├── GHCR_TOKEN(コンテナレジストリ)
├── SONAR_TOKEN(コード品質)
└── SNYK_TOKEN(セキュリティスキャン)

Repository Secrets(リポジトリ固有)
├── DATABASE_URL
├── API_KEY
└── ...

Environment Secrets(環境固有)
├── staging/
│   ├── AWS_ACCESS_KEY_ID
│   └── AWS_SECRET_ACCESS_KEY
└── production/
    ├── AWS_ACCESS_KEY_ID
    └── AWS_SECRET_ACCESS_KEY

GitOps for CI/CD Infrastructure

CI/CD基盤のインフラ変更もGitOpsで管理します。

基盤変更フロー:

1. インフラコードを変更してPR作成
2. Terraform Plan が自動実行
3. OPAポリシーチェック
4. 2名以上のレビューと承認
5. PR Merge → Terraform Apply 自動実行
6. 変更の自動テスト(スモークテスト)

「CI/CD基盤のインフラ変更こそ、最も慎重にレビューすべきだ。基盤が壊れれば全チームが影響を受ける」 — 田中VPoE


まとめ

ポイント内容
IaC管理対象GitHub設定、ランナー、ネットワーク、シークレット、監視
ランナーARC(Actions Runner Controller)でKubernetes上に自動スケーリング
シークレットOrganization → Repository → Environmentの3階層
GitOps基盤変更もPR + レビュー + 自動適用のフローで管理

チェックリスト

  • CI/CD基盤をIaCで管理する対象を理解した
  • セルフホストランナーの自動スケーリングを理解した
  • 階層型シークレット管理を理解した
  • 基盤変更のGitOpsフローを理解した

次のステップへ

次は「自己修復とセルフサービス化」です。CI/CD基盤が自律的に問題を検知・修復し、チームがセルフサービスで利用できる仕組みを学びましょう。


推定読了時間: 30分