使用 Tekton Pipelines
DevOps Insights 该服务将于 2026 年 8 月 31 日停止运营并终止。Continuous Delivery 将于 2027 年 2 月 12 日在以下区域停止运营:au-syd、ca-tor、us-east。 Code Risk Analyzer 也将于该日期在所有地区停止提供服务。 如果某个区域未实际使用这些功能,该区域内的相关功能可能会提前停用,并停止接受新实例。 了解更多
Tekton Pipelines 是一个开源项目,您可以通过它在 Kubernetes 集群中配置和运行持续集成(Continuous Integration)和持续部署( Continuous Delivery )管道。 Tekton 管道在 yaml 文件中进行定义,这些文件通常存储在 Git 存储库中。
Tekton 为 Kubernetes 提供了一套 自定义资源扩展,用于定义管道。 这些扩展中包括以下 Tekton 管道基本资源:
| 资源 | 描述 |
|---|---|
Task |
定义一组构建步骤,例如编译代码,运行测试以及构建和部署映像。 |
TaskRun |
使用特定输入,输出和执行参数实例化要执行的任务。 您可以自行启动任务,也可以作为管道的一部分启动任务。 |
Pipeline |
定义用于编写管道的任务集。 |
PipelineRun |
使用特定输入,输出和执行参数实例化用于执行的管道。 |
使用 Tekton Pipeline 时,可以利用以下功能:
- 云本机:Tekton 管道在 Kubernetes 上运行,将 Kubernetes 集群用作第一类类型,并将容器用作其构建块。
- 已解耦:可以使用一个管道部署到任何 Kubernetes 集群。 您可以隔离运行组成管道的任务。 还可以在管道运行之间切换资源(如 Git 存储库)。
- 类型化:可以切换特定类型资源(例如,映像)的实现。
Tekton Pipelines 项目目前处于测试版阶段。 对于每个新版本的 Tekton,必须更新管道。 有关 Tekton 最新版本的更多信息,请参阅 https://github.com/tektoncd/pipeline/releases。
IBM Cloud® Continuous Delivery 提供了两种类型的交付管道,可用于构建、测试和部署应用程序。
- 经典:经典交付管道以图形方式创建,其中状态会嵌入到管道图中。 这些管道可以在云中的共享工作程序上运行,也可以在您自己的 Kubernetes 集群上运行的专用工作程序上运行。
- Tekton:Tekton 交付管道在 yaml 文件中进行创建,这些文件会将管道定义为一组 Kubernetes 资源。 您可以编辑这些 YAML 文件来更改管道的行为。 Tekton 管道可以在您自己的集群上运行的私有 worker 上运行。 他们还可以在公共云上的 IBM管理的工作程序上运行。 Tekton 集成提供了一个仪表板,您可以通过它查看 Tekton 管道运行的状态并触发新的运行。 它还提供了用于指定管道触发器,管道定义,运行管道的工作程序以及管道属性的机制。
这两种类型的管道通过在单独的容器中运行以及使用您选择的映像,使作业或步骤相互隔离。 Classic 和 Tekton 管道都存在于一个 工具链中,并依赖该工具链来添加更多用于构建、测试和部署过程的工具集成。
2020 年 11 月 20 日,Dockerhub 引入了对匿名镜像提取的速率限制。 此更改可能会影响正在运行引用 Dockerhub 托管的映像的任务的用户。 建议您使用替代注册表,例如 IBM Cloud Container Registry.
先决条件
添加并运行 Tekton 管道之前,请确保以下资源已就位:
-
包含以下工具集成的 工具链:
- 包含 Tekton 管道代码的存储库工具集成(例如,GitHub 工具集成),包括 Tekton yaml 文件。 在 GitHub上查找样本管道和任务定义。 有关开始使用 Tekton 管道的更多信息,请参阅《 Tekton 管道 》。
- 可选。 如果您未使用缺省共享管道工作程序,那么可以使用引用 Kubernetes 集群的 Delivery Pipeline Private Worker 工具集成。 有关专用工作程序的更多信息,请参阅安装 Delivery Pipeline Private Worker。
-
已本地安装 IBM Cloud CLI。
-
kubectl 安装在本地。
-
Kubernetes 集群 (V 1.22 或更高版本),例如 IBM Cloud® Kubernetes Service 集群。
工具链和私有工作 Delivery Pipeline 器工具集成必须位于同一区域。
使用控制台为 Tekton 创建 Delivery Pipeline
配置 Delivery Pipeline 工具集成时,可以选择要创建的管道类型。
-
如果您没有工具链,请选择模板以 创建工具链。 根据您所使用的模板,可能会有不同的字段可用。 请复查缺省字段值,如果必要,更改那些设置。
-
若您已拥有工具链并需向其中添加此工具集成,请在控制 IBM Cloud 台中点击菜单图标 (
)> 平台自动化 > 工具链。 在 "工具链 "页面,单击工具链打开其 "概述 "页面。
-
将 Delivery Pipeline 集成添加到工具链:
a. 单击 “添加工具”。
b. 在“工具集成”部分中,单击 Delivery Pipeline。
-
指定新管道的名称。
-
选择 Tekton 以创建 Tekton Delivery Pipeline。 您可以查看在已定义的 Kubernetes 集群上运行的Tekton管道的输出结果,该功能支持配置管道定义仓库、管道触发器、管道运行位置以及简单的密钥。
-
如果您计划使用管道来部署用户界面,请选中在“查看应用程序”菜单中显示应用程序复选框。 管道所创建的所有应用程序都会显示在工具链“概述”页面上的查看应用程序列表中。
-
单击创建集成,以向工具链添加 Delivery Pipeline。
使用控制台为 Tekton 配置 Delivery Pipeline
-
从工具链的“概述”页面,在 交付管道 卡上,单击 Delivery Pipeline 以打开 Tekton Delivery Pipeline“概述”页面。
-
单击设置。 在 “定义”部分,完成以下任务:
a. 指定包含 Tekton 管道定义和相关工件的 Git 存储库和 URL。 如果存储库不可用,请返回到“工具链概述”页面并添加存储库。
b. 请在您的 Git 仓库中选择要使用的分支,或输入一个标签。
c. 指定 Git 存储库中管道定义的路径。 可以引用同一存储库中的特定定义。 如果多个定义存储库与工具链集成,那么还可以添加这些存储库。
d. 保存更改。
将自动更新管道定义。
计算的管道定义大小限制为 1 MB。 如果在保存或运行管道时迂到错误,那么可能需要减小管道定义的大小,或者将其拆分为多个管道。
-
在 工作程序 部分中,选择要用于运行 Tekton 管道的 IBM 管理的共享工作程序或专用工作程序。 有关专用工作程序的更多信息,请参阅使用 Delivery Pipeline Private Worker。
专用工作程序必须在 Tekton 管道所在的工具链中进行定义。
-
在“环境属性”部分中,单击 添加 并选择属性类型以定义您自己的环境属性。 例如,可以定义
API_KEY属性,该属性传递管道中所有脚本用于访问 IBM Cloud 资源的 API 密钥。 可以添加以下类型的属性:- 枚举: 具有可从用户定义的选项列表中选择的值的属性键。
- 安全值:一个属性键,其单行值经过 AES-128 加密保护。 此值使用星号字符显示。 或者,如果工具链中提供了此类工具,那么可以单击密钥图标以从保险库集成 (例如 IBM Key Protect) 中选择密钥。
- 文本值: 具有文本值的属性键,可以是单行或多行。 先前,单独的 文本区域 属性类型支持多行值。
- 工具集成: 具有在运行时从工具链工具集成解析的值的属性键。 缺省情况下,该值是工具集成的 JSON 字符串表示。 可以通过为可选 JSON 过滤器提供值来检索对象的特定字段或子集。 例如,如果选择了 GitHub 集成,并指定了 JSON 过滤器
parameters.repo_url,当PipelineRun资源运行时,该值将反映工具集成中配置的 Git repo 的 URL。
可以在 Tekton 管道资源中访问这些属性。 有关这些属性的更多信息,请参阅 Tekton Pipeline 环境和资源。
可以锁定属性以防止其被覆盖。 尝试在运行时覆盖锁定的属性将导致运行请求被拒绝。 缺省情况下,锁定的属性不会显示在运行侧面板中,但可以通过启用“显示所有属性”选项以只读方式显示。
-
单击保存。
-
在“管道概述”页面上,单击 添加 以创建触发器,选择要添加的触发器类型,并使触发器与事件侦听器相关联。 可用事件监听器列表包含在管道代码仓库中定义的监听器。
触发器基于 Tekton 触发器定义。 Git repo 触发器会使用与其映射的事件监听器,从传入的事件负载中提取信息,并创建 Kubernetes 资源。 这些资源将应用于 Tekton
PipelineRun资源。触发式管道运行将并行运行,除非您配置触发器以使用
Limit concurrent runs选项对运行进行序列化。 启用此选项后,您可以限制此触发器可启动的同时运行次数。 例如,如果最大限制设置为 1,则一次只能运行一个用于此触发器的流水线,其他流水线将处于“等待”状态。 最多可排队20个运行任务(若使用 IBM 托管工作者则为5个),处于等待状态后后续请求将自动取消。 默认情况下,在使用 IBM 托管工作进程时,所有定时触发器均限制为仅允许一个并发执行实例当触发器超过其并发运行限制时,新的管道运行将处于“等待”状态,直到容量可用。 如果需要,可以修改这种行为,使只有最近的运行处于“等待”状态,而其他运行将自动取消。 例如,当短时间内触发多次构建时,若仅需构建最新提交,此功能 Git 对触发器而言颇具实用价值。 要启用此功能,可在触发器配置面板中使用“限制一次等待运行”切换按钮,也可通过 API 使用
limit_waiting_runs属性进行设置 (请参阅 API 文档 )。 请注意,此设置只适用于处于“等待”状态的运行,不影响正在运行的运行。手动触发器会在您单击 “运行管道”按钮并选择该触发器时运行。
Git 仓库触发器 当指定的 Git 事件类型在指定的 Git 仓库和分支上发生时执行。
您可以从 Tekton 管道资源中访问发送到触发 Git 器的 webhook 有效负载。 虽然确切的字段特定于 repo-specific,但 Webhook 有效内容的一般语法为
$(event.payloadFieldName)。 在创建 webhook 之前,您必须为对应的 Git 集成授权 Git 管理员访问权限。 要授权 Git 管理员访问权限,请 重新配置并保存集成 Git 设置。定时触发器 在 CRON 值定义的调度时间运行。 定时触发器 的 CRON 表达式基于 UNIX crontab 语法,并且是由五个时间和日期字段组成的序列:
minute,hour,day of the month,month和day of the week。 这些字段由格式为X X X X X的空格分隔。 定时触发器的最大频率为每 5 分钟一次。 以下示例显示使用各种定时频率的字符串。*/5 * * * *-触发器每 5 分钟运行一次。0 * * * *- 该触发器在每整点开始时运行。0 9 * 1 MON-FRI-触发器在 1 月的每个工作日上午 9:00 运行。0 * * NOV,DEC 1-触发器在 11 月和 12 月的星期一每小时运行一次。
当配置了秘密设置的 POST 请求发送到通用网络钩子 URL 时,通用网络钩子触发器就会运行。 通用网络钩子触发器为 POST 请求提供唯一的网络钩子 URL。
由于用户界面 PipelineRun 不会在事件有效负载部分隐藏通用 webhook 有效负载值,请勿在有效负载中包含敏感数据。 而是通过使用触发器属性 (例如,密码或 API 密钥) 来保护通用 Webhook 所需的任何数据。
您可以使用以下任何方法来保护通用 Webhook 触发器,以使用 Git,Slack 传出 Webhook,Artifactory Webhook 等:
- 令牌匹配以比较已保存的令牌和 POST 请求中传递的令牌。 受支持的令牌源包括头,查询或有效内容。 令牌匹配由 GitLab Webhook 和 Slack 传出 Webhook 使用。
- 有效内容摘要匹配以通过将 HMAC 十六进制摘要与保存的令牌配合使用来比较从摘要有效内容生成的签名和散列。 受支持的签名源可能包含头,查询或有效内容。 用户必须指定摘要算法。 有效内容摘要匹配由 GitHub Webhook 使用。
- Tekton 任务验证要求用户在其 Tekton 任务中验证 Webhook 请求。
指定以下值以将通用 Webhook 触发器与 GitHub Webhook 配合使用:
- 保护:
Payload Digest Matches - 签名源:
Header - 头键名称:
X-Hub-Signature - 摘要算法:
sha1。
指定以下值以将通用 Webhook 触发器与 GitLab Webhook 配合使用:
- 保护:
Token Matches - 令牌源:
Header - 头键名称:
X-Gitlab-Token
指定以下值以将通用 Webhook 触发器与 Slack 传出 Webhook 配合使用:
- 保护:
Token Matches - 令牌源:
Payload - JSON 属性名称/表单键:
token
以下示例显示如何将 curl 命令与使用 Token Matches 规则保护的通用 Webhook 配合使用:
{: caption="通用网络钩子" caption-side="bottom"}*
curl -X POST \
https://devops-api.us-south.devops.cloud.ibm.com/v1/tekton-webhook/588236be-749b-4c67-ae57-a561abbbc9a8/run/7e82880e-4223-4c98-8ca9-ef6df36bb6dc \
-H 'Content-Type: application/json' \
-H 'token: 48a0f92c0932890048596906a22ae189c48c5619fbcf9600' \
-d '{
"somekey": "somevalue"
}'
要获取管道定义中的有效内容值,请使用派生自事件的值指定 Triggerbinding 参数:
apiVersion: tekton.dev/v1beta1
kind: TriggerBinding
metadata:
name: binding
spec:
params:
- name: somekey
value: $(event.somekey)
保存更改。
此外,通用网络钩子触发器还支持在网络钩子请求正文中传递属性。 这样就可以覆盖 PipelineRun 的属性(由 webhook 触发),或传递附加属性以补充 PipelineRun 中使用的管道/触发器属性。
如果需要在有效载荷属性中传递敏感数据(如密码或 API 密钥秘密),则应为此类属性使用属性类型 SECURE,这样它们就不会以纯文本形式显示在用户界面中。
此外,还可以在请求体中传递一个可选的描述,描述所触发的 PipelineRun,并在浏览器中查看 PipelineRun 详细信息时显示在用户界面中。
下面的示例展示了如何在通用网络钩子中使用 curl 命令,同时传递文本属性、安全属性和说明:
curl -X POST \
https://devops-api.us-south.devops.cloud.ibm.com/v1/tekton-webhook/588236be-749b-4c67-ae57-a561abbbc9a8/run/7e82880e-4223-4c98-8ca9-ef6df36bb6dc \
-H 'Content-Type: application/json' \
-H 'token: 48a0f92c0932890048596906a22ae189c48c5619fbcf9600' \
-d '{
"description":"This text can be used to describe the PipelineRun that will be triggered by this request.",
"properties":[
{"name":"mytextprop","type":"TEXT","value":"my text value"},
{"name":"mysecureprop","type":"SECURE","value":"mysecret"}
]
}'
为 Tekton 管道配置 Delivery Pipeline 触发器
您可以根据 Git repo 中的各种事件为 Tekton 管道配置触发器。 使用以下选项过滤 Git 触发器:
- 分支:当指定事件发生时,触发所选软件包特定分支的管道。
- 模式:当指定事件发生时,根据所选软件包中标签和分支名称的全局匹配触发管道。
- CEL 过滤器:当事件与提供的通用表达式语言(CEL)过滤器匹配时触发管道。
使用分支和模式选项指定事件,如 "commit push、"pull request opened"、"updated“或”closed。 此外,你还可以通过切换“包含草稿拉取请求事件”选项来指定拉取请求事件,以允许或跳过草稿拉取请求的管道触发器。
同样,你也可以使用 "包括来自分叉的拉取请求事件切换来指定是否允许管道触发来自分叉版本库的拉取请求。 此外,您还可以选择“标签筛选器”选项,根据筛选器表中用户定义的标准,启用基于拉取请求标签的筛选。
CEL 过滤器选项支持更高级的用例,例如与事件有效载荷中的其他字段进行匹配。 此选项支持推送事件、所有拉取请求事件、问题事件、问题评论事件、发布事件以及 GitHub 合并队列事件。 该选项也是通用网络钩子触发器的可选功能,可根据网络钩子有效载荷提供事件过滤功能。
CEL 概览
CEL 是一种强大而灵活的表达式语言,旨在以简明易读的方式评估条件和执行验证。 CEL 非常适合需要复杂条件逻辑的用例,如过滤事件。
Tekton 管道中引入了 CEL 选项,以提供更强大、更灵活的事件过滤功能。 网络钩子有效载荷将根据用户提供的 CEL 表达式进行评估。 如果 CEL 表达式求值为 true,就会触发管道运行。
CEL 支持以下功能:
- 算术运算符(
+、-、*、/、%) - 比较运算符(
=、!=、<、>、<=、>=) - 逻辑运算符(
&&、||) - 字符串操作符(
contains,matches,startsWith,endsWith) - 集合运算符(
in,!in) - 变量(直接引用变量名)
- 字面量(支持字符串、数字、布尔值和空值等字面量)
CEL 包括以下扩展,为基本 CEL 语言提供更多功能:
Sets extension以支持高级设置操作,并为事件过滤提供更多灵活性。 有关此扩展的更多信息,请参阅 Sets。matchesGlob以便在将现有模式字段转换为新的 CEL 筛选器选项时提供兼容性。 建议使用本地 CELmatches操作符进行更高级的正则表达式匹配。
有关 CEL 的更多信息,请参阅 CEL 文档。
转换为 CEL
完成以下步骤,将现有事件筛选选择转换为 CEL 表达式:
-
编辑要转换的 Git 触发器。
-
在 Trigger on 部分,选择 CEL filter 选项。
*
CEL 过滤器 以下元素会自动转换为等价的 CEL 表达式:
- 分支或图案
- 事件,如
commit push、pull request opened、updated和closed - 包括拉取请求事件草案
- 包括来自分叉的拉取请求事件
- 标签过滤器
*
CEL 过滤器 生成的 CEL 表达式会写入一个文本区域字段,您可以根据需要对其进行编辑。
由于通用 Webhook 触发器不存在转换过滤器,因此转换为 CEL 过滤器仅适用于 Git 触发器。
如果保存触发器时选择了 CEL 选项,则会用 CEL 表达式替换之前选择的事件。 如果在保存 CEL 过滤器选项后切换到分支或模式选项,则不会保存之前的事件选择。 不支持将 CEL 选项转换为分支或模式选项。
CEL 表达示例
以下示例是每个受支持的 Git 类型的常用 CEL 表达式:GitHub、GitLab 和 BitBucket。 您可以复制和修改这些示例,以满足您的要求。
GitHub 示例:
当针对指定分支打开或更新拉取请求时运行:
header['x-github-event'] == 'pull_request' &&
(body.action == 'opened' || body.action == 'synchronize') &&
body.pull_request.base.ref == 'main'
当提交推送到指定分支时运行:
header['x-github-event'] == 'push' && body.ref == 'refs/heads/main'
当提交推送到指定分支时运行,但当提交信息包含特定字符串时跳过:
header['x-github-event'] == 'push' &&
body.ref == 'refs/heads/main' &&
!body.head_commit.message.contains("skip run")
当包含指定字符串的注释被添加到拉取请求时运行:
header['x-github-event'] == 'issue_comment' &&
body.action == 'created' && has(body.issue.pull_request) &&
body.comment.body.contains('/lgtm')
当创建带有指定标签的问题时运行:
header['x-github-event'] == 'issues' &&
body.action == 'opened' &&
body.issue.labels.exists(label, label.name == 'urgent')
GitLab 示例:
当针对指定分支打开或更新合并请求时运行:
header['x-gitlab-event'] == 'Merge Request Hook' &&
(body.object_attributes.action == 'open' || body.object_attributes.action == 'update') &&
body.object_attributes.target_branch == 'main'
当提交推送到指定分支时运行:
header['x-gitlab-event'] == 'Push Hook' && body.ref == 'refs/heads/main'
当提交推送到指定分支时运行,但当提交信息包含特定字符串时跳过:
header['x-gitlab-event'] == 'Push Hook' &&
body.ref == 'refs/heads/main' &&
!body.object_attributes.last_commit.message("skip run")
当合并请求中添加了包含指定字符串的注释时运行:
header['x-gitlab-event'] == 'Note Hook' &&
body.object_attributes.noteable_type == 'MergeRequest' &&
body.object_attributes.action == 'create' &&
body.object_attributes.note.contains('/lgtm')
当创建带有指定标签的问题时运行:
header['x-gitlab-event'] == 'Issue Hook' &&
(body.object_attributes.action == 'open') &&
body.object_attributes.labels.exists(label, label.name == 'urgent')
BitBucket 示例:
当针对指定分支打开或更新拉取请求时运行:
(header['x-event-key'] == 'pullrequest:created' || header['x-event-key'] == 'pullrequest:updated') &&
body.pullrequest.destination.branch.name == 'main'
当提交推送到指定分支时运行:
header['x-event-key'] == 'repo:push' && body.push.changes[0].new.name == 'main'
当提交推送到指定分支时运行,但当提交信息包含特定字符串时跳过:
header['x-event-key'] == 'repo:push' &&
body.push.changes[0].new.name == 'main' &&
!body.push.changes[0].commits[0].message("skip run")
当包含指定字符串的注释被添加到拉取请求时运行:
header['x-event-key'] == 'pullrequest:comment_created' &&
body.comment.content.raw.contains('/lgtm')
当创建带有指定标签的问题时运行:
header['x-event-key'] == 'issue:created' &&
body.issue.kind == 'bug'
过滤器
过滤器允许用户根据特定条件完善拉取请求。 过滤器字段目前支持在拉取请求中指定标签,从而根据标签的存在与否控制管道的执行。 不过,它不会在添加或删除标签时触发流水线;相反,它会在允许执行流水线之前验证 PR 的标签。
工作方式:
- 如果 PR 事件发生(如新增提交),管道会检查 PR 上的标签。
- 如果 PR 符合标签条件(例如具有 "已批准 "标签),管道就会运行。
- 如果 PR 不符合标签条件,管道将不会执行。
配置示例:
下面的截图显示了一个例子,触发器是为标签“已批准”和“已审核”配置的。
- 只有当两个标签都存在时,才会触发 PR 管道。
- 如果缺少其中一个标签,管道将无法运行。
检查事件有效载荷
在编写用于事件过滤的 CEL 表达式时,您必须了解将对表达式进行评估的 webhook 有效负载的结构和内容。 您可以从管道运行详细信息页面检查现有运行的有效载荷。
要查看事件有效载荷,请转到管道运行详细信息页面并单击 显示上下文。 您可以查看触发管道运行的原始 webhook 有效载荷,并确认 CEL 表达式的相关字段是否与您想要的条件相匹配。
使用 API 为 Tekton 创建 Delivery Pipeline
-
获取 IAM 不记名令牌。 或者,如果您正在使用 SDK,请 获取 IAM API 密钥,并使用环境变量设置客户机选项。
export CD_TEKTON_PIPELINE_APIKEY={api_key} -
将 Delivery Pipeline 工具集成添加到工具链。
curl -X POST \ https://api.{region}.devops.cloud.ibm.com/toolchain/v2/toolchains/{toolchain_id}/tools \ -H 'Authorization: Bearer {iam_token}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "tool_type_id": "pipeline", "parameters": { "name": "{tool_integration_name}", "type" : "tekton" } }'const CdToolchainV2 = require('@ibm-cloud/continuous-delivery/cd-toolchain/v2'); ... (async () => { const toolchainService = CdToolchainV2.newInstance(); const pipelinePrototypeModel = { toolchainId: {toolchain_id}, toolTypeId: 'pipeline', name: {tool_integration_name}, type: "tekton" }; const pipelineTool = await toolchainService.createTool(pipelinePrototypeModel); })();import ( "github.com/IBM/continuous-delivery-go-sdk/cdtoolchainv2" ) ... toolchainClientOptions := &cdtoolchainv2.CdToolchainV2Options{} toolchainClient, err := cdtoolchainv2.NewCdToolchainV2UsingExternalConfig(toolchainClientOptions) createPipelineToolOptions := toolchainClient.NewCreateToolOptions({toolchain_id}, "pipeline") createPipelineToolOptions.SetName({tool_integration_name}) createPipelineToolOptions.SetType("tekton") pipelineTool, response, err := toolchainClient.CreateTool(createPipelineToolOptions)from ibm_continuous_delivery.cd_toolchain_v2 import CdToolchainV2 ... toolchain_service = CdToolchainV2.new_instance() pipeline_tool = toolchain_service.create_tool( name = {tool_integration_name}, toolchain_id = {toolchain_id}, tool_type_id = "pipeline", type = "tekton" )import com.ibm.cloud.continuous_delivery.cd_toolchain.v2.CdToolchain; import com.ibm.cloud.continuous_delivery.cd_toolchain.v2.model.*; ... CdToolchain toolchainService = CdToolchain.newInstance(); CreateToolOptions createPipelineToolOptions = new CreateToolOptions.Builder() .name({tool_integration_name}) .toolchainId({toolchain_id}) .toolTypeId("pipeline") .type("tekton") .build(); Response<ToolchainToolPost> response = toolchainService.createTool(createPipelineToolOptions).execute(); ToolchainToolPost pipelineTool = response.getResult();下表列出并描述了上一步中使用的每个变量。
用于将Delivery Pipeline工具与 API 集成的变量 变量 描述 {region}工具链所在的区域,例如 us-south。{tool_integration_name}工具集成的名称,例如 ci-pipeline。{toolchain_id}要向其添加工具集成的工具链的标识。 {iam_token}一个有效的 IAM 承载令牌。 -
配置 Delivery Pipeline 以使用指定区域中的公共受管工作程序。
curl -X POST \ https://api.{region}.devops.cloud.ibm.com/pipeline/v2/tekton_pipelines \ -H 'Authorization: Bearer {iam_token}' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "id": "{pipeline_id}", "worker": { "id": "public" } }'const CdTektonPipelineV2 = require('@ibm-cloud/continuous-delivery/cd-tekton-pipeline/v2'); ... (async () => { const tektonService = CdTektonPipelineV2.newInstance(); const workerIdentityModel = { id: 'public', }; const params = { id: {pipeline_id}, worker: workerIdentityModel, }; const res = await tektonService.createTektonPipeline(params); })();import { "github.com/IBM/continuous-delivery-go-sdk/cdtektonpipelinev2" } ... cdTektonPipelineOptions := &cdtektonpipelinev2.CdTektonPipelineV2Options{} pipelineSvc, err = cdtektonpipelinev2.NewCdTektonPipelineV2UsingExternalConfig(cdTektonPipelineOptions) createTektonPipelineOptions := pipelineSvc.NewCreateTektonPipelineOptions( {pipeline_id} ) workerIdentityModel := &cdtektonpipelinev2.WorkerIdentity{ ID: core.StringPtr("public"), } createTektonPipelineOptions.SetWorker(workerIdentityModel) tektonPipeline, response, err := pipelineSvc.CreateTektonPipeline(createTektonPipelineOptions)from ibm_continuous_delivery.cd_tekton_pipeline_v2 import CdTektonPipelineV2 ... pipeline_service = CdTektonPipelineV2.new_instance() worker_identity_model = { 'id': 'public', } response = pipeline_service.create_tekton_pipeline( id = {pipeline_id}, worker = worker_identity_model ) tekton_pipeline = response.get_result()import com.ibm.cloud.continuous_delivery.cd_tekton_pipeline.v2.CdTektonPipeline; import com.ibm.cloud.continuous_delivery.cd_tekton_pipeline.v2.model.*; ... CdTektonPipeline pipelineSvc = CdTektonPipeline.newInstance(); WorkerIdentity workerIdentityModel = new WorkerIdentity.Builder() .id("public") .build(); CreateTektonPipelineOptions createTektonPipelineOptions = new CreateTektonPipelineOptions.Builder() .id({pipeline_id}) .worker(workerIdentityModel) .build(); Response<TektonPipeline> response = pipelineSvc.createTektonPipeline(createTektonPipelineOptions).execute(); TektonPipeline tektonPipeline = response.getResult();下表列出并描述了上一步中使用的每个变量。
用于使用 API 配置Delivery Pipeline的变量 变量 描述 {region}工具链所在的区域,例如 us-south。{pipeline_id}从创建管道工具集成的上一步返回的管道的标识。 {iam_token}一个有效的 IAM 承载令牌。
有关 Delivery Pipeline API 的更多信息,请参阅 API 文档。
使用 Terraform 为 Tekton 创建 Delivery Pipeline
-
要安装 Terraform CLI 并为 Terraform 配置 IBM Cloud 提供程序插件,请遵循 IBM Cloud® 上的 Terraform 入门 的教程。
-
创建一个名为
main.tf的Terraform配置文件。 在此文件中,添加配置以使用 HashiCorp 配置语言创建管道。 有关使用此配置语言的更多信息,请参阅 Terraform 文档。管道必须属于工具链。 您还可以通过 使用 Terraform 创建工具链。
以下示例使用指定的 Terraform 资源创建工具链和管道。
data "ibm_resource_group" "group" { name = "default" } resource "ibm_cd_toolchain" "my_toolchain" { name = "terraform_toolchain" resource_group_id = data.ibm_resource_group.group.id } resource "ibm_cd_toolchain_tool_pipeline" "my_pipeline_tool" { parameters { name = "terraform-pipeline-integration" } toolchain_id = ibm_cd_toolchain.my_toolchain.id } resource "ibm_cd_tekton_pipeline" "my_tekton_pipeline" { worker { id = "public" } pipeline_id = ibm_cd_toolchain_tool_pipeline.my_pipeline_tool.tool_id }有关
ibm_cd_toolchain_tool_pipeline和ibm_cd_tekton_pipeline资源的更多信息,请参阅 Terraform Registry 文档中的参数参考详细信息。 -
初始化 Terraform CLI (如果需要)。
terraform init -
创建 Terraform 执行计划。 此计划汇总了为创建工具链而必须运行的所有操作。
terraform plan -
应用 Terraform 执行计划。 Terraform 将执行所有必需的操作来创建工具链。
terraform apply
查看 Delivery Pipeline for Tekton
您可以使用控制台 UI,API 或 Terraform 来查看管道。
使用控制台查看 Delivery Pipeline
“Tekton Delivery Pipeline 概述”页面显示空表,直到至少添加一个触发器为止。 Tekton 管道运行后 (手动运行或作为外部事件的结果),此表显示与管道中的每个触发器相关联的最近运行的相关数据。 每行显示有关单个触发器的信息,并显示与该触发器关联的最近运行的图形。 还会显示诸如这些运行的成功或失败以及最近一次运行发生的时间之类的信息。 您还可以对每个触发器执行操作: 手动运行触发器,将其标记为收藏夹,编辑触发器,启用或禁用触发器,或者将其删除。 您还可以单击图形中的某个项以检查该单个
PipelineRun 的详细信息。 或者,您可以单击触发器名称以将 " PipelineRuns " 页面打开到与该触发器关联的每个 PipelineRun。 还提供了相关信息,例如,每个 PipelineRun 的状态,触发器和持续时间。
管道运行可以处于以下任一状态:
- 暂挂: 已请求
PipelineRun。 - 正在运行:
PipelineRun正在集群上运行。 - 已成功:
PipelineRun已在集群上成功完成。 - 失败:
PipelineRun失败。 请查看运行的日志文件来确定原因。 - 已排队: 当工作程序容量可用时,将接受
PipelineRun进行处理并运行。 - 正在等待:
PipelineRun正在等待排队。 - 已取消:
PipelineRun已由系统或用户取消。 当等待运行的次数超过允许的限制时,系统会取消 "PipelineRun。 - 错误:
PipelineRun包含阻止将其应用于集群的错误。 有关错误原因的更多信息,请参阅运行详细信息。
有关所选运行的详细信息,请单击表中的任何行以查看 Task 定义以及每个 PipelineRun 定义中的步骤。 还可以查看每个 Task 定义和步骤的状态、日志和详细信息,以及 PipelineRun 定义的总体状态。
和日志的 PipelineRuns 保留期限取决于所选的实例 Continuous Delivery 方案。 专业计划下的泰克顿管道保留一年。 轻量套餐下的泰克顿管道保留 30 天。 若需在保留期结束后继续保留 PipelineRuns 任何数据,请在相应 PipelineRuns 部分选择 “操作” > “下载”以获取压缩包文件。
使用 API 查看 Delivery Pipeline
-
获取 IAM 不记名令牌。 或者,如果您正在使用 SDK,请 获取 IAM API 密钥,并使用环境变量设置客户机选项。
export CD_TEKTON_PIPELINE_APIKEY={api_key} -
获取管道数据。
curl -X GET \ https://api.{region}.devops.cloud.ibm.com/pipeline/v2/tekton_pipelines/{pipeline_id} \ -H 'Authorization: Bearer {iam_token}' \ -H 'Accept: application/json'const CdTektonPipelineV2 = require('@ibm-cloud/continuous-delivery/cd-tekton-pipeline/v2'); ... (async () => { const pipelineSvc = CdTektonPipelineV2.newInstance(); const params = { id: {pipeline_id}, }; const res = await pipelineSvc.getTektonPipeline(params); })();import { "github.com/IBM/continuous-delivery-go-sdk/cdtektonpipelinev2" } ... cdTektonPipelineOptions := &cdtektonpipelinev2.CdTektonPipelineV2Options{} pipelineSvc, err = cdtektonpipelinev2.NewCdTektonPipelineV2UsingExternalConfig(cdTektonPipelineOptions) getTektonPipelineOptions := pipelineSvc.NewGetTektonPipelineOptions( {pipeline_id} ) tektonPipeline, response, err := pipelineSvc.GetTektonPipeline(getTektonPipelineOptions)from ibm_continuous_delivery.cd_tekton_pipeline_v2 import CdTektonPipelineV2 ... pipeline_service = CdTektonPipelineV2.new_instance() response = pipeline_service.get_tekton_pipeline( id = {pipeline_id} ) tekton_pipeline = response.get_result()import com.ibm.cloud.continuous_delivery.cd_tekton_pipeline.v2.CdTektonPipeline; import com.ibm.cloud.continuous_delivery.cd_tekton_pipeline.v2.model.*; ... CdTektonPipeline pipelineSvc = CdTektonPipeline.newInstance(); GetTektonPipelineOptions getTektonPipelineOptions = new GetTektonPipelineOptions.Builder() .id({pipeline_id}) .build(); Response<TektonPipeline> response = pipelineSvc.getTektonPipeline(getTektonPipelineOptions).execute(); TektonPipeline tektonPipeline = response.getResult();
下表列出并描述了上一步中使用的每个变量。
| 变量 | 描述 |
|---|---|
{region} |
管道所在的区域,例如 us-south。 |
{pipeline_id} |
您要查看的管道的 ID。 |
{iam_token} |
一个有效的 IAM 承载令牌。 |
使用 Terraform 查看 Delivery Pipeline
-
找到包含现有管道的
resource块的 Terraform 文件 (例如,main.tf)。 -
如果
output块尚未包含块,请将其添加到 Terraform 文件中。以下示例中的
resource描述了现有管道。output块指示 Terraform 输出指定资源的属性。data "ibm_resource_group" "group" { name = "default" } resource "ibm_cd_toolchain" "my_toolchain" { name = "terraform_toolchain" resource_group_id = data.ibm_resource_group.group.id } resource "ibm_cd_toolchain_tool_pipeline" "my_pipeline_tool" { parameters { name = "terraform-pipeline-integration" } toolchain_id = ibm_cd_toolchain.my_toolchain.id } resource "ibm_cd_tekton_pipeline" "my_tekton_pipeline" { worker { id = "public" } pipeline_id = ibm_cd_toolchain_tool_pipeline.my_pipeline_tool.tool_id } output "my_tekton_pipeline_attributes" { value = ibm_cd_tekton_pipeline.my_tekton_pipeline }有关
ibm_cd_toolchain_tool_pipeline和ibm_cd_tekton_pipeline资源的更多信息,请参阅 Terraform Registry 文档中的参数参考详细信息。 -
初始化 Terraform CLI (如果需要)。
terraform init -
使用
refresh-only选项应用 Terraform 执行计划。 Terraform 将刷新其状态并显示管道资源的属性。terraform apply -refresh-only -auto-approve
查看 Delivery Pipeline 的 Tekton 日志
您可以使用控制台用户界面、应用程序接口查看 PipelineRuns 的日志,也可以下载日志。 此外,您还可以配置 " Continuous Delivery " 服务实例,将 Tekton PipelineRun 日志路由到同一账户中的 IBM Cloud Logs 实例。
使用控制台查看 Delivery Pipeline 的运行日志
您可以使用控制台用户界面查看 Tekton 管道的 PipelineRuns 日志。 要访问运行中每个步骤的日志,请单击 Tekton Delivery Pipeline 概述页面表格中的各个运行,然后打开运行详情页面。
单击“显示上下文”查看有关 PipelineRun 的其他元数据,单击“代理日志”查看处理和执行运行的工作代理的日志。 代理日志包含有用的信息,如 PipelineRun 执行的群集名称、工作代理的版本号、有关 git 克隆操作的详细信息,以及代理在准备执行 PipelineRun 时所采取的其他处理步骤。
如果运行遇到问题,这些日志还可能包含有用的错误和调试信息。
在 PipelinRun 详情页面,您还可以下载 PipelineRun 压缩包,其中包含所有日志以及一些包含 PipelineRun 元数据的文件。 可点击 PipelineRun 详细页面上的“操作”>“下载”下载。
在 Delivery Pipeline 中查看运行日志 IBM Cloud Logs
PipelineRuns Tekton 管道的日志可以发送到 IBM Cloud Logs 实例,以便在那里查看、过滤或搜索日志。 要启用这一功能,需要几个步骤:
- IBM Cloud Logs 的实例需要与您的 " Continuous Delivery " 实例位于同一账户和资源组中。 访问 Observability-> Logging-> Instances 查看现有的 IBM Cloud Logs 实例,或创建新的 IBM Cloud Logs 实例。
- 转到 Observability-> Logging-> Routing。 单击表中 Tekton 管道和 Continuous Delivery 服务实例所在区域的设置目标。
- 从列出实例的表格中选择 IBM Cloud Logs 实例。 您可能需要先点击“授权”按钮,然后您的实例才会被列出。
- 从 IBM Cloud 的“资源”页面打开 " Continuous Delivery "服务实例。
- 转到“**管理 **”页面,打开“设置”选项卡。 然后点击“启用 Tekton 管道平台日志”的切换按钮。
完成上述配置后,任何新 PipelineRuns 的日志都将转发到 IBM Cloud Logs 实例。 在 IBM Cloud Logs 中查看日志:
- 打开 IBM Cloud Logs 实例的控制面板,进入日志页面。
- 在过滤器部分,单击应用程序过滤器下的 ibm-platform-logs 复选框和应用程序过滤器下的工具链复选框。
- 选择日期范围。
- 此处显示的日志数据包含元数据和日志本身。 您可以自定义此视图中显示的列,以显示相关日志数据,并根据这些属性进行筛选。 例如:
message.log- 其中包含单行日志文本。message.timestamp- 与该日志行相关的时间戳。message.lineNumber- 这表示该日志行在步骤日志中的行号。message.pipelineId- 生成此日志的运行的管道 ID。message.region-PipelinRun所在地区的名称。message.regionId-PipelinRun运行所在区域的 ID。message.severity- 与该日志行相关的严重程度,如error,debug,info。message.pipelineMetadata包含有用的数据,例如accountId- 拥有此PipelineRun的 IBM Cloud 账户的 ID。buildNumber- 相关PipelineRun的版本号。pipelineName- 拥有此运行的管道名称。pipelineRunId- 生成此日志行的PipelineRun的 ID。stepName- 生成此日志行的步骤名称。taskName- 与此 logv 相关的任务名称。toolchainId- 包含运行管道的工具链 ID。triggerName- 创建产生此日志行的运行的管道触发器名称。
使用应用程序接口查看 Delivery Pipeline 的运行日志
-
获取 PipelineRun 可用的日志对象列表。
curl -X GET \ https://api.{region}.devops.cloud.ibm.com/pipeline/v2/tekton_pipelines/{pipeline_id}/pipeline_runs/{run_id}/logs \ -H 'Authorization: Bearer {iam_token}' \ -H 'Accept: application/json'此 API 请求会返回一个日志对象数组,其中每个对象包含来自 PipelineRun:
{ "logs": [ { "name": "pipelinerun-sample/step-0", "id": "{sample_log_id}", "href": "https://api.us-south.devops.cloud.ibm.com/pipeline/v2/tekton_pipelines/{pipeline_id}/pipeline_runs/{run_id}/logs/{sample_log_id}" } ] } -
每个日志对象条目都映射到 PipelineRun 中的一个步骤。 要获取步骤日志,请使用相关日志对象中的
href值进行请求:curl -X GET \ https://api.{region}.devops.cloud.ibm.com/pipeline/v2/tekton_pipelines/{pipeline_id}/pipeline_runs/{run_id}/logs/{sample_log_id} \ -H 'Authorization: Bearer {iam_token}' \ -H 'Accept: application/json'该请求在响应中返回一个对象,其中包含日志和 log_id:
{ "data": "log content", "id": "{sample_log_id}" }
删除 Delivery Pipeline
可以通过控制台用户界面、应用程序接口或 Terraform 删除管道。 此删除操作无法撤销。
使用控制台用户界面删除工具链
- 从 IBM Cloud 控制台,单击菜单图标
> 平台自动化 > 工具链。
- 在“工具链”页面上,单击某个工具链以打开其“概述”页面。 或者,在您应用的“应用详情”页面上,点击工具链名称。
- 在“交付管道”部分,找到要删除的管道。
- 单击该管道的菜单图标,然后单击删除选项。
- 单击对话框中的删除,确认删除。
使用 API 删除 Delivery Pipeline
-
获取 IAM 不记名令牌。 或者,如果您正在使用 SDK,请 获取 IAM API 密钥,并使用环境变量设置客户机选项。
export CD_TEKTON_PIPELINE_APIKEY={api_key} -
删除管道。
curl -X DELETE \ https://api.{region}.devops.cloud.ibm.com/toolchain/v2/toolchains/{toolchain_id}/tools/{pipeline_id} \ -H 'Authorization: Bearer {iam_token}'const CdTektonPipelineV2 = require('@ibm-cloud/continuous-delivery/cd-tekton-pipeline/v2'); ... (async () => { const pipelineSvc = CdTektonPipelineV2.newInstance(); const params = { id: {pipeline_id}, }; const res = await pipelineSvc.deleteTektonPipeline(params); })();import { "github.com/IBM/continuous-delivery-go-sdk/cdtektonpipelinev2" } ... cdTektonPipelineOptions := &cdtektonpipelinev2.CdTektonPipelineV2Options{} pipelineSvc, err = cdtektonpipelinev2.NewCdTektonPipelineV2UsingExternalConfig(cdTektonPipelineOptions) deleteTektonPipelineOptions := pipelineSvc.NewDeleteTektonPipelineOptions( {pipeline_id} ) response, err := pipelineSvc.DeleteTektonPipeline(deleteTektonPipelineOptions)from ibm_continuous_delivery.cd_tekton_pipeline_v2 import CdTektonPipelineV2 ... pipeline_service = CdTektonPipelineV2.new_instance() response = pipeline_service.delete_tekton_pipeline( id={pipeline_id} )import com.ibm.cloud.continuous_delivery.cd_tekton_pipeline.v2.CdTektonPipeline; import com.ibm.cloud.continuous_delivery.cd_tekton_pipeline.v2.model.*; ... CdTektonPipeline pipelineSvc = CdTektonPipeline.newInstance(); DeleteTektonPipelineOptions deleteTektonPipelineOptions = new DeleteTektonPipelineOptions.Builder() .id({pipeline_id}) .build(); Response<Void> response = pipelineSvc.deleteTektonPipeline(deleteTektonPipelineOptions).execute();
下表列出并描述了上一步中使用的每个变量。
| 变量 | 描述 |
|---|---|
{region} |
工具链所在的区域,例如 us-south。 |
{toolchain_id} |
包含要删除的管道的工具链的标识。 |
{pipeline_id} |
要删除的管道的 ID。 |
{iam_token} |
一个有效的 IAM 承载令牌。 |
使用 Terraform 删除 Delivery Pipeline
-
找到包含现有管道的
resource块的 Terraform 文件 (例如,main.tf)。以下示例中的
resource描述了现有管道。data "ibm_resource_group" "group" { name = "default" } resource "ibm_cd_toolchain" "my_toolchain" { name = "terraform_toolchain" resource_group_id = data.ibm_resource_group.group.id } resource "ibm_cd_toolchain_tool_pipeline" "my_pipeline_tool" { parameters { name = "terraform-pipeline-integration" } toolchain_id = ibm_cd_toolchain.my_toolchain.id } resource "ibm_cd_tekton_pipeline" "my_tekton_pipeline" { worker { id = "public" } pipeline_id = ibm_cd_toolchain_tool_pipeline.my_pipeline_tool.tool_id } -
从 Terraform 文件中除去
ibm_cd_toolchain_tool_pipeline和ibm_cd_tekton_pipelineresource块。 -
初始化 Terraform CLI (如果需要)。
terraform init -
创建 Terraform 执行计划。 此计划总结了为删除管道而必须运行的所有操作。
terraform plan -
应用 Terraform 执行计划。 Terraform 将执行删除管道所需的所有操作。
terraform apply
使用触发器
您可以使用网络用户界面或命令行/API 调用触发管道。 这通常用于 CI、CD 或 CC 管道等管道。
通过命令行或应用程序接口触发管道
您可以使用 IBM Cloud CLI 或 curl 直接调用 API,从命令行触发管道。
使用 IBM Cloud 命令行界面(CLI)
您可以使用 IBM Cloud CLI 触发管道。 有关 CLI 命令的更多信息,请参阅 IBM Cloud CLI 文档。
- 登录到 IBM Cloud
ibmcloud login --sso - 手动触发管道
ibmcloud dev tekton-trigger <pipeline_id> --trigger-name "<trigger_name>"
替换命令中的 pipeline_id 和 trigger_name 后,运行命令启动管道。 如果成功,输出将显示管道已启动,并显示类似下面的详细信息:
管道已成功启动。
- 运行标识:ruekhg-eifjkvr-kjf-rkvj
- 触发器:CC 手动触发器
- 状态:待定
然后,您可以在用户界面中打开相应的工具链,验证管道是否已被触发。
使用 curl 通过 API 触发管道
您可以使用 curl 直接通过应用程序接口触发管道。 有关如何通过 API 触发 Tekton 管道的更多信息,请参阅 IBM Cloud API Docs/
CD Tekton 管道.
认证程序
-
如果您还没有 API 密钥,请访问 IBM Cloud API 密钥 来生成一个。
-
获得 API 密钥后,使用以下
curl命令生成 IAM 令牌:curl -X POST 'https://iam.cloud.ibm.com/identity/token' \ -H 'Content-Type:application/x-www-form-urlencoded' \ -H 'Accept:application/json' \ -d 'grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=<API_KEY>' -
将 <API_KEY> 替换为生成的 API 密钥。
-
获得 IAM 令牌后,使用它对以下请求进行身份验证,以访问您的管道:
curl -L --request GET 'https://api.us-south.devops.cloud.ibm.com/pipeline/v2/tekton_pipelines/<PIPELINE_ID>' \ --header 'Authorization: Bearer <IAM_TOKEN_VALUE>' -
验证后,使用以下
curl命令触发管道:curl -i -X POST \ -H "Authorization: Bearer <IAM_token>" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ --data '{ "trigger": { "name": "CC Manual Trigger", "properties": { "pipeline-debug": "false" } } }' \ "https://api.us-south.devops.cloud.ibm.com/pipeline/v2/tekton_pipelines/<pipeline_id>/pipeline_runs" -
-i选项可确保输出中包含 HTTP 响应头,这有助于在出现错误时查看 HTTP 状态代码。 -
您可以在
--data有效载荷中添加管道所需的任何环境属性,要了解如何添加属性的更多信息,请参阅 IBM Cloud API Docs/ CD Tekton 管道. -
触发管道后,输出结果类似于下面的内容:
-
HTTP 响应将显示
201 Created状态,确认管道触发请求已被接受。 -
location标头将指向触发管道运行的 URL。 -
您将看到以下元数据
pipeline_idstatus(如 )"pending"trigger名称(如 )"Manual CD Trigger"run_id(触发运行的唯一 ID)- 完整的 URL,可在用户界面中查看运行情况。
-
这证明管道已成功触发。 现在,您可以在 IBM Cloud UI 中导航到工具链的管道部分,查看其状态和日志。
-
-
命令成功运行后,管道即被触发。 一旦触发,响应将包括管道运行的详细信息。
查看 TaskRun pod 的详细信息
要查看有关特定 TaskRun 的底层 Kubernetes pod 的信息,请单击 Task 名称,然后单击 Pod。
您可以查看 pod 的详细信息以及工作程序报告的任何相关事件。 此信息可帮助您调试特定故障或确定运行期间的耗用时间。
了解有关 Tekton 管道和资源的更多信息
要了解有关 Tekton 管道的更多信息,请参阅 Tekton:Continuous Delivery 的现代方法文章。
要了解有关可在管道中引用的 Tekton 任务的更多信息,请参阅 Open Toolchain Tekton Catalog。 此 GitHub 存储库包含一组可在 Tekton 管道中复用的任务。