為初學者客製化DevSecOps管道
學習採用 DevSecOps 的基本知識,並上線您的第一個應用程式或微服務。
關於 DevSecops 工具鏈
您發現並測試了實現DevSecOps最佳實踐和安全工具的IBM Cloud DevSecOps 持續整合 ( CI )、持續部署 ( CD ) 和持續合規性 ( CC ) 工具鏈。
現在,您已準備好加入自己的應用程式或微服務並採用DevSecOps。
開始之前
您需要以下資源才能將應用程式載入DevSecOps工具鏈中:
- 包含應用程式程式碼的應用程式原始碼 Git 儲存庫,通常稱為 "app repo"。
.pipeline-config.yaml檔案。 此檔案是 CI、CD 及 CC 管線用來自訂管線執行處理程序中任何階段的核心配置檔。 開始使用 範例.pipeline-config.yaml檔案,您可以下載並自訂該檔案,以符合您的需求。 除了開始階段之外的所有階段都可以使用.pipeline-config.yaml檔案來自訂。 檔案會觸發並執行自訂 Script,以建置、測試及部署應用程式。 您可以變更.pipeline-config.yaml檔案的名稱,或針對不同的管線或觸發程式使用不同的檔案。 請確定管線或觸發程式中的參數值符合您的配置檔。 如需相關資訊,請參閱 管線參數。
IBM Cloud具有以下DevSecOps範本來幫助您入門:
DevSecOps管道如何使用儲存庫
為了建置、測試和部署應用程序,DevSecOps管道使用兩個儲存庫:
app-repo: 應用程式儲存庫,包含應用程式的原始碼。config-repo: 配置儲存庫,包含您的管線配置 YAML 檔案及 Script。
在 DevSecOps範例應用程式 中,這兩個儲存庫是相同的。 大多數DevSecOps採用者都是從這種模式開始的。 但是,當您加入更多微服務時,可能需要專用且個別的管線配置儲存庫。 由於應用程式儲存庫和配置儲存庫在範例應用程式中是相同的,因此在執行管線時,會複製儲存庫兩次,這可能會導致錯誤。 因此,最佳實踐是擁有一個單獨的配置儲存庫來託管可以在不同DevSecOps工具鍊和管道之間共用和重複使用的設定檔和腳本。 如需自訂配置儲存庫的相關資訊,請參閱 進階自訂步驟。
DevSecOps 腳本將 app-repo 和 config-repo 視為兩個獨立的儲存庫。 在管線的開始階段期間,Script 會複製儲存庫兩次。 這些複本稱為 app-repo 和 one-pipeline-config-repo。 每一個階段都在 config repo 的環境定義中執行。
機載應用程式
為了簡單起見,在繼續之前,請使用 Node 應用程式範例 建立並測試 DevSecOps CI 工具鏈。
可透過三種主要方法將第一個應用程式載入到現有DevSecOps CI 工具鏈中:
- 選項 1: 將應用程式儲存庫新增至工具鏈,並使用範例應用程式儲存庫作為配置儲存庫。
- 選項 2: 將範例應用程式儲存庫取代為您的應用程式儲存庫。
- 選項 3: 將應用程式儲存庫新增至工具鏈,並使用專用的配置儲存庫。 如需此選項的相關資訊,請參閱 進階自訂作業步驟。
DevSecOps工具鏈使用由IBM (也稱為 GRIT)管理的 Gitlab 儲存庫。 可以改用其他 Git 提供者。 例如,您的應用程式儲存庫可能在 GitHub 或 Gitlab 上管理。
選項 1: 新增應用程式儲存庫,並使用範例應用程式儲存庫作為配置儲存庫
若要將應用程式儲存庫新增至工具鏈,並使用範例應用程式儲存庫作為配置儲存庫,請完成下列步驟:
- 在IBM Cloud控制台中,按一下選單圖示
>平台自動化>工具鏈,然後選擇您要編輯的工具鏈。
- 按一下新增。
- 選取管理應用程式儲存庫的位置:
Gitlab或GitHub。 - 使用預設伺服器或新增伺服器。
- 輸入自訂伺服器的 URL 和個人存取權限。
- 按一下建立整合。
- 輸入您的應用程式原始碼儲存庫 URL。
- 按一下建立整合。
接下來,完成下列步驟,將範例應用程式儲存庫指定為配置儲存庫:
- 在IBM Cloud控制台中,按一下選單圖示
>平台自動化>工具鏈,然後選擇您要編輯的工具鏈。
- 按一下 pr-pipeline。
- 按一下 設定,並移至 環境內容 標籤。
- 編輯
pipeline-config-repo屬性的值,指向範例應用程式儲存庫 URL。 - 回到您的 CI 工具鏈。
- 按一下 ci-pipeline。
- 按一下 設定,並移至 環境內容 標籤。
- 編輯
pipeline-config-repo屬性的值,指向範例應用程式儲存庫 URL。
您的 CI 管線現在使用範例應用程式儲存庫 pipeline-config 作為配置儲存庫。
選項 2: 將範例應用程式儲存庫取代為您自己的應用程式儲存庫
若要將範例應用程式儲存庫取代為您自己的應用程式儲存庫,請完成下列步驟:
- 在IBM Cloud控制台中,按一下選單圖示
>平台自動化>工具鏈,然後選擇要編輯的 CI 工具鏈。
- 尋找範例應用程式原始碼儲存庫,然後選取 配置。
- 以您的應用程式原始碼儲存庫 URL 取代儲存庫 URL。
- 按一下儲存整合。
取代範例應用程式儲存庫之後,請確定新的應用程式儲存庫包含 .pipeline-config.yaml 檔案及對應的 Script。 將 .pipeline-config.yaml 檔案及 Script 從範例應用程式儲存庫複製到應用程式儲存庫,或使用 此範例配置檔。
配置 CI 管線
新增應用程式儲存庫之後,您必須配置 CI 管線以使用新的儲存庫。
配置管線觸發程式
預設觸發程式會使用範例應用程式儲存庫,因此您必須更新它們以使用您的應用程式儲存庫。 請驗證觸發程式設定,並視需要修改它們,以確保所有觸發程式都指向您的應用程式儲存庫。 請完成下列步驟:
- 在IBM Cloud控制台中,按一下選單圖示
>平台自動化>工具鏈,然後選擇要編輯的 CI 工具鏈。
- 按一下 pr-pipeline。
- 編輯 Git PR Trigger,並提供您的應用程式儲存庫 URL 和分支。
- 按一下儲存。
- 回到 CI 工具鏈,然後按一下 ci-pipeline。
- 編輯 Git CI Trigger,並提供您的應用程式儲存庫 URL 和分支。 請確定 內容 區段中的應用程式名稱正確。
- 按一下儲存。
- 編輯 手動觸發程式。 在 內容 區段中,確定應用程式名稱正確。
- 請確定儲存庫及分支內容正確,並指向您的應用程式儲存庫。
設定 .pipeline-config.yaml 檔案
將 .pipeline-config.yaml 檔案從範例應用程式儲存庫複製到應用程式儲存庫,或使用 此範例配置檔。
對於 pr-pipeline 和 ci-pipeline,請確定已正確設定 pipeline-config、pipeline-config-branch 和 pipeline-config-repo 參數,且符合您的配置。 如果未正確設定這些參數,您可能會將變更確定至錯誤的分支,這會導致管線發生錯誤。
如果 pipeline-config-repo 變數未設定,DevSecOps 管道會假設它與您的應用程式原始碼儲存庫相同。
將自訂腳本與DevSecOps結合使用
pipeline-config.yaml 檔案是編排和自訂DevSecOps管道行為的關鍵元件。 該檔案使用 Script 來建置、測試及部署應用程式。 此檔案定義如何配置暫置,以及執行哪些 Script。 如需相關資訊,請參閱 自訂 Script。
DevSecOps管道使用的腳本主要有兩類:
- 用來建置、測試及部署應用程式的應用程式相關 Script。 這些腳本是您自己的責任,超出了DevSecOps支援的範圍。 由於這些 Script 沒有預設實作,您必須將它們新增至應用程式或配置儲存庫。 您可能需要從 Jenkins 或另一個來源取回 Script。
- 執行安全及相符性掃描的安全及相符性 Script。 大部分都隨附 預設 Script,您可以置換這些 Script 以使用您自己的自訂實作。
除了開始階段之外,CI、CD 或 CC 管線的每一個階段都可以使用您自己的 Script 來自訂,以置換階段的預設實作。 無法使用您自己的 Script 來自訂開始階段。
雖然 Bash Script 以範例形式提供,但您可以使用其他語言 (例如 Python 或 Go) 來建置、測試及部署應用程式。 請確定您對每一個階段使用正確的 image。 請參閱 DevSecOps管道部分中的Docker映像。
請參閱表格 階段及作業,其中彙總「CI 管線」的各種階段。 此表格也提供階段是否具有預設參照實作、是否可以自訂或跳過,或階段執行是否需要明確證明收集的相關合併資訊。
從Jenkins或 Travis 遷移到DevSecOps
大多數DevSecOps採用者都不是從零開始的。 大部分採用者已備妥持續整合及持續交付處理程序,以及對應的 Script 程式庫。 這些處理程序通常使用 Jenkins、Travis 或某個其他平台來實作。
遷移到DevSecOps:
pipeline-config.yaml配置檔應該反映 CI 及 CD 管線目前的編排方式。 階段和步驟應映射到 DevSecOps管道階段。- 您應該使用已備妥的相同 Script、基本映像檔及變數。
- 密鑰內容需要移轉至 密鑰儲存庫。
- 非秘密內容需要新增為管線或觸發程式內容。
在開發模式中工作
您可以使用 CI 及 CD 管線的開發模式,來測試 .pipeline-config.yaml 檔案及 Script 的實作。 開發模式管線不會執行任何安全或相符性相關作業,這會減少管線的執行時期。 如需相關資訊,請參閱 以開發模式執行管線。
僅將開發模式用於開發目的。 開發模式並非 DevSecOps CI 和 CD 官方管道的替代品,它們仍是參考實作。
配置 CD 管線
在 DevSecOps持續整合、持續部署工作流程 中,CI 管道在 CI 管道的 deploy-release 階段將更新推送到庫存儲存庫。 如需相關資訊,請參閱 範例 release.sh Script。
在此工作流程中,多個 CI 觸發器和不同的DevSecOps CI 工具鏈可以為同一個庫存儲存庫做出貢獻。
與 CI 管線相反,CD 管線所使用的部署 Script 需要從 Jenkins、Travis 或某個其他平台中的現行 Script 進行調整,以使用 庫存儲存庫 中的項目。
此 範例程式碼 顯示如何從庫存擷取資訊,並使用它來執行 Kubernetes 部署。
DevSecOps腳本位置
DevSecOps管道附帶預設的安全和掃描工具以及相關腳本。
例如,階段日誌的開頭會參照預設 Script:
scan-artifact:
image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.24
dind: true
dind_image: icr.io/continuous-delivery/toolchains/devsecops/docker:20.10.21-dind
abort_on_failure: false
image_pull_policy: IfNotPresent
script: |
#!/bin/sh
"/opt/commons/scan-artifact/scan.sh"
/opt/commons/scan-artifact/scan.sh 是預設 Script。
DevSecOps管道在名為 COMMONS_PATH 的環境變數中提供了 公共庫 根資料夾的路徑,該路徑在所有任務和步驟中都可用。 若要存取內建於法規遵循基本映像檔中的 Script,請搭配使用 COMMONS_PATH 變數與您需要的 Script 資料夾:
source "${COMMONS_PATH}/<script folder in commons>/<script file name>
請參閱表格 階段及作業,其中彙總「CD 管線」的各種階段。 此表格也提供階段是否具有預設參照實作、是否可以自訂或跳過它,或階段執行是否需要明確證明收集的合併資訊。
環境內容
DevSecOps管道附帶 預先定義的環境屬性,但您可以根據需要新增任意數量的自訂屬性。 您可以使用 get_env 指令 來存取 Script 中的這些內容值。
將內容及其選用預設值新增至管線或觸發程式之後,請在 Script 中使用 get_env 指令來擷取內容的值。 下列範例會擷取 my-variable 內容的值:
MY_VARIABLE=$(get_env my-variable "")
您也可以使用 set_env 指令 來動態置換 Script 中的內容值。 下列範例會置換 my-variable 內容中的值:
set_env my-variable new-value
跳過暫置
有些階段可能不相關。 例如,您可能尚未建置任何 Docker 映像檔,或尚未實作驗收測試。 如果您想要跳過階段,您可以編輯 .pipeline-config.yaml 檔案以包含 exit 0,或將 skip 變數設為 true。
下列範例新增 exit 0 以跳過階段:
scan-artifact:
image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.24
dind: true
dind_image: icr.io/continuous-delivery/toolchains/devsecops/docker:20.10.21-dind
abort_on_failure: false
image_pull_policy: IfNotPresent
skip: false
runAfter: null
script: |
#!/bin/sh
exit 0
"/opt/commons/scan-artifact/scan.sh"
DevSecOps管道中的Docker映像
預設情況下,DevSecOps管道使用 IBMContinuous Delivery映像。 這些映像檔包含一些最常用的工具,例如 Node 和 Java 來執行您的 Script。 您也可以使用其他供應商的映像檔或您自己的自訂映像檔,其中包含您偏好的工具。
DevSecOps管道使用的Docker映像在 .pipeline-config.yaml 檔案中指定。 每一個階段都可以使用不同的影像。
變更映像檔版本
根據您的需求,您可能需要使用不同版本的映像檔。 若要變更映像檔版本,請編輯 .pipeline-config.yaml 檔案。 例如,如果您在 YAML 檔案 icr.io/continuous-delivery/pipeline/pipeline-base-ubi中參照下列映像檔:3.24,則將它變更為 icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.27 會導致使用映像檔 3.27 版。
以相同方式,變更階段的 dind_image:
scan-artifact:
image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.24
dind: true
dind_image: icr.io/continuous-delivery/toolchains/devsecops/docker:20.10.21-dind
(...)
取得支援
IBM Cloud 的 AI 助手,它由 IBM 的 watsonx 驅動,旨在幫助您瞭解如何在 IBM Cloud 工作,以及如何利用可用的產品目錄建立解決方案。 請參閱 取得 AI 助理的協助。
如果您仍無法解決問題,則可以開立支援案例。 如需詳細資訊,請參閱 建立支援個案。 如果您想要提供回饋,請參閱 提交回饋。