IBM Cloud Docs
使用推断的 DevSecOps 配置创建管道

使用推断的 DevSecOps 配置创建管道

将自己的应用程序或微服务添加到DevSecOpsCI 工具链后,您就可以使用推断DevSecOps管道配置功能快速启动。 此功能:

  • 为您推导 ".pipeline-config.yaml DevSecOps管道配置文件的内容
  • 确定构建、测试和部署代码所需的脚本
  • 提供了这些脚本的代码,因此您可以专注于您的应用程序

通过使用此功能,您可以轻松将微服务或应用程序接入 DevSecOps 管道,并简化采用 DevSecOps 流程。

无需额外步骤即可配置推断 DevSecOps 管道配置,因为它已集成到. DevSecOps 中。

先决条件

  1. 设置您的 DevSecOps 工具链并集成 应用程序的源代码仓库。 请勿使用默认的示例应用程序存储库。 取而代之的是,加入自己应用程序的存储库。

  2. 回顾 DevSecOps管道定制的基础知识,进一步了解可用的不同模板、支持选项和其他重要信息,让您开始使用DevSecOps。

入门

首先,配置工具链以使用自己的源代码库。 然后,运行第一个 DevSecOpsCI 管道。 该功能默认已启用,因此无需额外设置。 它能动态推断出构建、测试和部署应用程序或服务所需的DevSecOps管道配置和脚本。

要禁用此功能,请设置与版本库中现有文件匹配的 "pipeline-config 值。

推断出DevSecOps管道配置的地点

推断DevSecOps管道配置功能使用源自省和语言定义来识别源码库中的 "spotsspot 是代码中需要执行特定操作的位置。

每个点都具有以下特性:

现货属性
属性 描述
将源代码库中的一个位置标识为点的上下文。
流程 一个或多个进程,表示要执行的操作类型。
工具 与进程相关联的数组,其中列出了执行操作时需要启动的工具。 每种工具都有自己的一套属性。
环境设置 引用将启动的脚本文件(或脚本命令),以设置执行流程操作(工具调用)的环境。

已确定的地点

推断DevSecOps管道配置功能目前可识别以下类型的 "spots code 点、“deployment 点、”acceptance-test 点、"dynamic-scan"点和 "release"点。

代码点

代码点与支持的源代码语言有关,包括

code 点处理以下进程:

  • building:定义对给定源代码进行构建的工具。
  • unit-testing:定位对构建结果进行单元测试的工具。

部署点

deployment 点定位部署载体,包括部署资源和工具。deployment 点有一个部署流程,其中列出了部署工具。 目前支持的部署车辆有

验收测试点

acceptance-test 点定位要运行的验收测试套件。acceptance-test 点有一个 "acceptance-testing 进程,用于确定运行验收测试套件的工具。

动态扫描点

dynamic-scan 点标识动态扫描的位置。 动态扫描点有一个 "scanning 进程,用于列出动态扫描期间调用的扫描工具。

OWASP ZAP 扫描 是唯一支持启动子网络钩子触发器的工具。

释放点

release 点定位释放过程。 发布点有一个 "releasing 流程,其中列出了在发布阶段要运行的工具。 目前,发布流程支持的工具有

polyglot-spots.json内容示例

推断DevSecOps管道配置功能可提取点并生成以下 JSON 内容,以便在 CI 管道阶段触发特定操作和工具。

