IBM Cloud Docs
將您自己的應用程式引入DevSecOps

將您自己的應用程式引入DevSecOps

將您自己的應用程式導入 DevSecOps 工具鏈以實現持續整合與持續部署,有多種不同的方法。

使用樣品

若要將您自己的應用程式整合至 DevSecOps 工具鏈,以進行無縫持續整合與部署,請從我們的範例設定開始。

Node.js 範例

使用提供的預設範例應用程式建立DevSecOps工具鏈。 hello-compliance-app 會管理提供靜態網頁的 Node.js 伺服器。

其他樣品

或者,您也可以先使用這些樣本之一:

  • Code-engine-compliance-app:此儲存庫包含 Node.js 應用程式,說明 Code Engine 建立策略,並可部署為 Code Engine 應用程式或 Code Engine 作業。
  • Go-compliance-app:此套件庫包含使用 Gin 的 Go 微型服務,使用 helm 部署。
  • Python-compliance-app:此資源庫包含使用 Flask 的 Python 微服務,使用 helm 部署。
  • Node-cloudant-compliance-app:此儲存庫包含使用 kubectl 部署的 Node.js 應用程式,可與透過 Infrastructure-As-Code (Terraform) 建立的 Cloudant 實例互動。

使用推斷的 DevSecOps 配置

將您自己的應用程式原始碼儲存庫加入 DevSecOps CI 工具鏈後,您就可以使用 推斷 DevSecOps Pipeline Configuration 功能立即開始使用。 此功能:

  • 不需要任何初始自訂。
  • 推斷 .pipeline-config.yaml DevSecOps 管道組態檔案的內容。
  • 確定建立、測試和部署程式碼所需的腳本。
  • 提供這些腳本的程式碼。

使用此功能可輕鬆快速地將您的微服務或應用程式加入 DevSecOps 管道,並簡化您的 DevSecOps 採用。

為指定的原始碼套件庫產生 CI 管道配置 yaml 檔案 (在單機模式下推斷 DevSecOps 配置)

您可以以靜態方式/單機模式為指定的原始碼套件庫產生管道配置檔案。 此功能依賴與推斷 DevSecOps 設定相同的邏輯,並透過 DevSecOps 相容基本映像中的特定腳本提供。

必要條件

  • 在您的本機環境中啟動並執行 docker 引擎
  • yq 以便執行下列指令

用法

腳本位於遵循基本映像中的下列路徑:/opt/one-pipeline/polyglot/tools/enable-devsecops.sh

腳本的用法如下 enable-devsecops.sh [--configuration <key>=value]* [--configuration-file <filename>] [--version <v9|v10|v11>]* <path to source code directory>

以下片段說明如何使用此指令碼。

# clone the source code repository that you want to generate CI pipeline config for
git clone https://us-south.git.cloud.ibm.com/open-toolchain/hello-containers
cd hello-containers

