CI/CD — 変更を自動でテストして届ける

概要 — まず全体をつかむ

中級ではパイプラインの段取りと「小さく頻繁が安全な理由」を見ました。上級では、パイプライン自体をコードで書く発想・成果物の扱い・デプロイ戦略・秘密情報とサプライチェーンの守りへ掘り下げます。

詳細 — 1段階ずつ追う

これは何をする係?

上級のCI/CDでは、パイプラインを画面でポチポチ組む設定ではなく、リポジトリに置いたコード(パイプライン・アズ・コード)として書きます。これはIaCと同じ発想の応用です。

  • バージョン管理される — パイプラインの定義がGitの履歴に載り、いつ誰が段取りを変えたか追える
  • レビューできる — 「テストを一段飛ばす」ような変更も、コード差分として事前に見える
  • 再現できる — 同じ定義から同じ流れが再生される。担当者の手順の記憶に依存しない
アニメーション『CI/CDパイプラインの流れ』を開く
pushが引き金(トリガ)コミットgit の変更を送るビルド動く形に組み立てテスト自動で検査デプロイ本番へ配る(多くは Docker イメージ)止まって差し戻し(本番へ出さない)小さく頻繁に出すほど、壊れても原因を絞りやすく、すぐ戻せる(=安全)

登場人物メモ:

  • ※1 パイプライン・アズ・コード — CI/CDの段取りを設定ファイルとして記述し、履歴管理する書き方
  • ※2 昇格(プロモート) — 同じ成果物を、下の環境から上の環境へ順に進めること
  • ※3 出所(provenance) — その成果物が「どのソースから・どの手順で作られたか」の証明
