IBM Cloud Docs
為初學者客製化DevSecOps管道

為初學者客製化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-repoconfig-repo 視為兩個獨立的儲存庫。 在管線的開始階段期間,Script 會複製儲存庫兩次。 這些複本稱為 app-repoone-pipeline-config-repo。 每一個階段都在 config repo 的環境定義中執行。

機載應用程式

為了簡單起見,在繼續之前,請使用 Node 應用程式範例 建立並測試 DevSecOps CI 工具鏈。

可透過三種主要方法將第一個應用程式載入到現有DevSecOps CI 工具鏈中:

  • 選項 1: 將應用程式儲存庫新增至工具鏈,並使用範例應用程式儲存庫作為配置儲存庫。
  • 選項 2: 將範例應用程式儲存庫取代為您的應用程式儲存庫。
  • 選項 3: 將應用程式儲存庫新增至工具鏈,並使用專用的配置儲存庫。 如需此選項的相關資訊,請參閱 進階自訂作業步驟

DevSecOps工具鏈使用由IBM (也稱為 GRIT)管理的 Gitlab 儲存庫。 可以改用其他 Git 提供者。 例如,您的應用程式儲存庫可能在 GitHub 或 Gitlab 上管理。

選項 1: 新增應用程式儲存庫,並使用範例應用程式儲存庫作為配置儲存庫

若要將應用程式儲存庫新增至工具鏈,並使用範例應用程式儲存庫作為配置儲存庫,請完成下列步驟:

  1. 在IBM Cloud控制台中,按一下選單圖示選單圖示>平台自動化>工具鏈,然後選擇您要編輯的工具鏈。
  2. 按一下新增
  3. 選取管理應用程式儲存庫的位置: GitlabGitHub
  4. 使用預設伺服器或新增伺服器。
  5. 輸入自訂伺服器的 URL 和個人存取權限。
  6. 按一下建立整合
  7. 輸入您的應用程式原始碼儲存庫 URL。
  8. 按一下建立整合

接下來,完成下列步驟,將範例應用程式儲存庫指定為配置儲存庫:

  1. 在IBM Cloud控制台中,按一下選單圖示選單圖示>平台自動化>工具鏈,然後選擇您要編輯的工具鏈。
  2. 按一下 pr-pipeline
  3. 按一下 設定,並移至 環境內容 標籤。
  4. 編輯 pipeline-config-repo 屬性的值,指向範例應用程式儲存庫 URL。
  5. 回到您的 CI 工具鏈。
  6. 按一下 ci-pipeline
  7. 按一下 設定,並移至 環境內容 標籤。
  8. 編輯 pipeline-config-repo 屬性的值,指向範例應用程式儲存庫 URL。

您的 CI 管線現在使用範例應用程式儲存庫 pipeline-config 作為配置儲存庫。

選項 2: 將範例應用程式儲存庫取代為您自己的應用程式儲存庫

若要將範例應用程式儲存庫取代為您自己的應用程式儲存庫,請完成下列步驟:

  1. 在IBM Cloud控制台中,按一下選單圖示選單圖示>平台自動化>工具鏈,然後選擇要編輯的 CI 工具鏈。
  2. 尋找範例應用程式原始碼儲存庫,然後選取 配置
  3. 以您的應用程式原始碼儲存庫 URL 取代儲存庫 URL。
  4. 按一下儲存整合

取代範例應用程式儲存庫之後,請確定新的應用程式儲存庫包含 .pipeline-config.yaml 檔案及對應的 Script。 將 .pipeline-config.yaml 檔案及 Script 從範例應用程式儲存庫複製到應用程式儲存庫,或使用 此範例配置檔

配置 CI 管線

新增應用程式儲存庫之後,您必須配置 CI 管線以使用新的儲存庫。

配置管線觸發程式

預設觸發程式會使用範例應用程式儲存庫,因此您必須更新它們以使用您的應用程式儲存庫。 請驗證觸發程式設定,並視需要修改它們,以確保所有觸發程式都指向您的應用程式儲存庫。 請完成下列步驟:

  1. 在IBM Cloud控制台中,按一下選單圖示選單圖示>平台自動化>工具鏈,然後選擇要編輯的 CI 工具鏈。
  2. 按一下 pr-pipeline
  3. 編輯 Git PR Trigger,並提供您的應用程式儲存庫 URL 和分支。
  4. 按一下儲存
  5. 回到 CI 工具鏈,然後按一下 ci-pipeline
  6. 編輯 Git CI Trigger,並提供您的應用程式儲存庫 URL 和分支。 請確定 內容 區段中的應用程式名稱正確。
  7. 按一下儲存
  8. 編輯 手動觸發程式。 在 內容 區段中,確定應用程式名稱正確。
  9. 請確定儲存庫及分支內容正確,並指向您的應用程式儲存庫。

設定 .pipeline-config.yaml 檔案

.pipeline-config.yaml 檔案從範例應用程式儲存庫複製到應用程式儲存庫,或使用 此範例配置檔

對於 pr-pipelineci-pipeline,請確定已正確設定 pipeline-configpipeline-config-branchpipeline-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 助理的協助

如果您仍無法解決問題,則可以開立支援案例。 如需詳細資訊,請參閱 建立支援個案。 如果您想要提供回饋,請參閱 提交回饋