{
  "code": [
    {
      "source": "Dockerfile",
      "language": "Dockerfile",
      "building": {
        "tools": [
          {
            "tool": "docker"
          }
        ]
      }
    },
    {
      "source": "package.json",
      "language": "NodeJS",
      "building": {
        "tools": [
          {
            "tool": "npm"
          }
        ]
      },
      "unit-testing": {
        "tools": [
          {
            "tool": "npm",
            "command": "test"
          }
        ]
      }
    }
  ],
  "acceptance-test": [
    {
      "source": "package.json",
      "acceptance-testing": {
        "tools": [
          {
            "tool": "npm",
            "command": "run acceptance-test"
          }
        ]
      }
    }
  ],
  "deployment": [
    {
      "source": "deployment_iks.yml",
      "deploying": {
        "tools": [
          {
            "tool": "kubectl"
          }
        ],
        "environment-setup": ".env.deploy.sh"
      }
    },
    {
      "source": "deployment_os.yml",
      "deploying": {
        "tools": [
          {
            "tool": "kubectl"
          }
        ],
        "environment-setup": ".env.deploy.sh"
      }
    }
  ],
  "dynamic-scan": [
    {
      "source": "definitions/definitions1.json",
      "scanning": {
        "tools": [
          {
            "tool": "trigger-async-zap",
            "kind": "api"
          }
        ],
        "environment-setup": "scripts/zap/zap-custom-scripts/.env.dynamic-scan.sh"
      }
    },
    {
      "source": "scripts/zap/uiscripts/run.sh",
      "scanning": {
        "tools": [
          {
            "tool": "trigger-async-zap",
            "kind": "ui"
          }
        ],
        "environment-setup": "scripts/zap/zap-custom-scripts/.env.dynamic-scan.sh"
      }
    }
  ],
  "release": []
}

高级配置

文件注入

推断DevSecOps管道配置功能使用“polyglot-spots.json 和”.pipeline-config.yaml 文件的内容来定制DevSecOps管道流程的执行。

在 CI 管道的“finish 阶段,”polyglot-spots.json 和“.pipeline-config.yaml(与 CI 管道执行的静态管道配置相对应)都会被添加到应用程序源代码库中名为”inferred-devsecops(默认)的分支中。

如果属性 create-inferred-pipeline-configuration-v2 设置为 true (默认为 false ),则还可以生成格式版本为 2 的管道配置(例如,可用于合规性管道分支 v11 )。 然后,像 .pipeline-config-v2.yaml 这样的附加管道配置文件将添加到应用程序源代码库中名为 inferred-devsecops (默认)的分支中。

配置注入分支

您可以使用 "inferred-devsecops-branch 管道属性配置用于注入DevSecOps推断文件的分支名称。 默认值为 inferred-devsecops.

使用 push-inferred-pipeline-configuration-files 管道属性( push-polyglot-files 属性已弃用,请使用 push-inferred-pipeline-configuration-files 属性)启用或禁用 inferred-devsecops 分支的创建和更新:

启用或禁用 inferred-devsecops 分支
描述
true (缺省值) 添加配置文件并将其推送到源程序源代码库的 "inferred-devsecops 分支。
false 配置文件不会添加到推断的-devsecops 分支中。

配置斑点提取

使用以下管道环境属性配置光斑提取:

忽略斑点

您可以使用正则表达式在提取过程中忽略特定位置。 以下配置选项可用:

  • ignore-code-spot-pattern:忽略与指定正则表达式匹配的代码点。
  • ignore-deployment-spot-pattern:忽略与指定正则表达式匹配的部署点。
  • ignore-dynamic-scan-spot-pattern:忽略与指定正则表达式匹配的动态扫描点。
  • ignore-acceptance-test-spot-pattern:忽略与指定正则表达式匹配的验收测试点。
  • ignore-release-spot-pattern:忽略与指定正则表达式匹配的释放点。

Code Engine配置

