使用推断的 DevSecOps 配置创建管道
将自己的应用程序或微服务添加到DevSecOpsCI 工具链后,您就可以使用推断DevSecOps管道配置功能快速启动。 此功能:
- 为您推导 "
.pipeline-config.yamlDevSecOps管道配置文件的内容 - 确定构建、测试和部署代码所需的脚本
- 提供了这些脚本的代码,因此您可以专注于您的应用程序
通过使用此功能,您可以轻松将微服务或应用程序接入 DevSecOps 管道,并简化采用 DevSecOps 流程。
无需额外步骤即可配置推断 DevSecOps 管道配置,因为它已集成到. DevSecOps 中。
先决条件
-
设置您的 DevSecOps 工具链并集成 应用程序的源代码仓库。 请勿使用默认的示例应用程序存储库。 取而代之的是,加入自己应用程序的存储库。
-
回顾 DevSecOps管道定制的基础知识,进一步了解可用的不同模板、支持选项和其他重要信息,让您开始使用DevSecOps。
入门
首先,配置工具链以使用自己的源代码库。 然后,运行第一个 DevSecOpsCI 管道。 该功能默认已启用,因此无需额外设置。 它能动态推断出构建、测试和部署应用程序或服务所需的DevSecOps管道配置和脚本。
要禁用此功能,请设置与版本库中现有文件匹配的 "pipeline-config 值。
推断出DevSecOps管道配置的地点
推断DevSecOps管道配置功能使用源自省和语言定义来识别源码库中的 "spots。 spot 是代码中需要执行特定操作的位置。
每个点都具有以下特性:
| 属性 | 描述 |
|---|---|
| 源 | 将源代码库中的一个位置标识为点的上下文。 |
| 流程 | 一个或多个进程,表示要执行的操作类型。 |
| 工具 | 与进程相关联的数组,其中列出了执行操作时需要启动的工具。 每种工具都有自己的一套属性。 |
| 环境设置 | 引用将启动的脚本文件(或脚本命令),以设置执行流程操作(工具调用)的环境。 |
已确定的地点
推断DevSecOps管道配置功能目前可识别以下类型的 "spots
code 点、“deployment 点、”acceptance-test 点、"dynamic-scan"点和 "release"点。
代码点
代码点与支持的源代码语言有关,包括
- Node.js(使用 npm、Yarn 或Gradle
- Java(使用 Maven 或Gradle
- Golang
- Python
- Dockerfile
- Terraform 配置语言
code 点处理以下进程:
building:定义对给定源代码进行构建的工具。unit-testing:定位对构建结果进行单元测试的工具。
部署点
deployment 点定位部署载体,包括部署资源和工具。deployment 点有一个部署流程,其中列出了部署工具。 目前支持的部署车辆有
-
Kubernetes资源定义,如 "
Pod、"ReplicaSet、"ReplicationController、"Deployment"、"Daemonset"、"StatefulSet"、"Job"、"Cronjob"、"NetworkPolicy"、"Ingress、"Service、"Route- 工具 kubectl -
Websphere 自由应用程序自定义资源- 将 kubectl 作为工具
-
Open Liberty应用程序自定义资源- 将 kubectl 作为工具
-
Helm--舵是工具
-
IBM Cloud Code Engine 已配置部署 时的 Dockerfile- IBM Cloud Code Engine CLI 作为工具
验收测试点
acceptance-test 点定位要运行的验收测试套件。acceptance-test 点有一个 "acceptance-testing 进程,用于确定运行验收测试套件的工具。
动态扫描点
dynamic-scan 点标识动态扫描的位置。 动态扫描点有一个 "scanning 进程,用于列出动态扫描期间调用的扫描工具。
OWASP ZAP 扫描 是唯一支持启动子网络钩子触发器的工具。
释放点
release 点定位释放过程。 发布点有一个 "releasing 流程,其中列出了在发布阶段要运行的工具。 目前,发布流程支持的工具有
- 语义释放
- maven 的 "
maven deploy阶段。
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 分支的创建和更新:
| 值 | 描述 |
|---|---|
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相关构建工具(如docker或code-engine)的构建上下文应使用仓库根目录作为构建上下文,而不是包含Dockerfile的文件夹。
容器镜像构建配置
container-image-builder对于 Dockerfile 相关的构建,请指定用于构建容器镜像的工具(docker或podman)docker。root-as-build-context: (默认:false) 表示相关构建工具(如docker``Dockerfile,podman或code-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)表示使用祖先目录作为发现 pythonunittest的起点(例如,为了从包含版本库根目录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> 的值可以是 build、test、acceptance-test、deploy、dynamic-scan 或 release 之一。
对于 build 过程,<tool> 的值可以是 code-engine、docker、docker-maven-plugin、go、gradle、helm、maven、npm、pip、pipenv、poetry、terraform 或 yarn 之一。
对于 test 和 acceptance-test 流程,<tool> 的值可以是 go、gradle、helm、maven、npm、pytest、python 或 terratest 之一。
对于 deploy 过程,<tool> 的值可以是 code-engine、helm、kubectl-liberty-app、kubectl、schematics 或 terraform 之一。
对于 dynamic-scan 过程,<tool> 的值可以是 trigger-async-zap。
对于 release 流程,<tool> 的值可以是 maven、poetry 或 semantic-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 arguments 和 docker build secret
Helm
- 部署处理:可根据规范化管道和触发器属性将附加值注入Helm部署流程。
- 如果一个属性的名称是“
HELM_VALUE_,,那么Helm处理工具管理的补充值文件就会添加一个包含管道或触发器属性值的条目”a_value_property。 - 补充值文件将作为 helm 命令最后一个 "
-f | --values参数的参数。
- 如果一个属性的名称是“
要了解更多信息,请参阅 "补充价值观 "内容。
Terraform
- 部署流程Terraform 工具依赖于 compliance-commons terraform 提供的 Terraform 辅助功能。
- 有关上下文注入配置属性的更多信息,请参阅 配置 Terraform 输入变量。
Schematics
- 部署过程:"Schematics工具依赖于 "合规-共用示意图 提供的 "Schematics辅助函数。
- 有关上下文注入配置属性的更多信息,请参阅 配置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 工作,以及如何使用可用产品目录构建解决方案。 请参阅 “从人工智能助手获取帮助”。