デプロイ承認はチームを遅くするものではない
変更の準備が整いました。テストもレビューも済んで、ブランチにデプロイ待ちの状態です。しかし、誰かがボタンを押す前に、こんな質問が上がります。「誰の承認が必要?」
影響を受けそうな人を全員リストアップするチームもあります。マネージャーの承認、リードエンジニアの確認、QAリーダーの確認、セキュリティ担当者のレビュー。気づけば、たった1回のデプロイに5人もの承認が必要になり、それぞれの返答に1時間から2日かかります。
結果は明白です。チームは待たされ、デプロイは停滞します。そして、何か問題が起きたとき、それらの承認は何も防いでくれません。プロセスは安全性を高めることなく、遅延だけをもたらしました。
これはよくある落とし穴です。承認を増やすとコントロールが効いているように感じます。しかし実際には、承認レイヤーはチームを遅くするだけで、誤った安心感を生み出します。重要なのは「誰が承認するか」ではなく、「この変更がどれだけのリスクを伴い、チームがそれに対処する準備ができているか」です。
リスクベースガバナンス:影響に応じたチェック
より良いアプローチは、変更の実際のリスクに応じて精査のレベルを合わせることです。これはリスクベースガバナンスと呼ばれますが、考え方は名前ほど複雑ではありません。
低リスクの変更は迅速に進めるべきです。高リスクの変更はより多くのチェックを受けるべきです。チェックは必ずしも承認待ちを意味しません。より徹底した自動テスト、特定部分の手動検証、問題発生時の影響範囲を限定することなどが含まれます。
2つの例を考えてみましょう。チームが設定ページのボタンの色を変更したいとします。影響はごくわずかで、ユーザーは気づかないかもしれません。何か壊れても、最悪のケースはボタンが見えにくくなる程度です。この変更は誰の承認も待たずに本番環境にデプロイできます。
次に、トランザクションテーブルのデータベーススキーマを変更する必要があるとします。影響は大きく、ミスがあればデータが破損したり、顧客レコードが失われる可能性があります。この変更にはより多くの準備が必要です。本番環境に近い環境でのマイグレーションテスト、ロールバック計画の準備、データベースを理解している人によるスクリプトの検証です。
以下は、低リスクの変更では手動承認をスキップし、高リスクの場合にのみ要求するYAMLパイプラインのスニペットです。
# .github/workflows/deploy.yml (抜粋)
name: Deploy
on: [push]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: リスクレベルの判定
id: risk
run: |
changed=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }})
if echo "$changed" | grep -qE "^(db/|src/payments/)"; then
echo "level=high" >> $GITHUB_OUTPUT
else
echo "level=low" >> $GITHUB_OUTPUT
fi
- name: 高リスク変更の手動承認
if: steps.risk.outputs.level == 'high'
uses: trstringer/manual-approval@v1
with:
secret: ${{ secrets.APPROVAL_TOKEN }}
approvers: team-leads
- name: デプロイ
run: ./deploy.sh
同じチーム、同じデプロイパイプラインでも、精査のレベルが異なります。これがリスクベースガバナンスの実践です。
リスクレベルの判断方法
チームには、変更が低リスクか高リスクかを判断する実用的な方法が必要です。以下に役立つ4つの要素を示します。
以下は、リスク評価を適切なデプロイパスにマッピングするフローチャートです。
影響範囲はどの程度か? 変更は1つの小さな機能に影響するのか、システム全体に影響するのか? めったに使われない管理ページの変更は、ログインフローの変更よりも影響が小さいです。
変更対象の重要度は? ユーザーデータ、支払い、認証を扱う部分ですか? これらの領域は、見た目の変更よりも慎重に対処する必要があります。
元に戻すのはどの程度簡単か? 数秒でロールバックできますか、それとも数時間かかりますか? データベースマイグレーションは、コード変更よりも元に戻すのが難しいことが多いです。モバイルリリースは、Webデプロイよりも引き戻すのが困難です。
障害への備えはどの程度あるか? 問題を迅速に検出できるモニタリングはありますか? 問題対応のためのランブックはありますか? 優れた可観測性と明確な復旧手順があれば、リスクの高い変更でも迅速に進められます。
これらの要素は、チームが一貫した判断を下すのに役立ちます。同じチームが、1日に10個の小さな変更を摩擦なくデプロイし、その後1つの大きな変更に時間をかけられます。これは矛盾ではなく、比例したリスク管理です。
承認者リストではなく、準備完了基準
誰の承認が必要かと問う代わりに、デプロイ前に満たすべき条件を定義しましょう。これが準備完了基準であり、変更自体から導き出されるべきもので、誰かの役職から決まるものではありません。
低リスクの変更の場合、準備完了基準はシンプルです。すべての自動テストが合格し、ステージング環境で新しいエラーが発生していないこと。
高リスクの変更の場合、準備完了基準には以下が含まれます。負荷テストの完了、マイグレーションスクリプトのセカンドペアによる検証、ロールバック計画の文書化とテスト、モニタリングダッシュボードの動作確認。
基準は客観的です。最も声の大きい人や役職の高い人に依存しません。変更を安全にするために必要なものに依存します。
このアプローチにより、チームは動き続けられます。低リスクの変更は不要な承認で停滞しません。高リスクの変更は、実際にはリスクを減らさない署名待ちのゲームになることなく、必要な注意を払えます。
チームのための実践的チェックリスト
今日から適用したい場合のシンプルなフレームワークを紹介します。
- すべての変更について、「最悪のケースは何か?」を問う。
- 最悪のケースが軽微なら、待たずにデプロイする。
- 最悪のケースが深刻なら、デプロイ前に必要なチェックを定義する。
- それらのチェックを、別の承認ステップではなく、プロセスの一部にする。
- 基準を定期的に見直す。6ヶ月前にリスクに感じたことが、今では日常的になっているかもしれません。
まとめ
スピードと安全性は相反するものではありません。最速のチームは、承認が最も少ないチームではありません。プロセスを各変更の実際のリスクに合わせているチームです。「誰の承認が必要か」と問うのをやめ、「変更を安全にするために何が必要か」と問い始めると、必要な保護を失うことなく、不要な摩擦を取り除けます。チームはより速く動き、本番環境は安定したままです。