• Русский
  • Использование NPM Connector в Tekton Task

    Использование NPM Connector в Tekton Tasks позволяет централизованно управлять доступом к npm registry и выполнять операции с пакетами без секретов во время выполнения task.

    В этом документе показано, как использовать возможность нескольких connector в одном TaskRun для:

    • загрузки зависимостей из зеркального registry
    • публикации пакетов в целевой registry

    Требования к Tekton Task

    Не все Tekton Tasks могут использовать NPM Connector.

    NPM Connector внедряет временную конфигурацию registry через Connectors CSI Driver. Он предоставляет конфигурации npmrc и yarnrc, которые генерируют .npmrc, .yarnrc.yml и ca.crt.

    Поэтому Tekton Tasks должны соответствовать следующим требованиям:

    • поддерживать монтирование файла .npmrc через Workspace
    • поддерживать монтирование CA certificate через Workspace (требуется для HTTPS repositories в режиме forward-proxy MITM)

    Task nodejs из catalog (0.1) уже поддерживает эти workspaces:

    • npm-config: workspace конфигурации package manager
    • ca-bundle: custom CA workspace

    Сценарий с несколькими Connector

    Чтобы установить зависимости из одного registry и опубликовать их в другом registry в рамках одного TaskRun, подготовьте два NPM connector:

    • npm-mirror-connector: установите spec.params.registryType=mirror
    • npm-publish-connector: установите spec.params.registryType=publish

    Когда оба connector смонтированы через volumeAttributes.connectors, конфигурация NPM формируется с таким поведением:

    • при загрузке зависимостей приоритет отдается connector с registryType=mirror
    • для nodejs:0.1 endpoint публикации управляется через publishRepository; используйте адрес connector с registryType=publish как значение publishRepository
    INFO

    Перед использованием нескольких connector в одном CSI volume включите enable-multi-connector в connectors-config.

    kubectl -n <connectors-namespace> patch configmap connectors-config \
      --type merge \
      -p '{"metadata":{"annotations":{"skip-sync":"true"}},"data":{"enable-multi-connector":"true"}}'

    Подготовка Connector

    Пример пары connector:

    apiVersion: connectors.alauda.io/v1alpha1
    kind: Connector
    metadata:
      name: npm-mirror-connector
    spec:
      connectorClassName: npm
      address: https://nexus.example.com/repository/npm-proxy
      auth:
        name: basicAuth
        secretRef:
          name: npm-secret
      params:
      - name: strict-ssl
        value: "false"
      - name: registryType
        value: "mirror"
    ---
    apiVersion: connectors.alauda.io/v1alpha1
    kind: Connector
    metadata:
      name: npm-publish-connector
    spec:
      connectorClassName: npm
      address: https://nexus.example.com/repository/npm-hosted
      auth:
        name: basicAuth
        secretRef:
          name: npm-secret
      params:
      - name: strict-ssl
        value: "false"
      - name: registryType
        value: "publish"

    Пример TaskRun с nodejs:0.1

    После того как оба connector готовы, можно напрямую ссылаться на встроенный task nodejs.

    apiVersion: tekton.dev/v1
    kind: TaskRun
    metadata:
      name: nodejs-npm-multi-connector-demo
    spec:
      taskRef:
        name: nodejs
      params:
      - name: command
        value: npm ci && npm run build
      - name: publishRepository
        value: https://nexus.example.com/repository/npm-hosted
      - name: caFileName
        value: ca.crt
      workspaces:
      - name: source
        persistentVolumeClaim:
          claimName: nodejs-source-pvc
      - name: npm-config
        csi:
          driver: connectors-csi
          readOnly: true
          volumeAttributes:
            connectors: "npm-mirror-connector,npm-publish-connector"
            configuration.names: "npmrc,yarnrc"
      - name: ca-bundle
        csi:
          driver: connectors-csi
          readOnly: true
          volumeAttributes:
            connectors: "npm-mirror-connector,npm-publish-connector"
            configuration.names: "npmrc"

    В этом примере:

    • npm ci разрешает зависимости, используя сформированные настройки registry из connector mirror
    • publishRepository запускает npm publish --registry ... в task nodejs
    • caFileName: ca.crt указывает nodejs:0.1 загрузить сертификат, сгенерированный NPM connector, из workspace ca-bundle

    Пример CA Bundle

    В режиме forward-proxy MITM весь трафик к HTTPS npm repository проходит через connectors-proxy и должен доверять CA proxy. Поэтому, когда dependency или publish repository использует https://, всегда монтируйте ca-bundle и задавайте caFileName как ca.crt.

    spec:
      params:
      - name: caFileName
        value: ca.crt
      workspaces:
      - name: ca-bundle
        csi:
          driver: connectors-csi
          readOnly: true
          volumeAttributes:
            connectors: "npm-mirror-connector,npm-publish-connector"
            configuration.names: "npmrc"

    В этой схеме ca.crt формируется NPM connector и используется nodejs:0.1 через workspace ca-bundle, поэтому и загрузка зависимостей, и публикация пакетов могут успешно обращаться к HTTPS repositories.

    Использование ResourceInterface в интеграции Pipeline

    Если вы интегрируете connector из Pipeline UI вместо ручного задания полей CSI, используйте ResourceInterface NPMRepository.

    Типичный поток использования:

    1. В Pipeline Integration выберите категорию интерфейса NPMRepository.
    2. Выберите основной connector с spec.params.registryType=publish, затем добавьте другие connector, например connector registryType=mirror, к тому же элементу интеграции. Это обеспечивает согласованность выбора connector с последующим выбором параметра publishRepository в task.
    3. Привяжите workspaces интеграции к workspaces npm-config и ca-bundle task.

    Во время выполнения ResourceInterface формирует привязки workspace connector за вас:

    • npm-config монтирует объединенную конфигурацию из выбранных connector (multi-connector)
    • ca-bundle монтирует конфигурацию сертификата для доверия TLS

    Это означает, что пользователи могут продолжать использовать nodejs:0.1 напрямую, а выбор connector и формирование workspace будут делегированы Pipeline Integration.

    Подробности см. в ResourceInterface и Pipeline Integration.

    Дополнительная информация