解析器

Resolver 是 Tekton 中的一个组件,用于实现对 Tasks 和 Pipelines 等资源的远程解析。通过 Resolver,你可以引用并从外部位置获取资源,而不是直接在 Kubernetes 集群中定义这些资源。

为什么需要 Resolver

传统资源管理的挑战

在 CI/CD 系统中,在团队和项目之间管理和共享资源会带来若干挑战:

  • 版本控制:难以跟踪和管理 CI/CD 资源的版本
  • 共享:在团队和组织之间共享资源的能力有限
  • 维护:更新和维护被多个 pipeline 使用的资源存在困难
  • 可发现性:难以发现和使用他人创建的资源
  • 一致性:确保不同环境中的资源定义保持一致

Tekton 的解决方案

Tekton Resolvers 通过以下方式应对这些挑战:

  • 远程解析:在运行时从外部位置获取资源
  • 版本管理:允许引用资源的特定版本
  • 集中存储:支持将资源存储在中心仓库中
  • 动态获取:在需要时检索资源的最新版本
  • 灵活的数据源:支持多种资源来源(Git、Bundles、HTTP 等)

优势

  • 可重用性:资源可以轻松在团队和项目之间共享和复用
  • 版本控制:资源可以在源代码管理中进行版本化和跟踪
  • 减少重复:消除重复定义资源的需求
  • 简化更新:只需在一个位置更新资源,所有使用方即可自动获得更新
  • 提升可发现性:资源可以在中心仓库中组织和发现
  • 一致性:确保不同环境中的资源定义保持一致

使用场景

Resolver 在多种场景中都很有用,包括:

  • 共享 Task 库:维护一个公共 Tasks 的中心仓库
  • CI/CD 模板:为团队提供标准化的 Pipeline 模板
  • 跨环境一致性:确保开发、测试和生产环境中的资源定义保持一致
  • 组织规范:强制执行组织级的 CI/CD 流程标准
  • 第三方集成:利用 Community 开发的 Tasks 和 Pipelines
  • 替代 ClusterTasks:提供共享 Tasks,而无需使用集群作用域资源

约束与限制

  • Resolver 需要能够访问外部资源位置的网络连接
  • 解析发生在 TaskRun/PipelineRun 创建时,而不是执行期间
  • 某些 resolver 可能需要额外的身份验证配置
  • 网络问题会影响远程解析资源的可用性
  • 使用外部资源时必须考虑安全性问题

原理

解析过程

当解析某个资源引用时:

  1. Tekton 从资源引用中识别 resolver 类型
  2. 调用相应的 resolver 来获取资源
  3. resolver 从外部位置检索资源
  4. 对资源进行校验并转换为相应的 Tekton 资源
  5. 将解析后的资源用于 TaskRun 或 PipelineRun

资源引用

资源引用指定:

  1. 要使用的 resolver 类型(git、bundle、hub 等)
  2. 资源的位置
  3. 可选参数,例如版本、分支或路径
  4. 如果需要,还包括身份验证信息

配置示例

Git Resolver 示例

apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
  name: git-resolver-example
spec:
  taskRef:
    resolver: git
    params:
      - name: url
        value: https://github.com/tektoncd/catalog.git
      - name: revision
        value: main
      - name: pathInRepo
        value: task/git-clone/0.9/git-clone.yaml

Hub Resolver 示例

当前版本中,Hub resolver 的目录资源由独立的 ArtifactHub 组件提供。有关目录配置和编写说明,请参见 ArtifactHub Shim Catalog。

apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
  name: remote-task-reference
spec:
  taskRef:
    resolver: hub
    params:
    - name: catalog # optional
      value: catalog
    - name: type # optional
      value: artifact
    - name: kind
      value: task
    - name: name
      value: git-clone
    - name: version
      value: "0.6"

HTTP Resolver 示例

apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
  name: http-resolver-example
spec:
  taskRef:
    resolver: http
    params:
      - name: url
        value: https://raw.githubusercontent.com/tektoncd/catalog/main/task/git-clone/0.9/git-clone.yaml

内置 Resolver

Git Resolver

Git Resolver 从 Git 仓库中获取资源。

使用场景

  • 将 Tasks 和 Pipelines 与应用代码存放在同一个仓库中
  • 将 CI/CD 资源与应用代码一起进行版本管理
  • 通过 Git 仓库在团队之间共享资源

原理

Git Resolver:

  • 克隆指定的 Git 仓库
  • 检出指定的 revision(branch、tag 或 commit)
  • 从指定路径检索资源
  • 支持通过 Kubernetes secrets 进行身份验证

Hub Resolver

Hub Resolver 从 DevOps Hub catalog 中获取资源。在 ACP DevOps 4.14 及更高版本中,默认的 Hub 后端是集群内的 artifacthub-shim service,使用与 Artifact Hub 兼容的 APIs。

使用场景

  • 在 air-gapped 集群中发现并使用 Curated 的 Tasks 和 Pipelines
  • 访问由 artifacthub-shim 提供的 catalog
  • 基于经过充分测试和维护的资源进行标准化

原理

Hub Resolver:

  • 连接到已配置的 Artifact Hub API endpoint
  • 根据名称和版本检索指定资源
  • 支持不同的 catalog 和版本
  • 对内置 Tasks 使用 catalog,对内置 Pipelines 使用 catalog-pipelines

HTTP Resolver

HTTP Resolver 从远程 HTTP server 获取资源。

使用场景

  • 从远程 server 获取资源
  • 访问自定义或私有资源
  • 利用现有 web 服务进行资源解析

原理

HTTP Resolver:

  • 从远程 server 获取指定资源
  • 提供对自定义或私有资源的访问

参考资料