向选择器添加自定义 Task 镜像

本指南说明如何在 UI Task 表单中为 image 参数配置选择器选项,涵盖以下两种场景:

  • hub Tasks 添加镜像
  • 你自己的 namespace Tasks 添加镜像

功能概述

  • 每个选择器选项都来自一个 ConfigMap,其中 data.name 作为标签,data.image 作为值。
  • 特定于 Task 的标签(例如 catalog.tekton.dev/tool-image-python)可让 UI 将 ConfigMaps 与正确的 Task 参数匹配起来。
  • UI 会使用 Task 描述符中定义的 label selector,查询 Task 注解中指定的 namespace(例如 kube-public),然后根据结果渲染选择器。

使用场景

  • Task 选择器添加自定义 registry mirror 镜像。
  • 在现有选择器选项之外引入新的 runtime 次版本。
  • 为自定义 Task 提供加固镜像选项。

前提条件

  • 已安装 Tekton Pipelines。
  • 你可以在 kube-public 中创建 ConfigMaps
  • 你可以在目标 Task 上设置 style.tekton.dev/descriptorsHub Tasks 已经提供;自定义 Tasks 需要你自行添加)。

场景 A:为 Hub Task 选择器添加镜像

当你要扩展 Hub Task 的选择器时,请使用此流程。

1. 从 Task 描述符中查找 label selector

Task 上找到 style.tekton.dev/descriptors 注解,并查找 path 指向 image 参数的条目。

urn:alm:descriptor:expression:props.options:api 结尾的描述符包含一个 labelSelector=... 查询;其中的 label 键必须存在于你的 ConfigMap 中。

在下面的示例中,你需要在 kube-public namespace 中创建一个带有 catalog.tekton.dev/tool-image-python 标签的 ConfigMap

kind: Task
metadata:
  name: python
  labels:
    app.kubernetes.io/version: "0.1"
  annotations:
    style.tekton.dev/descriptors: |
      - path: params.PYTHON_IMAGE
        x-descriptors:
          ...
          - urn:alm:descriptor:expression:props.options:api:/kubernetes/${context.cluster}/api/v1/namespaces/kube-public/configmaps?labelSelector=catalog.tekton.dev%2Ftool-image-python
          ...

有关 style.tekton.dev/descriptors 的更多信息,请参见 How to Configure Dynamic Forms

2. 在 kube-public 中创建 ConfigMap

使用该 label 键创建一个 ConfigMap

默认 Tasks 会随附带 catalog.tekton.dev/source: system 标签的 ConfigMaps,用于标识平台提供的条目。请不要修改或删除这些条目,并且你的自定义 ConfigMaps 不应包含此标签。

apiVersion: v1
kind: ConfigMap
metadata:
  name: tekton-task-python-custom
  namespace: kube-public
  labels:
    catalog.tekton.dev/tool-image-python: "3.10"
data:
  name: "Python 3.10"
  image: "registry.example.com/tekton/python:3.10"

3. 应用并验证

kubectl apply -f tekton-task-python-custom.yaml
# configmap/tekton-task-python-custom created

kubectl -n kube-public get configmap -l catalog.tekton.dev/tool-image-python=3.10
# NAME                             DATA   AGE
# tekton-task-python-custom        2      15s

打开 Task 表单;此时选择器应包含 Python 3.10,并将 image 设置为 registry.example.com/tekton/python:3.10

场景 B:为你自己的 Task 选择器添加镜像

当你可以控制 Task 定义,并且需要同时配置描述符和 ConfigMaps 时,请使用此流程。

1. 在 Task 上配置 style.tekton.dev/descriptors

下面是一个 image 选择器的 Task 描述符示例:

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: python
  labels:
    app.kubernetes.io/version: "0.1"
  annotations:
    style.tekton.dev/descriptors: |
      - path: params.PYTHON_IMAGE
        x-descriptors:
          - urn:alm:descriptor:label:en:PYTHON_IMAGE
          - urn:alm:descriptor:description:en:The used Python image.
          - urn:alm:descriptor:com.tectonic.ui:select:image
          - urn:alm:descriptor:expression:props.options:api:/kubernetes/${context.cluster}/api/v1/namespaces/kube-public/configmaps?labelSelector=catalog.tekton.dev%2Ftool-image-python-custom
          - urn:alm:descriptor:props:select:allowCreate
          - urn:alm:descriptor:expression:props.options:path:items
          - urn:alm:descriptor:expression:props.options:label:path:data.name
          - urn:alm:descriptor:expression:props.options:value:path:data.image
          - urn:alm:descriptor:com.tectonic.ui:validation:required
