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

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

    Мы будем использовать Pipeline для следующих шагов:

    1. Клонировать repository с помощью Task git-clone
    2. Упаковать chart с помощью Helm
    3. Отправить собранный chart в OCI registry (например, Harbor)

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

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

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

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

    Почему Secret типа kubernetes.io/dockerconfigjson? Мы укажем Helm на distribution registry через HELM_REGISTRY_CONFIG.

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

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

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

    Вы можете обратиться к Prepare Registry Credential.

    Шаг 2: Подготовьте image helm

    Вам нужен container image Helm 3.8+ (Helm v3 с поддержкой OCI), чтобы выполнить команду helm.

    Вы можете обратиться к Discover Tool Image.

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

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

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

    Замените <helm-image> на ваш Helm image.

    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

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

    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 image нет поддержки OCI push. Используйте более новую версию Helm (3.8+).
    • unauthorized: authentication required: убедитесь, что Secret настроен корректно и смонтирован в registry-creds. Проверьте, что HELM_REGISTRY_CONFIG указывает на этот путь.

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