在 Tekton Task 中使用 NPM 连接器

在 Tekton Task 中使用 NPM 连接器,可以在任务执行期间集中管理 npm registry 访问,并实现无需密钥的包操作。

本文介绍如何在一个 TaskRun 中使用多连接器能力来:

  • 从镜像仓库拉取依赖
  • 将包发布到目标仓库

Tekton Task 的要求

并非所有 Tekton Task 都可以使用 NPM 连接器。

NPM 连接器通过 Connectors CSI Driver 注入临时 registry 配置。它提供 npmrcyarnrc 配置,用于生成 .npmrc.yarnrc.ymlca.crt

因此,Tekton Task 必须满足以下要求:

  • 支持通过 Workspace 挂载 .npmrc 文件
  • 支持通过 Workspace 挂载 CA 证书(在 forward-proxy MITM 模式下访问 HTTPS repository 时必需)

catalog 中的 nodejs task(0.1)已经支持这些工作区:

  • npm-config:包管理器配置工作区
  • ca-bundle:自定义 CA 工作区

多连接器场景

要在同一个 TaskRun 中从一个 registry 安装依赖并向另一个 registry 发布包,请准备两个 NPM 连接器:

  • npm-mirror-connector:设置 spec.params.registryType=mirror
  • npm-publish-connector:设置 spec.params.registryType=publish

当这两个连接器都通过 volumeAttributes.connectors 挂载时,NPM 配置会按以下方式渲染:

  • 依赖下载优先使用 registryType=mirror 的连接器
  • 对于 nodejs:0.1,发布端点由 publishRepository 控制;请将 registryType=publish 连接器地址作为 publishRepository 的值使用
INFO

在一个 CSI volume 中使用多个连接器之前,请先在 connectors-config 中启用 enable-multi-connector

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

准备连接器

示例连接器对:

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"

使用 nodejs:0.1 的 TaskRun 示例

当两个连接器都就绪后,可直接引用内置的 nodejs task。

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 设置解析依赖
  • publishRepository 会在 nodejs task 中触发 npm publish --registry ...
  • caFileName: ca.crt 告诉 nodejs:0.1ca-bundle 工作区加载由 NPM 连接器生成的证书

CA Bundle 示例

在 forward-proxy MITM 模式下,所有 HTTPS npm repository 流量都会经过 connectors-proxy,并且必须信任代理 CA。
因此,当你的依赖仓库或发布仓库使用 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 连接器渲染,并通过 ca-bundle 工作区被 nodejs:0.1 使用,因此依赖下载和包发布都可以成功访问 HTTPS repository。

在 Pipeline 集成中使用 ResourceInterface

如果你通过 Pipeline UI 集成连接器,而不是手动编写 CSI 字段,请使用 NPMRepository ResourceInterface。

典型使用流程:

  1. 在 Pipeline Integration 中,选择接口类别 NPMRepository
  2. 选择一个 spec.params.registryType=publish 的主连接器,然后将其他连接器(例如 registryType=mirror 连接器)添加到同一个集成项中。这样可以保持连接器选择与任务中后续的 publishRepository 参数选择一致。
  3. 将集成工作区绑定到任务的 npm-configca-bundle 工作区。

在运行时,ResourceInterface 会为你渲染连接器工作区绑定:

  • npm-config 挂载从所选连接器合并后的配置(多连接器)
  • ca-bundle 挂载用于 TLS 信任的证书配置

这意味着用户可以继续直接使用 nodejs:0.1,同时将连接器选择和工作区渲染委托给 Pipeline 集成。

详情请参见 ResourceInterfacePipeline 集成

延伸阅读