• Русский
  • Добавление пользовательских образов Task в селектор

    В этом руководстве объясняется, как настроить параметры селектора для параметра image в UI-форме Task, охватывая два сценария:

    • Добавление образов для hub Tasks
    • Добавление образов для Task из вашего собственного namespace.

    Обзор функции

    • Каждый вариант селектора берётся из ConfigMap с data.name (метка) и data.image (значение).
    • Метки, специфичные для Task (например, catalog.tekton.dev/tool-image-python), позволяют UI сопоставлять ConfigMaps с нужным параметром Task.
    • UI запрашивает namespace, указанный в аннотации Task (например, kube-public), используя селектор меток, определённый в дескрипторе Task, затем отображает селектор с полученными результатами.

    Сценарии использования

    • Добавить пользовательский образ из зеркала реестра для селектора Task.
    • Ввести новую минорную версию рантайма наряду с существующими вариантами селектора.
    • Предоставить вариант образа с повышенной безопасностью для кастомного Task.

    Предварительные требования

    • Установлен Tekton Pipelines.
    • У вас есть права создавать ConfigMaps в kube-public.
    • Вы можете установить style.tekton.dev/descriptors на целевой Task (Hub Tasks уже предоставляют это; для кастомных Tasks нужно добавить самостоятельно).

    Сценарий A: Добавление образов в селектор Hub Task

    Используйте этот путь, если расширяете селектор Hub Task.

    1. Найдите селектор меток в дескрипторе Task

    Найдите аннотацию style.tekton.dev/descriptors у Task и найдите запись, у которой path указывает на параметр image.

    Дескриптор, заканчивающийся на urn:alm:descriptor:expression:props.options:api, содержит запрос labelSelector=...; ключ метки там должен присутствовать в вашем ConfigMap.

    В следующем примере нужно создать ConfigMap с меткой catalog.tekton.dev/tool-image-python в namespace kube-public.

    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. Создайте ConfigMap в kube-public

    Создайте ConfigMap с использованием этого ключа метки.

    По умолчанию Tasks поставляются с ConfigMaps, помеченными catalog.tekton.dev/source: system, чтобы указать записи, предоставленные платформой. Не изменяйте и не удаляйте их, а ваши пользовательские 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 и устанавливать образ в registry.example.com/tekton/python:3.10.

    Сценарий B: Добавление образов в селектор вашего собственного Task

    Используйте этот путь, если вы управляете определением Task и нужно настроить дескрипторы и ConfigMaps.

    1. Настройте style.tekton.dev/descriptors на Task

    Пример дескриптора 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Отображает поле как селектор образов.Изменения не требуются.
    urn:alm:descriptor:expression:props.options:apiAPI для получения вариантов селектора (namespace + селектор меток)./kubernetes/${context.cluster}/api/v1/namespaces/kube-public/configmaps?labelSelector=catalog.tekton.dev%2Ftool-image-python-customВ примере получает ConfigMaps в kube-public с меткой catalog.tekton.dev/tool-image-python-custom.
    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В примере значение берётся из data.name ConfigMap.
    urn:alm:descriptor:expression:props.options:value:pathЧитает значение селектора (образ) из элемента.urn:alm:descriptor:expression:props.options:value:path:data.imageВ примере значение берётся из data.image ConfigMap.
    urn:alm:descriptor:com.tectonic.ui:validation:requiredОтмечает поле как обязательное.

    Для получения дополнительной информации о style.tekton.dev/descriptors смотрите How to Configure Dynamic Forms.

    2. Создайте соответствующий ConfigMap в kube-public

    Используйте тот же ключ метки, который запрашивает ваш дескриптор. Для кастомных Tasks предпочтительно использовать ключ метки, не конфликтующий с дефолтными селекторами Task, чтобы избежать случайного отображения в Hub Tasks.

    По умолчанию Tasks поставляются с ConfigMaps, помеченными catalog.tekton.dev/source: system, чтобы указать записи, предоставленные платформой. Не изменяйте и не удаляйте их, а ваши пользовательские 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 по вашему выбору; просто убедитесь, что namespace ConfigMap совпадает с namespace, указанным в аннотации style.tekton.dev/descriptors вашего Task. Например, вы можете установить аннотацию Task, как в примере ниже, заменив <NAMESPACE> на ваш namespace.

    kind: Task
    metadata:
      name: python
      labels:
        app.kubernetes.io/version: "0.1"
      annotations:
        # замените <NAMESPACE> на ваш 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) и устанавливать образ в registry.example.com/internal/python:3.13.

    Советы по обслуживанию

    • Обновляйте пользовательский вариант, редактируя и повторно применяя соответствующий ConfigMap.
    • Удаляйте вариант, удаляя только ваш пользовательский ConfigMap; оставляйте нетронутыми любые ConfigMap с меткой catalog.tekton.dev/source: system.