将自己的应用程序引入 DevSecOps

将自有应用程序引入 DevSecOps 工具链以实现持续集成与持续部署的方法多种多样。

使用示例

要将您自己的应用程序集成到 DevSecOps 工具链中,以实现无缝持续集成和部署,请从我们的示例设置开始。

Node.js 样本

使用提供的默认示例应用程序创建 DevSecOps 工具链。 hello-compliance-app 托管提供静态 Web 页面的 Node.js 服务器。

其他示例

或者,您可以先使用以下示例:

  • 代码引擎合规性应用程序:该存储库包含一个 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 应用程序,该应用程序与通过基础设施即代码(Terraform)创建的 Cloudant 实例进行交互。

使用推定的 DevSecOps 配置

将您自己的应用程序源代码库添加到 DevSecOps CI工具链后,即可使用 Inferred 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 选项提供特定参数(或使用具有键值对的文件 --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: |
   #!/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

定义此阶段以运行预设置脚本。

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."

有关阶段的更多信息,请参阅 定制脚本