3.2. OpenShift Pipelines 概念
本指南提供了对管道(pipeline)概念的详细论述。
3.2.1. 任务 复制链接链接已复制到粘贴板!
Task
资源是管道的构建块,它由按顺序执行的步骤组成。它基本上是一个输入和输出的功能。一个任务可以单独运行,也可以作为管道的一部分运行。任务可以重复使用,并可用于多个管道。
Step(步骤)是由任务顺序执行并实现特定目标(如构建镜像)的一系列命令。每个任务都作为 pod 运行,每个步骤都作为该 pod 中的容器运行。由于步骤在同一个 pod 中运行,所以它们可以访问同一卷来缓存文件、配置映射和 secret。
以下示例显示了 apply-manifests
任务。
此任务启动 pod,并在该 pod 中使用指定镜像运行一个容器,以运行指定的命令。
从 OpenShift Pipelines 1.6 开始,步骤 YAML 文件中的以下默认值会被删除:
-
HOME
环境变量不会被默认为/tekton/home
目录 -
workingDir
字段不会默认为/workspace
目录
相反,步骤的容器定义 HOME
环境变量和 workingDir
字段。但是,您可以通过在 YAML 文件中为步骤指定自定义值来覆盖默认值。
作为临时方法,为保持与旧 OpenShift Pipelines 版本向后兼容性,您可以在 TektonConfig
自定义资源定义中将以下字段设置为 false
:
spec: pipeline: disable-working-directory-overwrite: false disable-home-env-overwrite: false
spec:
pipeline:
disable-working-directory-overwrite: false
disable-home-env-overwrite: false
3.2.2. When 表达式 复制链接链接已复制到粘贴板!
When 表达式通过设置管道中执行任务的条件来执行任务。它们包含一个组件列表,允许仅在满足特定条件时执行任务。当使用管道 YAML 文件中的 finally
字段指定的最终任务集合中也支持表达式。
表达式的主要组件如下:
-
input
:指定静态输入或变量,如参数、任务结果和执行状态。您必须输入有效的输入。如果没有输入有效输入,则其值默认为空字符串。 -
operator
:指定一个输入与一组values
的关系。输入in
或notin
作为 operator 的值。 -
values
:指定字符串值的数组。输入由静态值或变量组成的非空数组,如参数、结果和工作空间的绑定状态。
在任务运行前评估表达式时声明的。如果 when 表达式的值为 True
,则任务将运行。如果 when 表达式的值为 False
,则跳过任务。
您可以在各种用例中使用 when 表达式。例如,是否:
- 上一任务的结果如预期所示。
- 之前的提交中更改了 Git 存储库中的文件。
- 镜像是否存在于 registry 中。
- 有可选的工作区可用。
以下示例显示了管道运行的 when 表达式。只有在满足以下条件时,管道运行才会执行 create-file
任务:path
参数为README.md
,只有来自 check-file
的任务的 exists
结果为 yes
时才执行 echo-file-exists
任务。
- 1
- 指定 Kubernetes 对象的类型。在本例中,
PipelineRun
。 - 2
- 管道中使用的任务
create-file
。 - 3
when
表达式指定,只有来自check-file
的exists
结果为yes
时才执行echo-file-exists
任务。- 4
when
表达式指定,只有path
参数是README.md
时跳过task-should-be-skipped-1
任务。- 5
when
表达式指定,只有echo-file-exists
任务的执行状态以及任务状态为Succeeded
,来自check-file
任务的exists
结果为yes
,path
参数是README.md
时,才执行finally-task-should-be-executed
任务。
OpenShift Container Platform Web 控制台的 Pipeline Run details 页面显示任务和 when 表达式的状态,如下所示:
- 所有条件都满足:任务和 when 表达式符号(以钻石形表示)为绿色。
- 有任何一个条件不符合:任务被跳过。跳过的任务和 when 表达式符号为灰色。
- 未满足任何条件:任务被跳过。跳过的任务和 when 表达式符号为灰色。
- 任务运行失败:失败的任务和 when 表达式符号为红色。
3.2.3. 最后的任务 复制链接链接已复制到粘贴板!
finally
任务是使用管道 YAML 文件中的 finally
字段指定的最终任务集合。finally
任务始终执行管道中的任务,无论管道运行是否成功执行。finally
任务以并行方式执行,在所有管道任务运行后,相应的频道存在前。
您可以配置一个 finally
任务,以使用同一管道中任何任务的结果。这个方法不会更改运行此最终任务的顺序。它在所有非最终任务执行后与其他最终任务并行执行。
以下示例显示了 clone-cleanup-workspace
管道的代码片段。此代码将存储库克隆到共享的工作区,并清理工作区。执行管道任务后,管道 YAML 文件的 finally
中指定的 cleanup
任务会清理工作区。
3.2.4. TaskRun 复制链接链接已复制到粘贴板!
TaskRun
使用集群上的特定输入、输出和执行参数来实例化一个任务用来执行它。它可自行调用,或作为管道中每个任务的管道运行的一部分。
任务由执行容器镜像的一个或多个步骤组成,每个容器镜像执行特定的构建工作。任务运行以指定顺序在任务中执行步骤,直到所有步骤都成功执行或发生失败为止。PipelineRun
由 PipelineRun
为管道中的每个任务自动创建。
以下示例显示了使用相关输入参数运行 apply-manifests
任务的任务运行:
3.2.5. Pipelines 复制链接链接已复制到粘贴板!
Pipeline
一组 Task(任务)
资源,它们按特定顺序执行。执行它们是为了构建复杂的工作流,以自动化应用程序的构建、部署和交付。您可以使用包含一个或多个任务的管道为应用程序定义 CI/CD 工作流。
Pipeline
资源的定义由多个字段或属性组成,它们一起可让管道实现一个特定目标。每个 Pipeline
资源定义必须至少包含一个Task(任务)
资源,用于控制特定输入并生成特定的输出。Pipeline 定义也可以根据应用程序要求包括 Conditions、Workspaces、Parameters 或 Resources。
以下示例显示了 build-and-deploy
pipeline,它使用 buildah
ClusterTask
资源从 Git 存储库构建应用程序镜像:
Red Hat OpenShift Pipelines Operator 安装 Buildah 集群任务,并创建具有足够权限来构建和推送镜像的管道
服务帐户。当与没有权限不足的不同服务帐户关联时,Buildah 集群任务可能会失败。
3.2.6. PipelineRun 复制链接链接已复制到粘贴板!
PipelineRun
是一种资源类型,它绑定了管道、工作区、凭证和一组特定于运行 CI/CD 工作流的情况的参数值。
管道运行是管道的运行实例。它使用集群上的特定输入、输出和执行参数来实例化 Pipeline 执行。它还为管道运行中的每个任务创建一个任务运行。
管道按顺序运行任务,直到任务完成或任务失败为止。status
字段跟踪和每个任务运行的进度,并存储它以用于监控和审计目的。
以下示例使用相关的资源和参数运行 build-and-deploy
管道:
3.2.7. Workspaces(工作区) 复制链接链接已复制到粘贴板!
建议您在 Red Hat OpenShift Pipelines 中使用 Workspaces 而不是 PipelineResource
CR,因为 PipelineResource
CR 很难调试、范围有限,且不容易重复使用。
Workspace 声明管道中任务在运行时需要的共享存储卷来接收输入或提供输出。Workspaces 不指定卷的实际位置,它允许您定义运行时所需的文件系统或部分文件系统。Task 或 Pipeline 会声明 Workspace,您必须提供卷的特定位置详情。然后,它会挂载到任务运行或管道运行中的 Workspace 中。这种将卷声明与运行时存储卷分开来使得任务可以被重复使用、灵活且独立于用户环境。
使用工作区,您可以:
- 存储任务输入和输出
- 在任务间共享数据
- 使用它作为 Secret 中持有的凭证的挂载点
- 使用它作为配置映射中保存的配置的挂载点
- 使用它作为机构共享的通用工具的挂载点
- 创建可加快作业的构建工件缓存
您可以使用以下方法在 TaskRun
或 PipelineRun
中指定工作区:
- 只读配置映射或 secret
- 与其他任务共享的现有持久性卷声明
- 来自提供的 VolumeClaim 模板的持久性卷声明
-
任务运行完成后丢弃的
emptyDir
以下示例显示了 build-and-deploy
管道的代码片段,它为 build-image
和 apply-manifests
任务声明 shared-workspace
工作区。
- 1
- 管道中定义的任务共享的 Workspace 列表。管道可以根据需要定义工作区。在这个示例中,只声明了一个名为
shared-workspace
的工作区。 - 2
- 管道中使用的任务定义。此片段定义了两个任务:
build-image
和apply-manifests
,它们共享一个通用工作区。 - 3
build-image
任务中使用的工作区列表。任务定义可以根据需要包含多个工作区。但是,建议任务最多使用一个可写工作区。- 4
- 标识任务中使用的工作区的名称。此任务使用一个名为
source
的工作区。 - 5
- 任务使用的管道工作区的名称。请注意,工作区
source
依次使用名为shared-workspace
的管道工作区。 - 6
apply-manifests
任务中使用的工作区列表。请注意,此任务与build-image
任务共享source
工作区。
工作区可帮助任务共享数据,并允许您指定 Pipeline 中每个任务在执行过程中所需的一个或多个卷。您可以创建持久性卷声明,或者提供一个卷声明模板,用于为您创建持久性卷声明。
以下 build-deploy-api-pipelinerun
管道运行的代码片段使用卷声明模板创建持久性卷声明来为 build-and-deploy
管道中使用的 shared-workspace
Workspace 定义存储卷。
3.2.8. 触发器 复制链接链接已复制到粘贴板!
使用触发器(Trigger)和 Pipelines 一起创建一个完整的 CI/CD 系统,其中 Kubernetes 资源定义整个 CI/CD 执行。触发器捕获外部事件,如 Git 拉取请求,并处理它们以获取关键信息。将这个事件数据映射到一组预定义的参数会触发一系列任务,然后创建和部署 Kubernetes 资源并实例化管道。
例如,您可以使用 Red Hat OpenShift Pipelines 为应用程序定义 CI/CD 工作流。管道必须启动,才能在应用程序存储库中使任何新的更改生效。通过捕获和处理任何更改事件,并通过触发器部署新镜像的管道运行来自动触发这个过程。
触发器由以下主要资源组成,它们可一起组成可重复使用、分离和自力更生的 CI/CD 系统:
TriggerBinding
资源从事件有效负载中提取字段,并将它们保存为参数。以下示例显示了
TriggerBinding
资源的代码片段,它从接收的事件有效负载中提取 Git 存储库信息:Copy to Clipboard Copied! Toggle word wrap Toggle overflow TriggerTemplate
资源充当创建资源的方式标准。它指定了TriggerBinding
资源中参数化数据的方式。触发器模板从触发器绑定接收输入,然后执行一系列操作来创建新管道资源,并启动新管道运行。以下示例显示了
TriggerTemplate
资源的代码片段,它使用您刚创建的TriggerBinding
资源提供的 Git 存储库信息创建一个管道运行:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Trigger
资源组合了TriggerBinding
和TriggerTemplate
资源,以及可选的interceptors
事件处理器。拦截器会处理在
TriggerBinding
资源之前运行的特定平台的所有事件。您可以使用拦截器过滤载荷,验证事件,定义和测试触发器条件,以及实施其他有用的处理。拦截器使用 secret 进行事件验证。在事件数据穿过拦截器后,在将有效负载数据传递给触发器之前,它会被发送到触发器。您还可以使用拦截器修改EventListener
规格中引用的关联触发器的行为。以下示例显示了一个
Trigger
资源的代码片段,名为vote-trigger
,它连接TriggerBinding
和TriggerTemplate
资源,以及interceptors
事件处理器。Copy to Clipboard Copied! Toggle word wrap Toggle overflow EventListener
资源提供一个端点或事件接收器(sink),用于使用 JSON 有效负载侦听传入的基于 HTTP 的事件。它从每个TriggerBinding
资源提取事件参数,然后处理此数据以按照对应的TriggerTemplate
资源指定的 Kubernetes 资源创建 Kubernetes 资源。EventListener
资源还使用事件interceptors(拦截器)
在有效负载上执行轻量级事件处理或基本过滤,这可识别有效负载类型并进行自选修改。目前,管道触发器支持五种拦截器:Webhook Interceptors, GitHub 拦截器、GitLab 拦截器、Bitbucket 拦截器 和 Common Expression Language (CEL) 拦截器。以下示例显示了一个
EventListener
资源,它引用名为vote-trigger
的Trigger
资源。Copy to Clipboard Copied! Toggle word wrap Toggle overflow