継続的デプロイメント・パイプライン
継続的デプロイメントパイプラインは、すべてのエビデンスと変更要求の要約コンテンツを生成する。 パイプラインは、ビルド成果物をステージングやプロダクションなどの環境にデプロイし、既存のログファイル、エビデンス、成果物をすべて収集、作成し、エビデンスロッカーにアップロードする。
ステージとタスク
次の表は、CDパイプラインで実行されるタスクの一覧です。 さらに、この表には、以下の各ステージの概要も示されています。
-
タスクまたはステージ: これは、
.pipeline-config.yaml構成ファイル内で定義されているステージの名前を参照します。 -
簡略説明: ステージの実行中に実行されたアクションについて簡潔に説明します。
-
許容されるカスタマイズ: これは、
.pipeline-config.yamlファイルにカスタム・スクリプトを挿入することによって、ステージのデフォルトの動作を変更または置換する柔軟性がユーザーにあるかどうかを示します。 -
デフォルトの参照実装:これは、DevSecOpsパイプラインに、ステージのための事前定義またはデフォルトの実装が付属しているかどうかを示します。 特に、「
unit-tests」や「setupような特定のステージでは、DevSecOpsパイプラインはすぐに使える実装を提供していない。 代わりに、ユーザーは、アプリケーションの要件に合わせて調整されたカスタム・スクリプトまたはコードを提供する必要があります。 -
エビデンス・コレクション: ステージが標準エビデンスの収集を実行するかどうかを示します。 DevSecOps Pipeline がステージのリファレンス実装を提供する場合、証拠収集はすぐに実行される。 ただし、 「ユーザー」 がこれらの事前定義ステージを変更または置換することを選択した場合は、カスタム実装に適切なエビデンス・コレクションが含まれていることを確認する必要があります。 DevSecOpsパイプラインがすぐに使える実装を提供しないステージでは、同じ責任がユーザーにあり、ユーザーが証拠収集を行う必要がある。 この列は、エビデンス収集の実行を担当するエンティティー (ユーザー/パイプライン) を示します。
-
スキップ可能 (バージョン> = v10に適用可能): これは、
.pipeline-config.yamlでスキップ・プロパティーを true に設定することによって、ユーザーがこのステージの実行をオプトアウトできるかどうかを示します。 ただし、この機能を使用する場合、特に証拠を収集するために設計されたステージでは注意が必要です。 このようなステージをスキップすると、ビルドに不可欠な証拠が欠落する可能性があります。
| タスクまたはステージ | 簡略説明 | .pipeline-config.yaml で許容されるカスタマイズ |
デフォルトの参照実装 | エビデンスの収集 | スキップが許可されます |
|---|---|---|---|---|---|
start |
パイプライン環境をセットアップします。 | いいえ | ある | NA | いいえ |
setup |
ビルドとテストの環境をセットアップします。 | ある | いいえ | NA | いいえ |
verify-peer-review |
現在のデプロイメント用のプル要求が承認されていることを確認します。 このステージは、進行中のデプロイメントにリンクされたプル要求のリストを生成します。 いずれかのプル要求が未承認のままである場合、デプロイメントは停止されます。 | ある | ある | パイプライン | ある |
verify-artifact |
デプロイメント用にスケジュールされたイメージの正しい署名を検証します。 イメージに適切な署名がない場合、デプロイメントは妨げられ、対応する証拠収集プロセスが開始されます。 | ある | ある | パイプライン | ある |
change-request |
変更要求を生成し、エビデンス・サマリーを作成します。 | いいえ | ある | パイプライン | いいえ |
deployment |
ビルド成果物をステージングや実動などの環境にデプロイします。 | ある | いいえ | NA | いいえ |
acceptance-test |
デプロイメントに対して受け入れテストと統合テストを実行します。 | ある | いいえ | ユーザー | ある |
finish |
ログ・ファイル、成果物、エビデンスを収集し、エビデンス・ロッカーにアップロードします。 | ある | ある | パイプライン | ある |
rollback |
これは、ロールバック・シナリオが検出されるたびに実行される prod-finish 内のステップです。 |
ある | ある | NA | いいえ |
.pipeline-config.yaml ファイルを使用してステージをカスタマイズする方法については、 カスタ ムスクリプトと パイプラインパラメータリストを 参照してください。
デプロイメント・デルタ
インベントリ・プロモーションの準備ができたら、継続的デプロイメント・パイプラインを開始できる。 デプロイメント・デルタは、完了した最後のデプロイメントの内容と、現行のデプロイメントの内容との差分です。 デプロイメント・デルタは、デプロイされるインベントリー項目のリストです。
デプロイメント・スクリプト内のデプロイメント差分にアクセスするには、以下のコマンドを使用できます。
# return a JSON file path with an array of inventory entries that were changed
get_env DEPLOYMENT_DELTA_PATH
# return a JSON file path with an array of inventory entries that were deleted
get_env DEPLOYMENT_DELTA_DELETIONS_PATH
# returns a JSON file path with an array of all inventory entries
get_env INVENTORY_ENTRIES_PATH
デプロイメント BOM の計算
デプロイメント部品構成表 (BOM) は、1 回の変更要求の一部としてデプロイされるすべての成果物を表します。 デプロイメント・デルタが計算された後に、パイプラインはこれらの項目に基づいてデプロイメント BOM を作成します。
エビデンス・サマリーの収集
エビデンス・サマリーは、デプロイメントにつながる関連ビルド時に作成されたすべてのエビデンスから作成されます。 デプロイメントそのものの間に作成されたエビデンスもサマリーに追加されます。 エビデンス・サマリーは変更要求の説明に追加されます。 デフォルトでは、エビデンス・サマリーは、CI パイプラインで収集されたビルド時のエビデンスと、現在の CD パイプライン実行中に収集されたエビデンスで構成されます。
以下の手順は、実稼働環境をターゲットとする CD パイプラインにのみ適用されます。 target-environment-purpose フラグを使用して、環境が pre_prod または production のどちらとして指定されているかを判別します。
前提条件: pre_prod 環境をターゲットとする CD パイプラインで、pre-prod-Evidence-collection フラグを 1 に設定します。 これにより、CD パイプラインによってデプロイされたすべての資産のエビデンス・ロッカーでのビルド時のエビデンスの収集と保管が可能になり、実動前環境でのデプロイメントが実行されます。 デフォルトでは、pre_prod として指定された環境の場合、pre-prod-Evidence-collection フラグは 1 に設定されます。
実稼働環境をターゲットとする CD パイプラインで、prod-evidence-collection より前のフラグを 1 に設定します。 これにより、実稼働環境をターゲットとする CD パイプラインは、実動前環境へのデプロイメント中に収集されたエビデンスを取得できます。 デフォルトでは、実稼働として指定された環境の場合、 pre-prod-evidence-collection フラグは 0 に設定されます。
pre-prod-evidence-collection フラグが 1 に設定されると、実稼働環境をターゲットとして CD パイプラインによって生成される変更要求には、 「検証レコード」 フィールド内の実稼働前環境からの変更要求 ID への参照が含まれます。
詳しくは、 エビデンスの要約 を参照してください。
変更要求の準備と作成
ベースラインの変更が伴う操作はすべて、変更要求によってトレースする必要があります。 これらの変更には既存のコード・レベルの更新、構成の変更、ワーカー・ノードの更新が含まれます。 ピア・レビュー・コンプライアンス・データの収集は、インベントリー、エビデンス・ロッカー、およびインシデント Issue リポジトリーでアクセス可能なデータに基づいて行われます。
後続のステージで変更要求 ID の値を利用するには、get_env CHANGE_REQUEST_ID を使用します。
これは内部実装のみを目的としているため、 set_env を使用する変数の値を変更しないでください。
このステップでは、プロモーション・プル要求の各フィールドに基づいて取得できるコンプライアンス・データを添付することによって、変更要求を作成します。 デプロイメント準備状況は、収集されたコンプライアンス状況の中で取得できるエビデンスに基づいて計算されます。
プレプロダクションのエビデンスがプロダクションのデプロイメントに取り込まれる場合、プレプロダクションの変更要求はプロダクションの変更要求にリンクされる。 詳しくは、 変更依頼に含まれるデータ を参照してください。
専用の変更要求リスナーを使用することで、複数のリージョン、ターゲット、クラスターへのデプロイを含む、異なる デプロイ構成 向けの複数の変更要求を事前に作成できます。 事前作成された変更要求は、承認後、事前計算された情報を活用して実際のデプロイを高速化するジャストインタイム方式でデプロイメントパイプラインに受け渡すことが可能です。
変更要求承認の検査
単体テスト、Code Risk Analyzerタスク、ブランチ保護、秘密の検出など、すべてのコンプライアンスチェックが成功すると、変更要求が自動的に承認され、タスクが正常に実行される。 詳しくは、 変更管理の自動化 を参照してください。
コンプライアンス検査が失敗すると、変更要求状態は承認されません。 手動で変更リクエストを承認 し、 change-request-id を環境プロパティに追加して、次の実行で以前に作成した変更リクエストを使用することができます。 また、変更要求を手動で承認して緊急ラベルを追加することもできます。
デプロイメント
デプロイ段階では、パイプラインはビルドされた成果物をステージングやプロダクションなどの環境にデプロイする。 これらのステージの変数と資格情報は、以下のソースで見つかります。
- パイプライン UI にある変数 (
get_env)
これらの変数にアクセスする方法について詳しくは、カスタム・スクリプトを参照してください。
受け入れテスト
自動化された一連のテストを実行して、デプロイメントが正常に終了したこと、そして予期したように作動していることを検証することができます。 トレースを容易に行えるように、コード・レベルまたはテストされるイメージへの参照情報がテスト・ログに含まれていることを確認してください。
変更要求の終了
デプロイメントの詳細は終了サマリー変更タスクにアップロードされ、その後にこのタスクによって変更要求がクローズされます。 close_category は、以下の値を使用して終了変更要求タスクに追加されます。
- 成功(デプロイ準備が整い、CDデプロイが成功した場合)
- 問題で成功 (要約に問題がある場合は、デプロイの準備ができておらず、緊急時に CD デプロイメントが行われた)
インベントリーの終了
インベントリーの終了に関して詳しくは、インベントリーを参照してください。
アプリケーションを再デプロイする
概要
インフラストラクチャの変更後にアプリケーションがクラッシュしたり予期しない動作をした場合、問題を解決するために再デプロイを強制できます。
手動CD パイプライン実行をトリガーする際に、デフォルトの変更検出動作 force-redeploy=true を上書きするために使用します。 この設定により、新しい変更が検出されなくても、パイプラインは完全なインベントリを再デプロイするよう指示されます。
デフォルトの動作(強制再デプロイなし)
が force-redeploy 設定されていないか、 false に設定されている場合、パイプラインは対象環境のインベントリリポジトリで新しい変更が検出されたときにのみデプロイされます。
-
CDパイプラインが開始し、現在のコミットにパイプライン実行IDのタグを付ける。
-
パイプラインはそのタグから対応する環境ブランチの内容を読み取ります。
-
パイプラインは、現在のコミットと
<target-environment>_latestタグに関連付けられたコミットとの間のデプロイメントデルタを計算する。 -
パイプラインは差分(デルタ)を評価します:
- デルタが空の場合、パイプラインは停止し、デプロイメントは発生しません。
- デルタに変更が含まれている場合、パイプラインは継続する。
-
パイプラインはデルタで特定された変更を展開します。
-
デプロイが成功すると、パイプラインは新しいコミットに タグ
<target-environment>_latestを付与します。
強制行動(フォース再配置付き)
が に設定されている force-redeploy``true 場合、パイプラインはデルタ検証をバイパスし、検出された変更の有無にかかわらず、完全なインベントリを再デプロイします。 このアプローチにより、アプリケーションの状態全体がデプロイ先に対して再適用されることが保証されます。
- CDパイプラインが開始し、現在のコミットにパイプライン実行IDのタグを付ける。
- パイプラインはそのタグから対応する環境ブランチの内容を読み取ります。
- パイプラインはデプロイメント差分を計算しますが、このシナリオでは通常空です。
- この
force-redeploy=true設定により、パイプラインは差分チェックをスキップして処理を続行します。 - パイプラインはブランチからアプリケーション状態全体を再デプロイします。
- 再デプロイが成功すると、パイプラインは直前にデプロイしたコミットにタグ
<target-environment>_latestを付与します。
手順
-
新しい手動CD パイプラインの実行を開始します。
-
パイプラインの設定で、環境
force-redeploy変数を に設定してくださいtrue。 -
パイプラインを実行します。
デプロイメントをロールバックする
概要
ロールバックは、デプロイメントによって不安定性、障害、またはコンプライアンス問題が発生した場合に、以前のデプロイメントを元に戻し、既知のアプリケーション状態を復元します。 ロールバックは通常、サービスの信頼性を回復するため、構成の一貫性を強制するため、または規制への準拠を維持するために行われます。
3つのロールバック手法が利用可能であり、それぞれ異なる復旧シナリオに適しています:
- 完全ロールバック :変更要求 ServiceNow IDを参照して、最後に正常と確認された構成を復元します。 管理された監査可能な復旧に推奨されます。
- GitOpsを使用した完全なロールバック :インベントリリポジトリ内のコミットを手動で元に戻すことで、以前の状態を復元します。 コンプライアンス対応が限定的であるため、推奨されません。
- インラインロールバック: 実行エラーが発生した場合、同じパイプライン実行内で失敗したデプロイを元に戻します。
完全なロールバック
ロールバック・パイプラインの概要
このパイプラインでは、特定の ServiceNow 変更要求ID(例: CHG-12345)を指定することで、以前の正常な構成にロールバックできます。
この変更要求IDは、正常なデプロイメントの固有のブックマークとして機能し、ロールバックパイプラインに必要な入力項目です。
以前のデプロイメントの変更要求IDは、次の2つの方法で確認できます:
- ServiceNow: 復元したいデプロイメントの変更リクエストを検索してください。
- インベントリリポジトリ :インベントリの状態はソース管理で管理されるため、各デプロイメントはコミットによって一意に識別されます。 元に戻したいコミットを見つけ、そのコミットに関連付けられたタグ
CHG-***を特定できます。
ロールバックパイプラインには以下の段階が含まれます:
prod-rollback-startprod-setupprod-rollback-change-requestprod-deploymentprod-acceptance-testsprod-rollback-finish
パイプラインの実行は、環境 rollback-change-request-id プロパティの情報を使用して新しい変更要求を作成します。
コンプライアンスを維持するため、パイプラインは前回のデプロイに関連する問題を再オープンします。 これらの課題は新しい変更要求に添付されており、元の期限は変更されていません。 ロールバックが成功すると、インベントリ内のタグ _latest が前のコミットに移動します。
ロールバック パイプラインを作成する
を実行して cd-rollback-listener 、最後に正常と確認されたバージョンへのロールバックをトリガーします。
- CDパイプラインに移動してください。
- 手動トリガーを追加するか、 手動CDトリガー を複製してください。
- トリガーを編集し、リスナーを に設定します
cd-rollback-listener。 - **「保存」**を選択します。
- 必要な各リージョンとターゲット環境の組み合わせごとに、個別のトリガーを作成してください。
ロールバック パイプラインをトリガーする
ロールバック パイプラインの実行では、次の環境プロパティが使用されます:
| 環境のプロパティー | 説明 |
|---|---|
rollback-change-request-id |
(必須) ロールバックしたい完了済みデプロイメントの変更要求ID |
rollback-limit |
ロールバック可能なデプロイメントの最大数。 デフォルトは1(最後に完了したデプロイ)です。 |
region |
ロールバックの対象領域。 |
target-environment |
ロールバックの対象環境(例:ステージング環境または本番環境)。 |
以下の条件を満たさない限り、パイプラインは終了する:
rollback-change-request-id同じリージョンおよびターゲット環境に対する完了済みデプロイメントのIDでなければなりません。- 関連するデプロイメントは、rollback-limit で指定
rollback-change-request-idされたデプロイメント数を超えて古いものであってはならない。
Tektonの環境 PIPELINE_NAME プロパティは、実行がデプロイメントかロールバックかを決定します。
cd-rollback-pipelineロールバックのデフォルト値。cd-pipelineデプロイメントのデフォルト値。
このプロパティを使用して分岐ロジックをカスタマイズできます。
完全なロールバックを使用して GitOps
ロールバックの概要 GitOps
継続的デプロイメント パイプラインを使用して、変更を特定のバージョンにロールバックする操作 Git を実行し、以前の commit-id バージョンのインベントリをターゲット環境にデプロイします。
変更 ServiceNow 要求IDでロールバックパイプラインをトリガーする代わりに、インベントリリポジトリ内で直接コミットを元に戻しているため、このプロセスでは以前のコンプライアンス問題が自動的に再開されたり、その期限が管理されたりすることはありません。
CDパイプラインがトリガーされると、再デプロイのために以下のステップを完了します:
- パイプラインが開始し、現在のコミット(差し戻しコミット)にパイプラインの実行IDをタグ付けします。
- パイプラインはそのタグから対応する環境ブランチの内容を読み取ります。
- パイプラインは、現在のコミットと
<target-environment>_latestタグに関連付けられたコミットとの間のデプロイメントデルタを計算する。 - デプロイが成功した後、タグ
<target-environment>_latestは新しい(元に戻された)コミットに移動されます。
ロールバックプロモーションのプルリクエストを作成する
- ロールバックしたいデプロイメントバージョンのインベントリ内の
commit-idIDを特定してください。 - リポジトリの状態をそのコミットの状態に戻す。
- 元に戻した状態を反映させるプルリクエストを作成する。
以下の例は、コマンド git を使用してこのシナリオを示しています。
-
コミットとタグを一覧表示し、最終的に正常な状態だったコミットIDを検索する(例:
refs/tags/8)# /c/usr/devsecops/compliance-inventory (master) $ git show-ref --tags ... 83f7a87ee59185eaeac554bd3abeebfd2c1b4ad8 refs/tags/8 ... 1914a125e76aa97c497f4bd2c2f455b58cf079b8 refs/tags/prod_latest -
現在の状態 (
refs/tags/prod_latest) と目標状態 (refs/tags/8) の間のすべてのコミットを一覧表示する。# /c/usr/devsecops/compliance-inventory (master) $ git rev-list --no-merges HEAD...83f7a87ee59185eaeac554bd3abeebfd2c1b4ad8 67cc8babdff3e09c1f0e632f897798c1b5424f38 6fab5ce3d60590cd858206424ecfd7d3a8c9ceb4 ... -
インベントリの状態をターゲットコミット(
refs/tags/8)にロールバックする。# /c/usr/devsecops/compliance-inventory (master) $ git revert -n $(git rev-list --no-merges HEAD...83f7a87ee59185eaeac554bd3abeebfd2c1b4ad8) -
新しい状態をコミットする。
# /c/usr/devsecops/compliance-inventory (master|REVERTING) $ git commit -m "revert master to 83f7a87ee59185eaeac554bd3abeebfd2c1b4ad8" [master af82538] revert master to 83f7a87ee59185eaeac554bd3abeebfd2c1b4ad8 -
更新をマスターブランチにプッシュする。
# /c/usr/devsecops/compliance-inventory (master) $ git push --set-upstream origin master ... To [https://us-south.git.cloud.ibm.com/jaunin.b/compliance-inventory.git](https://us-south.git.cloud.ibm.com/jaunin.b/compliance-inventory.git) 67cc8ba..af82538 master -> master ...
継続的デプロイメントパイプラインをトリガーする
-
ロールバックプロモーションの変更に対するプルリクエストを作成してください。
-
プルリクエストをレビューし、マージする。
-
CDツールチェーンで手動CD パイプラインの実行をトリガーします。
インライン・ロールバック
インラインロールバックの概要
このモードは、同じパイプライン実行のコンテキスト内で現在のデプロイをロールバックします。 デプロイメントまたは受入テストの段階でエラーまたは障害が発生し、デプロイメントの試行が失敗としてマークされる場合に必要です。
環境 rollback-enabled プロパティが に設定されており、デプロイメント 1 または受入テスト段階で障害が発生した場合、インラインロールバックが自動的に実行されます。
ロールバックがトリガーされた場合、CDパイプラインは設定 .pipeline-config.yaml``rollback ファイルで定義されたセグメントを実行します。 ファイルにセグメント rollback が定義されていない場合、デフォルトの実装が実行され、ロールバックスクリプトの提供を促します。
ロールバックスクリプトの例 .pipeline-config.yaml:
rollback:
image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.74
script: |
#!/usr/bin/env bash
if [[ "$PIPELINE_DEBUG" == 1 ]]; then
trap env EXIT
env
set -x
fi
source $WORKSPACE/$PIPELINE_CONFIG_REPO_PATH/scripts/deploy_setup.sh
source $WORKSPACE/$PIPELINE_CONFIG_REPO_PATH/scripts/rollback.sh
インラインロールバック中に設定されるプロパティ
rollback-statusロールバックステップのステータスを示します。 考えられる値:[notRun, success, failure]rollback-exit-codeロールバックステップの終了コード。 ロールバックが実行されなかった場合、この値は空になります。default-rollback-executedデフォルトの実装(スクリプトの入力を促すもの)が実行された場合にtrue設定する。 この値はデフォルトでは空である。pipeline-execution-status: パイプライン全体の実行状態を示します。 考えられる値:[successful_deployment, failed_deployment_failed_rollback, failed_deployment_successful_rollback]
展開の追跡可能性を実現
PRまたはマージリクエストがマージされると、システムは次に何が起こるかを明確に可視化することで、透明性と追跡可能性を向上させます。 デプロイ状況を自動的にPRに反映することで、利害関係者はパイプラインの詳細にアクセスすることなく、修正や機能の進捗状況を簡単に追跡できるようになります。 この合理化されたアプローチは、透明性を向上させるだけでなく、追跡可能性も高め、情報の収集と検証に必要な労力を削減します。 展開が成功すると、展開に含まれるプルリクエストに deploy:{region}:{env} という形式のラベルが適用されます。
CDパイプラインでこの機能を有効にするには、オプトインフラグ deployment-traceability が利用可能です。 ユーザーは必要に応じて、 1 にフラグを立てることで、展開の追跡可能性を有効にすることができます。
この機能をさらにサポートするために、ユーザーがアプリリポジトリ内のPRにラベルを追加するための特定のトークンを提供したい場合、 Gitを指定するために以下の環境プロパティを使用することができます。 Gitが検索される順序は以下の通りです
- リポジトリ固有のトークン用の既存の環境プロパティ:
git-token-$repo_name-$repo_org。 - 組織固有のトークン用の新しい環境プロパティ:
git-token-$repo_org。