連續部署管線
連續部署管線會產生所有證明及變更要求摘要內容。 管線會將建置構件部署至環境 (例如暫置或正式作業),然後收集、建立並將所有現有日誌檔、證明及構件上傳至證明櫃。
階段和作業
下表列出了在 CD Pipeline 中執行的任務。 此外,此表格還提供下列每一個階段的概觀:
-
作業或階段: 這是指
.pipeline-config.yaml配置檔內所定義的階段名稱。 -
簡要說明: 這會提供在階段執行期間所執行之動作的簡要說明。
-
允許自訂: 這指出使用者是否有彈性在
.pipeline-config.yaml檔中插入自訂 Script 來修改或取代階段的預設行為。 -
預設參考實作:這指示DevSecOps管道是否附帶該階段的預定義或預設實作。 值得注意的是,對於某些階段(例如
unit-tests或setup,DevSecOps管道不提供任何開箱即用的實作。 相反地,使用者必須提供自訂 Script 或自訂程式碼,以符合其應用程式的需求。 -
證明收集: 這指出階段是否執行標準證明收集。 當DevSecOps Pipeline 為某個階段提供參考實作時,證據收集是開箱即用的。 不過,如果 使用者 選擇修改或取代這些預先定義的階段,則必須確保其自訂實作包括適當的證明集合。 對於DevSecOps管道不提供開箱即用的實施的階段,使用者也承擔同樣的責任,需要他們執行證據收集。 該直欄指出負責執行證明收集的實體 (使用者/管線)。
-
跳過允許 (適用於版本> = v10): 這指出使用者是否可以在
.pipeline-config.yaml中將 skip 內容設為 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 檔案來自訂階段的相關資訊,請參閱 自訂 Script 及 管線參數 清單。
部署差異
當庫存提升備妥時,可以開始持續部署管線。 部署差異是前次完成部署與現行部署的內容之間的差異。 部署差異會列出正在部署的庫存項目。
若要存取部署 Script 中的部署差異,您可以使用下列指令:
# 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) 代表在單一變更要求中部署的所有構件。 計算部署差異之後,管線會根據這些項目來建立部署 BOM。
收集證明摘要
會從導致部署的相關建置期間所建立的所有證明建立證明摘要。 部署本身期間建立的證明也會新增至摘要。 證明摘要會新增至變更要求的說明。 依預設,證明摘要包含在 CI 管線中收集的建置時期證明,以及在現行 CD 管線執行期間收集的證明。
下列指示僅適用於以正式作業環境為目標的 CD Pipeline。 使用 target-environment-purpose 旗標可判定環境是否指定為 pre_prod 或 production。
必要條件: 在以 pre_prod 環境為目標的 CD 管線中,將 pre-prod-evidence-collection 旗標設為 1。 這可針對 CD Pipeline 所部署的所有資產,在證明櫃中收集及儲存建置時期證明,並在前置正式作業環境上執行部署。 依預設,對於指定為 pre_prod 的環境,pre-prod-evidence-collection 旗標設為 1。
在以正式作業環境為目標的 CD 管線中,將 prod-evidence-collection 之前的旗標設為 1。 這可讓以正式作業環境為目標的 CD Pipeline 擷取在部署至前置正式作業環境期間所收集的證明。 依預設,對於指定為正式作業的環境,pre-prod-evidence-collection 旗標會設為 0。
一旦 pre-prod-evidence-collection 旗標設為 1,以正式作業環境為目標的「CD 管線」所產生的「變更要求」,將會在 驗證記錄 欄位內包含前置正式作業環境中「變更要求 ID」的參照。
如需相關資訊,請參閱 證明摘要。
準備並建立變更要求
變更 基準線 的所有項目都必須透過變更要求來追蹤。 這些變更包括現有程式碼層次的更新、配置的變更,以及工作者節點的更新。 同層級檢閱相符性 資料的集合是根據庫存、證明櫃及發生事件問題儲存庫中可存取的資料。
使用 get_env CHANGE_REQUEST_ID 來利用後續階段中「變更要求 ID」的值。
不要更改使用的變數的值 set_env 因為這僅用於內部實作。
此步驟會根據 促銷取回要求 欄位來附加可用的相符性資料,以建立變更要求。 部署就緒狀態 是根據所收集相符性狀態中的可用證明來計算的。
如果在生產部署中捕獲了預生產證據,則預生產變更請求將連結到生產變更請求。 如需相關資訊,請參閱 變更要求中包含的資料。
可透過專用變更請求監聽器預先建立多個變更請求,以支援不同 部署配置,包括部署至多個區域、目標及叢集。 這些預先建立的變更請求,經核准後可即時傳遞至部署管道,該管道運用預先計算的資訊來加速實際部署流程。
檢查變更要求核准
如果每個相符性檢查都成功,例如單元測試、Code Risk Analyzer 作業、分支保護及偵測密鑰,則會自動核准變更要求,且作業會順利執行。 如需相關資訊,請參閱 自動化變更管理。
如果相符性檢查失敗,則不會核准變更要求狀態。 您可以 手動核准變更要求,並將 change-request-id 新增至環境內容,以在下一次執行時使用先前建立的變更要求。 您也可以手動核准變更要求,並新增緊急標籤。
部署
在部署階段,管道將建置的工件部署到環境中,例如暫存或生產環境。 您可以在下列來源中找到這些階段的變數及認證:
- 管線使用者介面中的變數 (
get_env)
如需如何存取這些變數的相關資訊,請參閱 自訂 Script。
驗收測試
您可以執行一組自動化測試,以驗證部署是否成功且如預期般運作。 為了可追蹤性,請確定測試日誌包含所測試之程式碼層次或影像的參照。
關閉變更要求
部署的詳細資料會上傳至關閉摘要變更作業,然後作業關閉變更要求。 close_category 會新增至關閉變更要求作業,並具有下列值:
- 成功(如果已部署就緒,且 CD 部署成功)
- 成功但有問題 (如果摘要有問題,表示部署未備妥,且 CD 部署發生緊急狀況)
庫存結束
如需庫存結束的相關資訊,請參閱 庫存。
重新部署應用程式
概觀
若應用程式在基礎架構變更後發生當機或行為異常,可強制重新部署以解決問題。
在觸發手動 CD 管道執行時 force-redeploy=true 使用此選項,以覆寫預設的變更偵測行為。 此設定指示管道重新部署完整清單,即使未偵測到任何新變更時亦然。
預設行為(不強制重新部署)
當 force-redeploy 未設定或設定為 false 時,管道僅在目標環境的清單儲存庫中偵測到新變更時才會部署。
-
CD 管道啟動,並將當前提交標記為管道執行 ID。
-
該管道會從該標籤讀取對應環境分支的內容。
-
此管道會計算當前提交與標
<target-environment>_latest籤相關聯的提交之間的部署差異。 -
該管道評估增量:
- 若 delta 為空,則管道停止運作且不會進行部署。
- 若增量包含變更,則管道繼續執行。
-
該管道會部署在增量中識別出的變更。
-
成功部署後,管道會將
<target-environment>_latest標籤附加至新提交。
強制行為(附帶強制重新部署)
當 force-redeploy 設定為 true 時,管道將跳過增量驗證步驟,並重新部署完整的清單,無論是否偵測到變更。 此方法可確保完整的應用程式狀態被重新套用至部署目標。
- CD 管道啟動,並將當前提交標記為管道執行 ID。
- 該管道會從該標籤讀取對應環境分支的內容。
- 該管道會計算部署增量,在此情境下通常為空值。
- 此
force-redeploy=true設定會使管道跳過增量檢查並繼續執行。 - 該管道會從分支重新部署整個應用程式狀態。
- 成功重新部署後,管道會將標
<target-environment>_latest籤附加至剛部署的提交。
程序
-
啟動新的手動 CD 管道執行。
-
在管線的設定中,將環境變數
force-redeploy設定為true。 -
執行該管線。
撤銷部署
概觀
回滾操作可逆轉先前部署,並在部署導致系統不穩定、故障或合規問題時,將應用程式恢復至已知狀態。 回滾操作通常用於恢復服務可靠性、確保配置一致性,或維持法規合規性。
提供三種還原方法,每種皆適用於不同的復原情境:
- 完整還原:透過參照變更 ServiceNow 請求ID,將系統還原至最後已知良好配置狀態。 建議採用受控且可稽核的復原程序。
- 使用 GitOps 進行完全回滾:透過手動還原庫存中的提交,還原之前的狀態。 不建議使用,因其合規處理能力有限。
- 內嵌回滾:當執行發生錯誤時,將回滾同一管道執行中失敗的部署。
完全還原
回滾管道概述
此管道允許您透過指定特定 ServiceNow 變更請求ID(例如:CHG-12345),將系統回滾至先前已知良好的配置狀態。
此變更請求ID作為成功部署的唯一書籤,同時是回滾管道的必要輸入參數。
您可以透過兩種方式找到先前部署的變更請求 ID:
- 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必須是同一區域與目標環境下已完成部署的識別碼。- 與 相關的
rollback-change-request-id部署,其時間不得早於由 rollback-limit 指定的部署次數。
Tekton PIPELINE_NAME 環境屬性決定執行是否為部署或回滾。
cd-rollback-pipeline:回滾的預設值。cd-pipeline部署的預設值。
您可以使用此屬性自訂分支邏輯。
使用完整回滾 GitOps
使用回滾功能的概述 GitOps
使用持續部署管道,透過將變更還原至特定版本的操作 Gitcommit-id,將庫存的先前版本部署至目標環境。
由於您直接在庫存儲存庫中還原提交,而非透過變更 ServiceNow 請求ID觸發回滾管道,此流程不會自動重新開啟先前合規性問題或管理其截止日期。
當觸發時,CD 管道將執行以下步驟以完成重新部署:
- 管道啟動並將當前提交(即還原提交)標記為管道執行ID。
- 該管道會從該標籤讀取對應環境分支的內容。
- 此管道會計算當前提交與標
<target-environment>_latest籤相關聯的提交之間的部署差異。 - 成功部署後,
<target-environment>_latest標籤將移至新的(已還原)提交。
建立回滾推廣拉取請求
- 在清單中識別您要回滾至的部署
commit-id版本。 - 將儲存庫狀態還原至該提交。
- 建立拉取請求以恢復已撤銷的狀態。
以下範例透過 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 ...
觸發持續部署管道
-
針對回滾的晉升變更建立拉取請求。
-
審查並合併拉取請求。
-
在您的持續交付工具鏈中觸發手動持續交付管道執行。
行內回復
內聯回滾概述
此模式會在同一管道執行期間內,將當前部署回滾至先前狀態。 當部署或驗收測試階段發生錯誤或失敗時,導致部署嘗試被標記為失敗,此時即需執行此操作。
若環境 rollback-enabled 屬性設定為 1,且在部署或驗收測試階段發生失敗時,內嵌回滾將自動執行。
若觸發回滾,CD 管道將執行您在 rollback .pipeline-config.yaml 檔案中定義的區段。 若檔案中未定義某 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} 的標籤會套用到部署中包含的 pull request。
可選擇加入標誌 deployment-traceability,以在 CD 管道中啟用此功能。 使用者可在需要時將旗標設定為 1,以啟動部署追蹤功能。
為了進一步支援此功能,如果使用者想要提供特定的標記,以便在應用程式儲存庫中為 PR 新增標籤,他們可以使用下列環境屬性來指定 Git 標記。 查詢 Git 代碼的順序如下:
- 儲存庫特定標記的現有環境屬性:
git-token-$repo_name-$repo_org。 - 組織特定代幣的新環境屬性:
git-token-$repo_org。