• Русский
  • Упаковка и отправка Helm Chart в OCI Registry

    В этом руководстве показан практический сценарий CI: ваш Git-репозиторий уже содержит Helm chart (Chart.yaml, templates/, values.yaml и т.д.).

    Мы используем Pipeline для:

    1. Клонирования репозитория с помощью задачи git-clone
    2. Упаковки чарта с помощью Helm
    3. Отправки собранного чарта в OCI registry (например, Harbor)

    Вы создадите Pipeline с двумя задачами:

    1. git-clone: клонирует ваш репозиторий в общий workspace
    2. helm: упаковывает чарт и отправляет .tgz в ваш OCI registry

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

    • Kubernetes кластер (для локального тестирования можно использовать minikube).
    • Tekton Pipelines, установленные в вашем кластере.
    • Контейнерный образ Helm версии 3.8+ (Helm v3 с поддержкой OCI).
    • OCI registry и путь к репозиторию (например, oci://registry.example.com/charts).
    • Учетные данные для отправки в OCI registry в виде Secret типа kubernetes.io/dockerconfigjson:
      • Создайте Kubernetes Secret типа kubernetes.io/dockerconfigjson (пример ниже).
    • Git-репозиторий, содержащий валидный Helm chart (директория с Chart.yaml, templates/, values.yaml).
    • Доступ к Git-репозиторию:
      • Публичный репозиторий: ничего особенного.
      • Приватный репозиторий: создайте Secret с Git-учетными данными (SSH или basic-auth).

    Почему Secret типа kubernetes.io/dockerconfigjson? Мы укажем Helm использовать этот Secret для доступа к registry через переменную HELM_REGISTRY_CONFIG.

    Пошаговые инструкции

    Шаг 1: Создайте Secret с учетными данными для registry

    Вам нужен Secret с учетными данными для вашего OCI registry типа kubernetes.io/dockerconfigjson.

    Вы можете ознакомиться с разделом Prepare Registry Credential.

    Шаг 2: Подготовьте образ helm

    Вам нужен контейнерный образ Helm 3.8+ (Helm v3 с поддержкой OCI) для запуска команды helm.

    Вы можете ознакомиться с разделом Discover Tool Image.

    При поиске по метке укажите образ как helm, например: -l operator.tekton.dev/tool-image=helm.

    Шаг 3: Определите Pipeline

    Этот Pipeline использует git-clone для получения вашего репозитория, затем вызывает helm для упаковки и отправки чарта.

    Пожалуйста, замените <helm-image> на ваш образ Helm.

    apiVersion: tekton.dev/v1
    kind: Pipeline
    metadata:
      name: package-and-push-helm-oci
    spec:
      description: Clone repo, package Helm chart, and push to an OCI registry.
      params:
        - name: repo_url
          type: string
          description: Git URL of your repository
        - name: revision
          type: string
          description: Git revision (branch, tag, or SHA)
          default: main
        - name: chart_dir
          type: string
          description: Path to the Helm chart in the repo
          default: "."
        - name: oci_repo
          type: string
          description: OCI repo, e.g., oci://registry.example.com/charts
        - name: package_flags
          type: string
          description: Extra flags for `helm package`
          default: ""
      workspaces:
        - name: source
        - name: registry-creds
          optional: true
        - name: basic-auth
          optional: true
      tasks:
        - name: git-clone
          taskRef:
            resolver: hub
            params:
              - name: catalog
                value: catalog
              - name: kind
                value: task
              - name: name
                value: git-clone
              - name: version
                value: "0.9"
          workspaces:
            - name: output
              workspace: source
            - name: basic-auth
              workspace: basic-auth
          params:
            - name: url
              value: $(params.repo_url)
            - name: revision
              value: $(params.revision)
        - name: helm
          runAfter:
            - "git-clone"
          taskRef:
            resolver: hub
            params:
              - name: catalog
                value: catalog
              - name: kind
                value: task
              - name: name
                value: run-script
              - name: version
                value: "0.1"
          workspaces:
            - name: source
              workspace: source
            - name: secret
              workspace: registry-creds
          params:
            - name: image
              ## Replace with your Helm image
              value: <helm-image>
            - name: script
              value: |
                if [ "$(workspaces.secret.bound)" = "true" ]; then
                  echo "Using registry credentials in $(workspaces.secret.path)"
                  export HELM_REGISTRY_CONFIG=$(workspaces.secret.path)/.dockerconfigjson
                fi
    
                echo "Packaging chart from $(params.chart_dir)"
                tempDir=$(mktemp -d)
                helm package $(params.chart_dir) --destination ${tempDir} $(params.package_flags)
    
                chart_tgz="$(ls ${tempDir}/*.tgz | head -n1)"
                if [ -z "${chart_tgz}" ]; then
                  echo "No packaged chart found!"
                  exit 1
                fi
                echo "Packaged: ${chart_tgz}"
    
                echo "Pushing to $(params.oci_repo)..."
                helm push "${chart_tgz}" "$(params.oci_repo)"
    
                echo "Done."

    Шаг 4: Запустите PipelineRun

    Привяжите workspaces и передайте параметры.

    apiVersion: tekton.dev/v1
    kind: PipelineRun
    metadata:
      generateName: package-and-push-helm-oci-
    spec:
      pipelineRef:
        name: package-and-push-helm-oci
      workspaces:
        - name: source
          volumeClaimTemplate:
            spec:
              ## Specify StorageClassName (as needed)
              # storageClassName: <storage-class-name>
              accessModes:
                - ReadWriteOnce
              resources:
                requests:
                  storage: 1Gi
        - name: registry-creds
          secret:
            secretName: registry-creds
        - name: basic-auth
          secret:
            secretName: basic-auth
      params:
        - name: repo_url
          value: https://github.com/your-org/your-repo.git
        - name: revision
          value: main
        - name: oci_repo
          value: oci://registry.example.com/charts
        - name: chart_dir
          value: .

    Устранение неполадок

    • helm: command not found: Убедитесь, что в вашем image действительно есть бинарь Helm.
    • Error: unknown command "push": В вашем образе Helm отсутствует поддержка OCI push. Используйте более новый образ Helm (3.8+).
    • unauthorized: authentication required: Убедитесь, что Secret корректен и смонтирован в registry-creds. Проверьте, что HELM_REGISTRY_CONFIG указывает на этот путь.

    Следующие шаги