spec:
  params:
    - name: PYTHON_IMAGE
      description: Image used for Python steps.
      type: string
  steps:
    - name: python-script
      image: $(params.PYTHON_IMAGE)
      script: |
        #!/bin/sh
        # Define your task script

描述符条目及其含义:

描述符条目作用示例备注
path指向作为选择器渲染的参数。params.PYTHON_IMAGE
urn:alm:descriptor:label:en在表单中显示的英文字段标签。PYTHON_IMAGE
urn:alm:descriptor:description:en字段的英文帮助文本。The used Python image.
urn:alm:descriptor:com.tectonic.ui:select:image将字段渲染为 image 选择器。无需更改。
urn:alm:descriptor:expression:props.options:api用于获取选择器选项的 API(namespace + label selector)。/kubernetes/${context.cluster}/api/v1/namespaces/kube-public/configmaps?labelSelector=catalog.tekton.dev%2Ftool-image-python-custom在示例中,会获取 kube-public 中带有 catalog.tekton.dev/tool-image-python-custom 标签的 ConfigMaps。
urn:alm:descriptor:props:select:allowCreate除了选择器选项之外,还允许手动输入。
urn:alm:descriptor:expression:props.options:path指向 API 响应中的列表路径。urn:alm:descriptor:expression:props.options:path:items在示例中,使用的是 List API,因此值来自 items
urn:alm:descriptor:expression:props.options:label:path从条目中读取选择器显示文本。urn:alm:descriptor:expression:props.options:label:path:data.name在示例中,值取自 ConfigMapdata.name
urn:alm:descriptor:expression:props.options:value:path从条目中读取选择器值(image)。urn:alm:descriptor:expression:props.options:value:path:data.image在示例中,值取自 ConfigMapdata.image
urn:alm:descriptor:com.tectonic.ui:validation:required将字段标记为必填。

有关 style.tekton.dev/descriptors 的更多信息,请参见 How to Configure Dynamic Forms

2. 在 kube-public 中创建匹配的 ConfigMap

使用与你的描述符查询相同的 label 键。对于自定义 Tasks,建议使用不会与默认 Task 选择器冲突的 label 键,以避免在 Hub Tasks 中被意外显示。

默认 Tasks 会随附带有 catalog.tekton.dev/source: system 标签的 ConfigMaps,用于标识平台提供的条目。请不要修改或删除这些条目,并且你的自定义 ConfigMaps 不应包含此标签。

apiVersion: v1
kind: ConfigMap
metadata:
  name: custom-task-python-3-13
  namespace: kube-public
  labels:
    catalog.tekton.dev/tool-image-python-custom: "3.13-team"
data:
  name: "Python 3.13 (Team Edition)"
  image: "registry.example.com/internal/python:3.13"

你也可以将 ConfigMap 放在你希望的其他 namespace 中;只需确保 ConfigMap 的 namespace 与 Taskstyle.tekton.dev/descriptors 注解中指定的 namespace 相同即可。 例如,你可以像下面这样设置 Task 注解,请将 <NAMESPACE> 替换为你的 namespace。

kind: Task
metadata:
  name: python
  labels:
    app.kubernetes.io/version: "0.1"
  annotations:
    # replace <NAMESPACE> with your namespace
    style.tekton.dev/descriptors: |
      - path: params.PYTHON_IMAGE
        x-descriptors:
          ...
          - urn:alm:descriptor:expression:props.options:api:/kubernetes/${context.cluster}/api/v1/namespaces/<NAMESPACE>/configmaps?labelSelector=catalog.tekton.dev%2Ftool-image-python-custom
          ...

3. 应用并验证

kubectl apply -f custom-task-python-3-13.yaml
# configmap/custom-task-python-3-13 created

kubectl -n kube-public get configmap -l catalog.tekton.dev/tool-image-python-custom=3.13-team
# NAME                             DATA   AGE
# custom-task-python-3-13          2      15s

打开你的 Task 表单;选择器应显示 Python 3.13 (Team Edition),并将 image 设置为 registry.example.com/internal/python:3.13

维护建议

  • 通过编辑并重新应用其 ConfigMap 来更新自定义选项。
  • 通过仅删除你的自定义 ConfigMap 来下线某个选项;请保留任何带有 catalog.tekton.dev/source: systemConfigMap 不变。