やさしく言うと(中級

CI/CD の本体は パイプライン——ソース取得→ビルド→テスト→デプロイと 自動でつながった段取り です。各段階を ステージ と呼びます。

  • トリガ(※1)— パイプラインを起こす引き金。コードの変更の push やプルリクエストで起動する
  • ビルド — コードを動く形(多くはDockerイメージ)に組み立てる
  • テスト — 自動検査。ここで失敗(✗)すれば流れを止めて差し戻す
  • デプロイ — 通った 成果物(※2 アーティファクト)を環境へ配る
アニメーション『CI/CDパイプラインの流れ』を開く
pushが引き金(トリガ)コミットgit の変更を送るビルド動く形に組み立てテスト自動で検査デプロイ本番へ配る(多くは Docker イメージ)止まって差し戻し(本番へ出さない)小さく頻繁に出すほど、壊れても原因を絞りやすく、すぐ戻せる(=安全)

登場人物メモ:

  • ※1 トリガ — パイプラインを起動させるイベント(push・プルリクエストなど)
  • ※2 アーティファクト(成果物) — ビルドで出来た配布物。同じ物を各環境へ配る
  • ※3 ロールバック — 問題が出たとき、1つ前の正常な状態へ戻すこと

アーティファクトとキャッシュ

流れを速く・安全にする鍵は、作り直さないことです。

  • 一度ビルドしてどこでも使うDockerイメージなどの成果物(アーティファクト)を1回だけ作り、各環境へは同じ物を昇格させる。環境ごとに作り直すと「本番だけ別物」が生まれる
  • キャッシュ — 依存ライブラリや中間生成物を保存し、変わっていない部分の再取得・再ビルドを省く。ただしキャッシュのキーがずれると古い物を掴むので、鍵の付け方が肝
  • べき等なデプロイ — 同じ成果物を同じ環境へ何度配っても結果が同じになるように設計する。途中で失敗しても、もう一度流せば安全に立て直せる

環境の昇格とデプロイ戦略

いきなり全利用者へ出すのは危険です。段階を踏み、切り替え方そのものを選びます。

  • 環境の昇格 — 開発→ステージング→本番と、同じ成果物を順に進める。各段でテストや承認を挟む
  • ローリング — サーバを少しずつ新版へ入れ替える。落とさず進むが、新旧が一時混在する
  • ブルーグリーン — 新版の環境(緑)を丸ごと用意し、入口を一斉に切り替える。問題が出たら入口を戻すだけで即ロールバック
  • カナリア — 新版をまず一部の利用者にだけ配り、指標を見て問題なければ徐々に広げる。異常を小さな範囲で早く掴める
  • ロールバック — どの戦略でも「すぐ前の版へ戻せる」備えを前提にする。Kubernetesなどは版を記録し、戻す操作を一手で行える
やさしく言うと(中級
  • 環境の段階 — いきなり本番ではなく、本番同等の ステージング で最終確認してから出す
  • ロールバック(※3)— 問題が出たら すぐ前の版へ戻せる 備えを用意しておく
  • 小さく頻繁に — 1回の差分を小さく保つと、壊れても原因の切り分けと戻しが容易
  • 失敗は止める — テストが赤なら先へ進めない設定にし、壊れを本番の手前で堰き止める

なぜ小さく頻繁が安全か。大きな変更をまとめて出すと、失敗時に どの変更が原因か分からず、戻すと他の正常な変更まで巻き添えにします。小さければ、その1つを戻すだけで済みます。

CIでの秘密情報の扱い

パイプラインはデプロイ鍵やAPIキーに触れます。ここが漏れると全体が崩れます。

  • コードに直書きしない — 秘密は専用の金庫に置き、実行時に環境変数などで注入する
  • ログのマスキング — 秘密が出力に紛れても伏せ字にする。うっかり表示で漏らさない
  • 最小権限 — そのジョブに必要な権限だけを、必要な時だけ与える
  • 短命トークン — 長期の固定鍵より、その実行だけ有効な使い捨てトークン(OIDC連携など)が安全。盗まれても寿命が尽きている

サプライチェーンセキュリティ

「自分のコードは安全」でも、取り込む部品や配布経路が汚染されれば台無しです。近年ここが攻撃の的になっています。

  • SBOM — 成果物に含まれる部品の一覧表(Software Bill of Materials)。どのライブラリのどの版が入っているか分かれば、脆弱性が出たとき影響範囲を即座に洗える
  • 署名 — 成果物に電子署名を付け、受け取り側が改ざんされていないことを確認できるようにする
  • 出所検証(provenance) — 「この成果物は正規のパイプラインで、このソースから作られた」という証明を残し、検証する。横から差し込まれた偽物を弾く

⚠️ 深いところの落とし穴

  • 環境ごとの作り直し — 同一成果物を昇格せず作り直すと、テストで確かめた物と本番の物が食い違う
  • キャッシュの取り違え — 鍵の設計が甘いと古い依存を掴み、「手元では直ったのにCIで再発」する
  • 戻せないデプロイ — ロールバック手段のない切り替えは、障害時に復旧が長引く
  • 秘密のログ流出 — マスキング漏れや冗長なデバッグ出力で、鍵が履歴に残ってしまう
やさしく言うと(中級
  • テスト不足 — 検査が薄いと、壊れが本番へ通り抜ける
  • パイプラインが遅い — 検査に時間がかかると、開発全体が詰まる
  • 環境差 — 本番とステージングの構成がずれると、通ったのに本番で落ちる
  • 戻せない設計 — ロールバック手段がないと、障害時に復旧が長引く

理解度チェック

そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。

1. 同じアーティファクトを開発・ステージング・本番へ配るのが基本とされる理由は?

2. カナリアデプロイの説明として正しいのは?

3. ブルーグリーンデプロイの説明として最も正しいのは?

4. ローリングデプロイの特徴として正しいのは?

5. 成果物の「出所検証(provenance)」が狙う効果として正しいのは?

6. CIで秘密情報(デプロイ鍵やAPIキー)を扱うときの安全な方法はどれ?

7. 成果物にどのライブラリのどの版が含まれるかを一覧化した「部品表」を、英字4文字の略語で答えてください。

8. CI/CDの段取り自体を設定ファイルとして記述し、Gitで履歴管理する書き方を「パイプライン・アズ・○○」と呼びます。○○を答えてください。