export compliance_base_image=$(curl -L https://us-south.git.cloud.ibm.com/open-toolchain/compliance-pipelines/-/raw/open-v10/definitions/ci-trigger.yaml?ref_type=heads | yq '.spec.params[] | select(.name == "compliance-baseimage") | .default')

# environment variable compliance_base_image should contains a value like icr.io/continuous-delivery/toolchains/devsecops/devsecops-baseimage:3.109.7_commons-1.50.2 or upper

# define hint for unit-test and acceptance-test configuration properties as the hello-containers
# sample has specific npm script entries for it

docker run --platform linux/amd64 -v.:/src --rm -it $compliance_base_image /opt/one-pipeline/polyglot/tools/enable-devsecops.sh --configuration hint-npm-unit-testing-script=test-unit --configuration hint-npm-acceptance-testing-script=test-fvt /src

您可以使用 --configuration 選項提供特定參數 (或使用具有 key value pair 的檔案 --configuration-file <file path> )。

所提供的參數將設定 DevSecOps 擷取程序,可用的參數說明如下:擷取點設定

docker run --platform linux/amd64 -v.:/src --rm -it $compliance_base_image /opt/one-pipeline/polyglot/tools/enable-devsecops.sh --configuration hint-npm-unit-testing-script=test-unit --configuration hint-npm-acceptance-testing-script=test-fvt /src

結果

polyglot-spots.json 和 檔案會新增到原始碼倉庫的根目錄。.pipeline-config.yaml

  • polyglot-spots.json 是在原始碼檢查中發現的特定點的制圖,可以捨棄。
  • .pipeline-config.yaml 將被 CI 管道使用的

現在您可以將 .pipeline-config.yaml 推送到原始碼 git 儲存庫,並將其作為應用程式儲存庫,如上 載應用程式 中所述。

新增暫置參數

每一個範例應用程式的原始碼都包含一個 .pipeline-config.yaml 檔案。 .pipeline-config.yaml 檔案是由連續整合及連續部署工具鏈用於管線執行處理程序中所有階段的核心配置檔。

新增 .pipeline-config.yaml 配置檔,其中包含每一個階段所需的下列內容:

image
用來執行階段的 Docker 映像檔名稱。 例如,使用下列程式碼來簽署映像檔:
image: icr.io/continuous-delivery/pipeline/image-signing:1.0.   0@sha256:e9d8e354668ba3d40be2aaee08298d2aa7f0e1c8a1829cca4094ec93830e3e6a
abort_on_failure

將此內容設為 true,以在階段失敗時停止管線執行。 如果此內容設為 false,則步驟會標示為以警告狀態 (也稱為琥珀色狀態) 傳遞,且管線會繼續執行。

script

執行階段中所需動作的 Script。 在應用程式儲存庫內的 Script 目錄中建立 Script,並從這個位置呼叫 Script。 例如,當您想要簽署影像時,下列程式碼 Snippet 顯示 script 區段的內容:

script: |
   #!/usr/bin/env bash
   STAGE_DIND="true"
   STAGE_ABORT_ON_FAILURE="false"
   STAGE_IMAGE_PULL_POLICY="IfNotPresent"
   source scripts/sign_image.sh
dind

如果您想要在執行中管線中啟用 docker 功能,請將此內容設為 true。 決定需要哪些參數之後,您可以在管線中定義各種步驟。

setup

定義此階段以執行預先設定 Script。

setup:
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash
   echo "Please insert any required pre-build tasks in this stage."
test

定義此階段以執行應用程式的測試案例。

test:
   abort_on_failure: false
image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
script: |
   #!/usr/bin/env bash
   cd ../"$(load_repo app-repo path)"
   #npm ci
   #npm test
   source test/test.sh
static-scan

定義此階段以在程式碼上執行靜態掃描。

static-scan:
   dind: true
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash
   echo "Please insert script to invoke/execute static scan tool like SonarQube on the application source code."
containerize

定義此階段以建置及容器化應用程式。

containerize:
   dind: true
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash

   if [[ "$PIPELINE_DEBUG" == 1 ]]; then
   trap env EXIT
   env
   set -x
   fi
   source scripts/build_setup.sh
   source scripts/build.sh
deploy

定義此階段以在目標環境上部署應用程式。

deploy:
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash

   if [[ "$PIPELINE_DEBUG" == 1 ]]; then
   trap env EXIT
   env
   set -x
   fi
   source scripts/deploy_setup.sh
   source scripts/deploy.sh
sign-artifact

預設情況下,DevSecOps CI 工具鏈會對容器化階段所建置的所有映像進行簽署。 在工具鏈設定期間提供的 GPG 金鑰用來 簽署映像檔。 如果您想要自訂映像檔簽署程序,請在 .pipeline-config.yaml 中新增下列階段定義:

sign-artifact:
   abort_on_failure: false
   image: icr.io/continuous-delivery/pipeline/image-signing:1.0.      0@sha256:e9d8e354668ba3d40be2aaee08298d2aa7f0e1c8a1829cca4094ec93830e3e6a
   script: |
   #!/usr/bin/env bash
   STAGE_DIND="true"
   STAGE_ABORT_ON_FAILURE="false"
   STAGE_IMAGE_PULL_POLICY="IfNotPresent"
   source scripts/sign_image.sh
acceptance-test

定義此階段以在部署之後執行驗收測試。

acceptance-test:
   abort_on_failure: false
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash
   export APP_URL=$(cat ../app-url)
   source scripts/setup_go.sh
   echo "APP_URL :- ${APP_URL}"
   go run acceptance-test/acceptance-test.test.go
release

定義此階段,以上傳從前一個階段產生的證明及構件。

release:
   abort_on_failure: false
   image: icr.io/continuous-delivery/toolchains/devsecops/compliance-baseimage:2.26.      1@sha256:a780174a64474187b01b5e40a1721d8307f02897ac6f3eba2d482d4f4926edf1
   script: |
   #!/usr/bin/env bash
   source scripts/release.sh
scan-artifact

請定義這個階段來執行掃描,以找出產生的構件中的漏洞。

scan-artifact:
   abort_on_failure: false
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      6@sha256:7f588468622a981f89cf5e1212aaf75fface9da6169b5345ca52ab63d8215907
   script: |
   #!/usr/bin/env bash
   source scripts/va_scan.sh
dynamic-scan

定義此階段以在已部署的應用程式上執行動態掃描。

dynamic-scan:
   dind: true
   abort_on_failure: false
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash
   echo "Please insert script to invoke/execute dynamic scan tool like OWASP ZAP on the built and deployed application."

如需階段的相關資訊,請參閱 自訂 Script