第 6 章 管理管道运行
使用 Pipelines as Code,您可以在代码存储库中创建管道并运行这些管道。
6.1. 使用 Pipelines as Code 创建管道运行
要使用 Pipelines as Code 运行管道,您可以在存储库的 .tekton/
目录中创建管道运行定义或模板作为 YAML 文件。您可以使用远程 URL 在其他存储库中引用 YAML 文件,但管道运行仅由包含 .tekton/
目录中的事件触发。
Pipelines as Code 解析器会将所有任务与管道运行绑定,作为一个单独的管道运行,而无需外部依赖项。
-
对于管道,使用最少一个带有 spec 的管道,或一个独立的
Pipeline
对象。 - 对于任务,在管道中嵌入任务 spec,或者将其单独定义为一个 Task 对象。
参数化提交和 URL
您可以使用 {{<var>}} 的格式来使用动态的、可扩展的参数,在您的提交中指定参数。目前,您可以使用以下变量:
-
{{repo_owner}}
: 存储库所有者。 -
{{repo_name}}
: 存储库名称。 -
{{repo_url}}
:存储库完整 URL。 -
{{revision}}
:提交的完全 SHA 修订。 -
{{sender}}
:提交发送者的用户名或帐户 ID。 -
{{source_branch}}
:事件源自的分支名称。 -
{{target_branch}}
:事件目标的分支名称。对于推送事件,它与source_branch
相同。 -
{{pull_request_number}}
:拉取或合并请求号,仅对pull_request
事件类型定义。 -
{{git_auth_secret}}
:使用 Git 提供程序的令牌自动生成的 secret 名称,用于签出私有存储库。
将事件与管道运行匹配
您可以通过在管道运行中使用特殊注解,将不同的 Git 供应商事件与每个管道运行匹配。如果有多个管道与事件匹配,Pipelines as Code 会并行运行它们,并在管道运行完成后将结果发送到 Git 供应商。
将 pull 事件与管道运行匹配
您可以使用以下示例将 pipeline-pr-main
管道运行与以 main
分支为目标的 pull_request
事件匹配:
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
name: pipeline-pr-main
annotations:
pipelinesascode.tekton.dev/on-target-branch: "[main]" 1
pipelinesascode.tekton.dev/on-event: "[pull_request]"
# ...
- 1
- 您可以通过添加以逗号分隔的条目来指定多个分支。例如:
"[main, release-nightly]"
。另外,您可以指定以下内容:-
对分支的完整引用,如
"refs/heads/main"
-
带有模式匹配的 globs,如
"refs/heads/\ the"
-
标签,如
"refs/tags/1.\*"
-
对分支的完整引用,如
将推送事件与管道运行匹配
您可以使用以下示例将 pipeline-push-on-main
管道运行与以 refs/heads/main
分支为目标的 push
事件匹配:
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
name: pipeline-push-on-main
annotations:
pipelinesascode.tekton.dev/on-target-branch: "[refs/heads/main]" 1
pipelinesascode.tekton.dev/on-event: "[push]"
# ...
- 1
- 您可以通过添加以逗号分隔的条目来指定多个分支。例如:
"[main, release-nightly]"
。另外,您可以指定以下内容:-
对分支的完整引用,如
"refs/heads/main"
-
带有模式匹配的 globs,如
"refs/heads/\ the"
-
标签,如
"refs/tags/1.\*"
-
对分支的完整引用,如
将注释事件与管道运行匹配
当注释的文本与 ^/merge-pr
正则表达式匹配时,您可以使用以下示例匹配管道运行的 pipeline-comment
管道:
apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: pipeline-comment annotations: pipelinesascode.tekton.dev/on-comment: "^/merge-pr" # ...
只有在注释作者满足以下要求之一时才启动管道运行:
- 作者是存储库的所有者。
- 作者是存储库的合作者。
- 作者是存储库机构中的公共成员。
-
注释作者在存储库根目录的
OWNERS
文件的approvers
或reviewers
部分中列出,如 Kubernetes 文档所述。Pipelines as Code 支持OWNERS
和OWNERS_ALIASES
文件的规格。如果OWNERS
文件包含一个 filters 部分,Pipelines as Code 会匹配 approvers,并使用 reviewers 仅针对198.51.100.0/24
过滤器。
将注释事件与管道运行匹配只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
高级事件匹配
Pipelines as Code 支持在高级事件匹配中使用基于通用表达式语言 (CEL) 的过滤。如果您在管道运行中有 pipelinesascode.tekton.dev/on-cel-expression
注解,PPipelines as Code 使用 CEL 表达式并跳过 on-target-branch
注解。与简单的 on-target-branch
注解匹配相比,CEL 表达式允许复杂的过滤和负效果。
要将基于 CEL 的过滤作为代码使用,请考虑以下注解示例:
匹配以
main
分支为目标并来自wip
分支的pull_request
事件:apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: pipeline-advanced-pr annotations: pipelinesascode.tekton.dev/on-cel-expression: | event == "pull_request" && target_branch == "main" && source_branch == "wip" ...
要仅在路径更改时运行管道,您可以使用带有 glob 模式的
.pathChanged
后缀功能:apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: pipeline-advanced-pr-pathchanged annotations: pipelinesascode.tekton.dev/on-cel-expression: | event == "pull_request" && "docs/\*.md".pathChanged() 1 # ...
- 1
- 匹配
docs
目录中的所有 markdown 文件。
匹配以标题
[DOWNSTREAM]
开头的所有拉取请求:apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: pipeline-advanced-pr-downstream annotations: pipelinesascode.tekton.dev/on-cel-expression: | event == "pull_request && event_title.startsWith("[DOWNSTREAM]") # ...
要在
pull_request
事件上运行管道,但跳过experimental
分支:apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: pipeline-advanced-pr-not-experimental annotations: pipelinesascode.tekton.dev/on-cel-expression: | event == "pull_request" && target_branch != experimental" # ...
对于使用 Pipelines as Code 时进行基于 CEL 的高级过滤,您可以使用以下字段和后缀功能:
-
event
: 一个push
或pull_request
事件。 -
target_branch
:目标分支。 -
source_branch
: 一个pull_request
事件的源分支。对于push
事件,它与target_branch
相同。 -
event_title
:匹配事件的标题,如一个push
事件的提交标题,以及pull_request
事件的 pull 或 merge 请求的标题。目前,只有 GitHub、Gitlab 和 Bitbucket 云是受支持的提供程序。 -
.pathChanged
:字符串的后缀函数。如果路径已改变,字符串可以是一个路径的 glob。目前,只支持 GitHub 和 Gitlab。
另外,您还可以访问 Git 存储库供应商传递的完整有效负载。使用 headers
字段访问有效负载的标头,如 headers['x-github-event']
。使用 body
字段访问有效负载的正文,如 body.pull_request.state
。
使用带有 Pipelines as Code 的基于 CEL 的过滤的有效负载的标头和正文只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
在以下示例中,只有在以下条件都为 true 时,管道运行才会启动:
-
拉取请求以
main
分支为目标。 -
拉取请求的作者是
超级用户
。 -
操作是
synchronize
;此操作会在拉取请求上执行更新时触发。
apiVersion: tekton.dev/v1 kind: PipelineRun metadata: annotations: pipelinesascode.tekton.dev/on-cel-expression: | body.pull_request.base.ref == "main" && body.pull_request.user.login == "superuser" && body.action == "synchronize" # ...
如果您使用 标头
或 正文
字段进行事件匹配,您可能无法使用 Git 命令(如 retest
)触发管道运行。如果使用 Git 命令,则有效负载正文是包含此命令而非原始有效负载的注释。
如果要在使用 body
字段进行事件匹配时再次运行管道,您可以关闭并重新打开拉取请求或合并请求,或者添加新的 SHA 提交,例如使用以下命令:
git commit --amend --no-edit && git push --force-with-lease
使用临时 GitHub App 令牌用于 Github API 操作
您可以使用来自 GitHub App 的 Pipelines as Code 生成的临时安装令牌来访问 GitHub API。令牌值存储在为私有存储库生成的临时 {{git_auth_secret}}
动态变量的 git-provider-token
键中。
例如,要在拉取请求中添加注释,您可以使用 Tekton Hub 中的 github-add-comment
任务使用 Pipelines as Code 注解:
... pipelinesascode.tekton.dev/task: "github-add-comment" ...
然后,您可以在 tasks
部分添加任务,或管道运行定义中的 finally
任务:
[...]
tasks:
- name:
taskRef:
name: github-add-comment
params:
- name: REQUEST_URL
value: "{{ repo_url }}/pull/{{ pull_request_number }}" 1
- name: COMMENT_OR_FILE
value: "Pipelines as Code IS GREAT!"
- name: GITHUB_TOKEN_SECRET_NAME
value: "{{ git_auth_secret }}"
- name: GITHUB_TOKEN_SECRET_KEY
value: "git-provider-token"
...
- 1
- 通过使用动态变量,您可以为来自任何存储库的任何拉取请求重复使用此片断模板。
在 GitHub 应用程序中,生成的安装令牌的有效期为 8 小时,其范围限制于事件源自于集群中配置的存储库。
其他资源