如果使用 IBM Cloud Code Engine 进行部署,请指定 Code Engine 项目,并使用以下管道环境属性配置构建流程:

  • code-engine-project:指定Code Engine项目。
  • code-engine-build-use-native-docker:(默认:'false)表示是否使用DockerCLI 而不是'ibmcloud code-engine buildrun 命令。
  • root-as-build-context:(默认:false )表示 Dockerfile 相关构建工具(如 dockercode-engine )的构建上下文应使用仓库根目录作为构建上下文,而不是包含Dockerfile的文件夹。

容器镜像构建配置

  • container-image-builder 对于 Dockerfile 相关的构建,请指定用于构建容器镜像的工具(dockerpodmandocker
  • root-as-build-context: (默认: false) 表示相关构建工具(如 docker``Dockerfile, podmancode-engine)的构建上下文应使用仓库根目录作为构建上下文,而非包含 Dockerfile 的文件夹。

Golang 配置

要为 Golang 配置点提取流程,请设置以下管道环境属性:

  • go-ignore-main:(默认值:'false)表示代码点提取是否不关注主要源参数的主软件包和主函数检测。
  • go-output:指定 go build 命令的可执行输出文件。

Gradle配置

要为设置、单元测试、构建工件和验收测试配置 Gradle 任务,请使用以下管道环境属性:

  • gradle-setup-tasks:(默认值:'assemble) 以逗号分隔的设置阶段'Gradle任务列表。
  • gradle-unit-testing-tasks:(默认值:'test)以逗号分隔的单元测试阶段'Gradle任务列表。
  • gradle-build-artifact-tasks:(默认值:'build)以逗号分隔的'Gradle任务列表,用于构建工件阶段。
  • gradle-acceptance-testing-tasks:以逗号分隔的验收测试阶段Gradle任务列表。

NPM 配置

您可以配置 NPM 单元测试和验收测试脚本检测。

  • hint-npm-unit-testing-script: (默认值: 'test) NPM 单元测试脚本检测提示。
  • hint-npm-acceptance-testing-script: (默认值: 'acceptance-test) NPM 验收测试脚本检测提示。

Python配置

要配置 Python Poetry 版本,请使用以下管道环境属性:

  • hint-python-poetry-version: (默认值: '1.8.2)PythonPoetry 版本提示。
  • discover-python-unittest-from-ancestor 默认值:false )表示使用祖先目录作为发现 python unittest 的起点(例如,为了从包含版本库根目录 requirements.txt 的目录中发现单元测试,而不是从最靠近 python unittest 文件的 requirements.txt (如果有))。

Terraform 配置

要配置 Terraform 部署流程,请使用以下管道环境属性:

  • terraform-deployment:(默认值:'false)禁用Schematics作为部署工具,转而使用 Terraform 和Cloud Object Storage存储来存储状态。

Helm 配置

要配置 Helm 发布流程,请使用以下管道环境属性:

  • helm-oci-registry-support: (默认启用 false) 在发布步骤中启用将Helm图表推送到OCI注册表的功能。

工艺品上传

要配置工件上传流程,请使用以下管道环境属性:

  • artifact-upload-to-devsecops-cos:(默认值:'false) 通过使用DevSecOpsCLI 工件上传,将非图像保存的工件上传到Cloud Object Storage桶。

环境设置文件

每个源代码库都需要针对特定阶段进行特定设置或定制。 “推导 DevSecOps 管道配置”功能提供了一种指定环境设置属性的方法,该属性可以定义为 bash 脚本。 在运行进程的相应操作前,该脚本会被调用。

在提取点期间,此推断的devsecops配置功能使用基于文件名的提示来确定环境设置文件。 例如,在执行npm单元测试之前,将选择名为 .env.npm-test.sh 的文件作为环境设置脚本来调用。

环境设置文件的标准化格式类似于 .env.<process>.sh.env.<tool>-<process>.sh

<process> 的值可以是 buildtestacceptance-testdeploydynamic-scanrelease 之一。

对于 build 过程,<tool> 的值可以是 code-enginedockerdocker-maven-plugingogradlehelmmavennpmpippipenvpoetryterraformyarn 之一。

对于 testacceptance-test 流程,<tool> 的值可以是 gogradlehelmmavennpmpytestpythonterratest 之一。

对于 deploy 过程,<tool> 的值可以是 code-enginehelmkubectl-liberty-appkubectlschematicsterraform 之一。

对于 dynamic-scan 过程,<tool> 的值可以是 trigger-async-zap

对于 release 流程,<tool> 的值可以是 mavenpoetrysemantic-release 中的一个。

以下是一些例子:

  • .env.build.sh 文件作为环境设置与代码点中的进程构建相关联。 它可以被一个作用域工具(如docker、maven等)的环境设置文件覆盖,例如 .env.docker-build.sh.env.maven-build.sh 等。
  • .env.test.sh 文件关联为代码点中进程单元测试的环境设置。 它可以被一个作用域工具(如go、npm......)的环境设置文件覆盖,例如 .env.go-test.sh.env.npm-test.sh......
  • .env.deploy.sh 文件在部署点作为进程的环境设置关联。 它可以被一个作用域工具(如代码引擎、helm、kubectl等)的环境设置文件覆盖,例如 .env.code-engine-deploy.sh.env.helm-deploy.sh 等。
  • .env.acceptance-test.sh 文件在验收测试点作为进程的环境设置关联。 它可以被一个作用域工具(如go、maven、npm等)的环境设置文件覆盖,例如 .env.maven-acceptance-test.sh.env.python-acceptance-test.sh 等。
  • .env.dynamic-scan.sh 文件关联为动态扫描点中进程的环境设置。
  • .env.release.sh 文件在发布点中作为进程的环境设置关联。 它可以被一个作用域工具(如maven、semantic-release……)的环境设置文件覆盖,例如 .env.maven-acceptance-test.sh.env.semantic-release-acceptance-test.sh ……

有关如何使用此脚本的示例,请参阅IBM Cloud的 Hello Compliance App 存储库。

环境上下文注入

推断DevSecOps管道配置功能将管道和触发器属性中的环境变量整合到各种项目上下文中。 项目背景如下

  • 管道执行阶段
  • Helm部署
  • Code Engine部署

此功能可让您根据规范化的属性名称,从管道和触发器属性中注入或设置环境变量等上下文。

有些工具会处理注入特定上下文的具有规范化名称的属性,例如

  • docker build 参数和/或 docker build 秘密
  • 为Helm部署补充 "values.yaml 文件
  • Code Engine部署的 configmap 或 "secret

通过使用规范化的属性名称,你可以在管道和部署中注入环境变量和其他上下文。

在管道执行阶段注入环境变量

推断DevSecOps管道配置功能提供了一个 "export-properties 实用程序,用于在阶段执行过程中将管道和触发器属性导出为环境变量。 每个自定义阶段都会调用该实用程序:

export-properties "GLOBAL" && export-properties "${STAGE^^}"
全球环境变量

命令 export-properties "GLOBAL" 会将管道和触发器属性导出为环境变量,其规范化名称为 ENV_GLOBAL_<XXX>,如在每个管道阶段的执行上下文中导出 XXX

全局环境变量示例
全局环境变量示例
属性名 物业估价师 结果环境变量
ENV_GLOBAL_my_var my_value my_var=my_value
特定阶段的环境变量

命令“export-properties "${STAGE^^}" 将导出与当前执行阶段相关的管道或触发器属性,并将其规范化为给定执行阶段中的环境变量”ENV_<stage in upper case>_<XXX>

特定阶段环境变量示例
全局环境变量示例
属性名 物业估价师 结果环境变量
ENV_SETUP_CGO_ENABLED true CGO_ENABLED=true

在 CI 管道中,“code-setup - run-stage 步骤已将”CGO_ENABLED 环境变量设置为适当的值。

有关各阶段及其说明的列表,请参阅阶段 说明

该功能的典型用例是在运行单元测试前注入环境变量,以提供配置。 在这种情况下,属性的规范化名称将是“ENV_TEST_<a_var>,而”<a_var>则是导出环境变量的名称,可供 test` 阶段执行使用。

示例
特定阶段环境变量示例
属性名 物业估价师 结果环境变量
ENV_TEST_MY_VAR my_value MY_VAR=my_value

使用此功能可简化管道配置,提高部署的一致性。

工具执行和配置

推断DevSecOps管道配置功能中的一些工具使用管道和触发器属性来推断补充配置。

Docker
  • 构建参数:根据管道和触发器的属性,docker build 命令会使用--build-arg参数来完成,这些参数的规范化名称如 "DOCKER_BUILD_ARG_
    • 例子添加一个名为“DOCKER_BUILD_ARG_my_arg 的属性,将参数”--build-arg="my_arg=" 注入到 docker 编译命令中。
  • 构建秘密根据管道和触发器属性,docker build 命令会使用--secret参数来完成,并使用规范化名称,如 "DOCKER_BUILD_SECRET_
    • 例如,添加一个名为 DOCKER_BUILD_SECRET_my_secret 的属性,就会将参数--secret,env= 注入到 docker build 命令中。

要了解更多信息,请参阅 docker build argumentsdocker build secret

Helm
  • 部署处理:可根据规范化管道和触发器属性将附加值注入Helm部署流程。
    • 如果一个属性的名称是“HELM_VALUE_,,那么Helm处理工具管理的补充值文件就会添加一个包含管道或触发器属性值的条目”a_value_property
    • 补充值文件将作为 helm 命令最后一个 "-f | --values 参数的参数。

要了解更多信息,请参阅 "补充价值观 "内容

Terraform
Schematics
Code Engine
  • 部署过程:通过定义与应用程序相关的互补配置图或秘密,可以为应用程序创建附加配置。
    • 对于具有规范化名称(如 "CE_ENV_<XXXX>)的管道和触发器属性,将在互补配置图或机密(与Code Engine应用程序或作业相关)中创建一个条目,其键为 "<XXXX>,其值根据相应管道或触发器属性的值设置。

要了解更多信息,请参阅“用于配置应用程序或工作的代码引擎配置图 和”配置应用程序或工作的代码引擎秘密

DevSecOps通用脚本库

InferredDevSecOpsPipeline Configuration 在某些阶段使用通用库中脚本的脚本/函数,该库提供了一套可重复使用的脚本,可以帮助您开始定制。

有关通用脚本库的更多信息,包括脚本、工具、用法和参数,请参阅 通用脚本库

常见问题及解答

支路保护

默认启用分支保护

DevSecOpsPR 和 CI 管道默认在源代码库中启用分支保护。 这种验证在代码设置阶段进行。

禁用分支保护

要禁用分支保护,请将“setup-branch-protection 属性设置为”false

自定义分支保护状态检查

要自定义 分支保护状态检查的前缀,请设置 "branch-protection-status-check-prefix 属性。 默认前缀为 "tekton

配置和执行预提交挂钩

默认情况下,如果源代码存储库中存在预提交配置文件,则具有推断的 DevSecOps 配置的 PR 和 CI 管道将在设置阶段执行 预提交挂钩 (默认为 .pre-commit-config.yaml)。 预提交配置文件的名称可通过管道/触发器属性 pre-commit-config-file 指定为配置文件的名称。

一些预承诺挂钩可能会被跳过(例如,因为像 detect-secrets 这样的挂钩是在PR或CI管道的特定阶段执行的)。 要指定要跳过的挂钩,请将管道/触发器属性 pre-commit-skip-hooks 设置为以逗号分隔的跳过挂钩ID列表。

Sonarqube服务器,带有自签名证书

如果 sonarqube-config 设置为 custom 使用 现有的sonarqube服务器,并且该服务器具有自签名证书,那么为了使sonar扫描仪能够成功连接到sonarqube服务器,需要将自签名证书 添加到受信任的CA证书中

通过以 PEM 格式提供证书作为管道/触发器属性 sonarqube-root-certificate 的值,Inferred DevSecOps 管道配置中的静态扫描实现将相应添加它,以便使用 maven 的 SonarScanner、gradle sonar 的 SonarScanner 或 SonarScanner 调用 Docker。

诗歌与私人收藏

为私有存储库配置诗歌

当使用 Poetry(pyproject.toml 被识别为代码点)并定义了替代源或资源库来获取依赖项时,例如

[[tool.poetry.source]]
name = "local"
url = "https://na-public.artifactory.swg-devops.com/artifactory/api/pypi/ip-devops-team-pypi-virtual/simple"
secondary = true

或涉及 Poetry 时(即 pyproject.toml 包含 build-system 部分,build-backend 等于 poetry.core.masonry.api,是一个已识别的释放点),则可能需要提供凭据来验证私人注册表。

使用IBM Cloud的私有存储库进行身份验证

需要提供此 "local 的凭据。 关于凭据配置的诗歌文档 指出,提供 http 用户和密码的环境变量应为“POETRY_HTTP_BASIC_LOCAL_USERNAME 和”POETRY_HTTP_BASIC_LOCAL_PASSWORD

使用 环境变量注入 功能,添加以下管道环境属性:

  • ENV_GLOBAL_POETRY_HTTP_BASIC_LOCAL_USERNAME(文本)加上适当的值
  • ENV_GLOBAL_POETRY_HTTP_BASIC_LOCAL_PASSWORD(加密)改为适当的加密值

验证以发布到私有资源库

当涉及 Poetry 时(即 pyproject.toml 包含 build-system 部分,build-backend 等于 poetry.core.masonry.api 是一个已识别的发布点),可使用管道环境属性定义令牌或用户名的配置,如(对于名为 local 的版本库):

  • ENV_GLOBAL_POETRY_HTTP_BASIC_LOCAL_USERNAME(文本)加上适当的值
  • ENV_GLOBAL_POETRY_HTTP_BASIC_LOCAL_PASSWORD(加密)改为适当的加密值

  • ENV_GLOBAL_POETRY_PYPI_TOKEN_LOCAL (加密),并加上与令牌相对应的适当加密值

Maven、pom.xml、settings.xml 和环境解析

为IBM Cloud的自定义设置文件配置 Maven

如果您的 Maven 项目使用自定义文件名(如 "ci-settings.xml)定义了特定的设置文件,请在 PR、CI 管道或触发器级别属性中定义管道环境属性 maven-user-settings-file-path,并将其值设置为 "ci_settings.xml

此外,如果有一些 "env.<VARIABLE> 需要解决,如

    <server>
      <username>${env.MAVEN_USERNAME}</username>
      <password>${env.MAVEN_PASSWORD}</password>
      <id>central</id>
    </server>

使用 环境变量注入 功能,通过添加 2 个管道属性(在 PR 和 CI 管道中)来提供这些变量:

  • ENV_GLOBAL_MAVEN_USERNAME(文本),包含用于 maven 用户名的值
  • ENV_GLOBAL_MAVEN_PASSWORD(安全)的值,用于 maven 密码

为 Go 生成强制静态链接

为 Go 编译启用静态链接

默认情况下,"go build 生成动态链接的二进制文件。 要在Docker容器中使用它,请在构建过程中通过设置 "CGO_ENABLED=0 启用静态链接。

为 Go 编译配置环境变量

要启用静态链接,请使用 环境变量注入 功能在 CI 管道中添加以下管道环境属性:

  • ENV_SETUP_CGO_ENABLED 的值设置为 "0

获取支持

IBM Cloud 的AI助手,由 IBM 的 watsonx 提供支持,旨在帮助您了解如何在 IBM Cloud 工作,以及如何使用可用产品目录构建解决方案。 请参阅 “从人工智能助手获取帮助”。

如果仍不能解决问题,可以打开支持案例。 更多信息,请参阅 创建支持案例。 如果您想提供反馈,请参阅 提交反馈