准备 Git 凭证

本指南展示了如何创建一个 git 凭证 Secret,帮助您运行 Tekton Tasks 和 Pipelines。

本文档将以 git-clone Task 的配置为例。 如果您使用的是其他 Task,可以参考此处的步骤,并修改 taskRef.nameworkspaces 以匹配您 Task 中定义的内容。

目录

前提条件

  • 已安装并配置 kubectl 以访问集群。
  • 具有读取和写入 Secrets 的权限。

步骤

可选 1:使用 ssh 凭证

此 Task 支持访问私有仓库。认证方式有三种:

  1. 最简单的方法是将一个 ssh-directory workspace 绑定到此 Task。该 workspace 应包含私钥(例如 id_rsa)、configknown_hosts 文件——任何您通过 SSH 与 git 远程交互所需的内容。强烈建议您使用 Kubernetes Secrets 来保存凭证并绑定到此 workspace。

    在 TaskRun 中示例如下:

    kind: TaskRun
    spec:
      workspaces:
      - name: ssh-directory
        secret:
          secretName: my-ssh-credentials

    在 Pipeline 和 PipelineRun 中示例如下:

    kind: Pipeline
    spec:
      workspaces:
      - name: ssh-creds
      # ...
      tasks:
      - name: fetch-source
        taskRef:
          name: git-clone
        workspaces:
        - name: ssh-directory
          workspace: ssh-creds
      # ...
    ---
    kind: PipelineRun
    spec:
      workspaces:
      - name: ssh-creds
        secret:
          secretName: my-ssh-credentials
      # ...

    Secret 在两种情况下的结构相同——类似 .ssh 目录:

    kind: Secret
    apiVersion: v1
    metadata:
      name: my-ssh-credentials
    data:
      id_rsa: # ... base64 编码的私钥 ...
      known_hosts: # ... base64 编码的 known_hosts 文件 ...
      config: # ... base64 编码的 ssh 配置文件 ...

    包含 known_hosts 是可选的,但强烈推荐。没有它,git-clone Task 会盲目接受远程服务器的身份。

  2. 另一种方法是将一个 ssl-ca-directory workspace 绑定到此 Task。该 workspace 应包含 crt 证书文件(例如 ca-bundle.crt)——任何您通过自定义 CA 与 git 远程交互所需的内容。强烈建议您使用 Kubernetes Secrets 来保存凭证并绑定到此 workspace。

    在 TaskRun 中示例如下:

    kind: TaskRun
    spec:
      workspaces:
      - name: ssl-ca-directory
        secret:
          secretName: my-ssl-credentials

    在 Pipeline 和 PipelineRun 中示例如下:

    kind: Pipeline
    spec:
      workspaces:
      - name: ssl-creds
      # ...
      tasks:
      - name: fetch-source
        taskRef:
          name: git-clone
        workspaces:
        - name: ssl-ca-directory
          workspace: ssl-creds
      # ...
    ---
    kind: PipelineRun
    spec:
      workspaces:
      - name: ssl-creds
        secret:
          secretName: my-ssl-credentials
      # ...

    Secret 如下所示:

    kind: Secret
    apiVersion: v1
    metadata:
      name: my-ssl-credentials
    data:
      ca-bundle.crt: # ... base64 编码的 crt ...  # 如果 key/文件名不是 ca-bundle.crt,则需在参数部分设置 crtFileName 参数

可选 2:使用 basic-auth 凭证

注意:强烈建议您在可用时优先使用 ssh 凭证,而非 basic auth。您可以从 WebVCS 平台(Github、Gitlab、Bitbucket 等)生成短期令牌作为密码,并通常使用 git 作为用户名。 在 bitbucket server 上,令牌可能包含 /,因此您需要在 Secret 中对其进行 URL 编码,详见此 Stack Overflow 答案:

https://stackoverflow.com/a/24719496

为支持 basic-auth,此 Task 暴露了一个可选的 basic-auth Workspace。 绑定的 Workspace 应包含 .gitconfig.git-credentials 文件。 该 Workspace 上的其他文件将被忽略。一个典型的包含这些凭证的 Secret 如下:

kind: Secret
apiVersion: v1
metadata:
  name: my-basic-auth-secret
type: Opaque
stringData:
  .gitconfig: |
    [credential "https://<hostname>"]
      helper = store
  .git-credentials: |
    https://<user>:<pass>@<hostname>

可选 3:使用 Git Connector

该 Task 可与 Git Connector 配合使用以增强安全性。

您需要先创建 Git Connector,然后在 TaskRun 中使用 CSI 配置 basic-auth workspace。

Git Connector 目前仅支持使用 basic-auth 克隆,不支持 ssh。

以下是 git-clone TaskRun 中使用 Git Connector 的示例:

创建 Git Connector

cat <<EOF | kubectl apply -f -
kind: Secret
apiVersion: v1
metadata:
  name: github
type: kubernetes.io/basic-auth
stringData:
  username: your-username # 替换为您的 Git 用户名
  password: your-token    # 替换为您的 Git 密码或令牌
---
apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
  name: github
spec:
  connectorClassName: git
  address: https://github.com  # 替换为您的 Git 服务器地址
  auth:
    name: basicAuth
    secretRef:
      name: github
    params:
    - name: repository
      value: your-org/your-repo.git  # 替换为您的仓库路径,令牌可访问,用于健康检查
EOF

创建 TaskRun

cat << EOF | kubectl apply -f -
apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
  name: git-clone-demo
spec:
  params:
  - name: url
    value: https://github.com/your-org/your-repo.git # 替换为您想克隆的仓库路径
  - name: revision
    value: refs/heads/main
  taskRef:
    name: git-clone
  timeout: 10m0s
  computeResources:
    limits:
      cpu: 200m
      memory: 200Mi
    requests:
      cpu: 200m
      memory: 200Mi
  workspaces:
  - name: output
    emptyDir: {}
  - csi:
      driver: connectors-csi
      readOnly: true
      volumeAttributes:
        connector.name: github # 连接器名称
        connector.namespace: "" # 连接器所在命名空间,若未指定,则使用 TaskRun 所在命名空间
        configuration.names: "gitconfig" # 配置名称,固定为 "gitconfig"
    name: basic-auth
EOF

更多关于 Connector 的信息,请参阅