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

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

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

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

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

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

    • Добавить пользовательское image mirror для селектора Task.
    • Ввести новую minor-версию runtime наряду с существующими параметрами селектора.
    • Предоставить hardened image option для пользовательского Task.

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

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

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

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

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

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

    Дескриптор, оканчивающийся на 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 см. в разделе Как настроить динамические формы.

    2. Создайте ConfigMap в kube-public

    Создайте ConfigMap с этим ключом метки.

    Default Tasks поставляются с ConfigMap, помеченными catalog.tekton.dev/source: system, чтобы обозначить записи, предоставленные платформой. Не изменяйте и не удаляйте их, а ваши пользовательские ConfigMap не должны включать эту метку.

    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 и вам нужно настроить дескрипторы и ConfigMap.

    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В примере извлекаются ConfigMap в 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Читает значение селектора (image) из элемента.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 см. в разделе Как настроить динамические формы.

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

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

    Default Tasks поставляются с ConfigMap, помеченными catalog.tekton.dev/source: system, чтобы обозначить записи, предоставленные платформой. Не изменяйте и не удаляйте их, а ваши пользовательские ConfigMap не должны включать эту метку.

    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:
        # 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; не трогайте ConfigMap с catalog.tekton.dev/source: system.