第 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 文件的 approversreviewers 部分中列出,如 Kubernetes 文档所述。Pipelines as Code 支持 OWNERSOWNERS_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: 一个 pushpull_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 小时,其范围限制于事件源自于集群中配置的存储库。

其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.