5.3. 使用工作区提供 secret


您可以使用工作区为 secret 提供 Git 存储库和容器存储库身份验证。

您可以在任务中配置指定工作区,指定挂载工作区的路径。运行任务时,将 secret 提供为带有此名称的工作区。当 OpenShift Pipelines 执行任务时,secret 中的信息可供任务使用。

如果您使用工作区提供身份验证 secret,则不需要 secret 的注解。

5.3.1. 使用工作区为 Git 配置 SSH 身份验证

若要让管道从配置了 SSH 密钥的存储库检索资源,您必须为该管道配置基于 SSH 的身份验证。

要为管道配置基于 SSH 的身份验证,请使用 SSH 私钥创建身份验证 secret,在任务中为此 secret 配置命名工作区,并在运行任务时指定 secret。

流程

  1. 输入以下命令从现有 .ssh 目录中的文件创建 Git SSH 身份验证 secret:

    $ oc create secret generic my-github-ssh-credentials \ 1
      --from-file=id_ed25519=/home/user/.ssh/id_ed25519 \ 2
      --from-file=known_hosts=/home/user/.ssh/known_hosts 3
    1
    secret 的名称,在这个示例中,my-github-ssh-credentials
    2
    私钥文件的名称和完整路径名称,本例中为 /home/user/.ssh/id_ed25519
    3
    已知主机文件的名称和完整路径名称,本例中为 /home/user/.ssh/known_hosts
  2. 在任务定义中,为 Git 身份验证配置命名工作区,如 ssh-directory

    工作区的定义示例

    apiVersion: tekton.dev/v1beta1
    kind: Task
    metadata:
      name: git-clone
    spec:
      workspaces:
        - name: ssh-directory
          description: |
            A .ssh directory with private key, known_hosts, config, etc.

  3. 在任务步骤中,使用 $(workspaces.<workspace_name>.path)环境变量中的路径 访问目录,例如 $(workspaces.ssh-directory.path)
  4. 在运行任务时,通过在 tkn task start 命令中包含 the- workspace 参数来指定命名工作区的 secret:

    $ tkn task start <task_name>
          --workspace name=<workspace_name>,secret=<secret_name> 1
          # ...
    1
    <workspace_name > 替换为您配置的工作区的名称,< secret_name > 替换为您创建的 secret 的名称。

使用 SSH 密钥克隆 Git 存储库进行身份验证的任务示例

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: git-clone
spec:
  workspaces:
    - name: output
      description: The git repo will be cloned onto the volume backing this Workspace.
    - name: ssh-directory
      description: |
        A .ssh directory with private key, known_hosts, config, etc. Copied to
        the user's home before git commands are executed. Used to authenticate
        with the git remote when performing the clone. Binding a Secret to this
        Workspace is strongly recommended over other volume types
  params:
    - name: url
      description: Repository URL to clone from.
      type: string
    - name: revision
      description: Revision to checkout. (branch, tag, sha, ref, etc...)
      type: string
      default: ""
    - name: gitInitImage
      description: The image providing the git-init binary that this Task runs.
      type: string
      default: "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.37.0"
  results:
    - name: commit
      description: The precise commit SHA that was fetched by this Task.
    - name: url
      description: The precise URL that was fetched by this Task.
  steps:
    - name: clone
      image: "$(params.gitInitImage)"
      script: |
        #!/usr/bin/env sh
        set -eu
        # This is necessary for recent version of git
        git config --global --add safe.directory '*'
        cp -R "$(workspaces.ssh-directory.path)" "${HOME}"/.ssh 1
        chmod 700 "${HOME}"/.ssh
        chmod -R 400 "${HOME}"/.ssh/*
        CHECKOUT_DIR="$(workspaces.output.path)/"
        /ko-app/git-init \
          -url="$(params.url)" \
          -revision="$(params.revision)" \
          -path="${CHECKOUT_DIR}"
        cd "${CHECKOUT_DIR}"
        RESULT_SHA="$(git rev-parse HEAD)"
        EXIT_CODE="$?"
        if [ "${EXIT_CODE}" != 0 ] ; then
          exit "${EXIT_CODE}"
        fi
        printf "%s" "${RESULT_SHA}" > "$(results.commit.path)"
        printf "%s" "$(params.url)" > "$(results.url.path)"

1
脚本会将机密的内容(以文件夹的形式)复制到 ${HOME}/.ssh,这是 ssh 搜索凭据的标准文件夹。

运行任务的命令示例

$ tkn task start git-clone
      --param url=git@github.com:example-github-user/buildkit-tekton
      --workspace name=output,emptyDir=""
      --workspace name=ssh-directory,secret=my-github-ssh-credentials
      --use-param-defaults --showlog

5.3.2. 使用工作区配置容器 registry 身份验证

要使管道从 registry 检索容器镜像,您必须为该 registry 配置身份验证。

要为容器 registry 配置身份验证,请使用 Docker 配置文件创建身份验证 secret,在任务中为此 secret 配置名为 workspace,并在运行任务时指定 secret。

流程

  1. 输入以下命令,从现有 config.json 文件创建容器 registry 身份验证 secret,该文件包含身份验证信息:

    $ oc create secret generic my-registry-credentials \ 1
      --from-file=config.json=/home/user/credentials/config.json 2
    1
    secret 的名称,本例中为 my-registry-credentials
    2
    config.json 文件的路径名,本例中为 /home/user/credentials/config.json
  2. 在任务定义中,为 Git 身份验证配置命名工作区,如 ssh-directory

    工作区的定义示例

    apiVersion: tekton.dev/v1beta1
    kind: Task
    metadata:
      name: skopeo-copy
    spec:
      workspaces:
        - name: dockerconfig
          description: Includes a docker `config.json`
    # ...

  3. 在任务步骤中,使用 $(workspaces.<workspace_name>.path) 环境变量中的路径访问目录,如 $(workspaces.dockerconfig.path)
  4. 要运行任务,请在 tkn task start 命令中包含 the- workspace 参数来指定命名工作区的 secret:

    $ tkn task start <task_name>
          --workspace name=<workspace_name>,secret=<secret_name> 1
          # ...
    1
    <workspace_name > 替换为您配置的工作区的名称,< secret_name > 替换为您创建的 secret 的名称。

使用 Skopeo 从容器存储库复制镜像的示例

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: skopeo-copy
spec:
  workspaces:
    - name: dockerconfig 1
      description: Includes a docker `config.json`
  steps:
    - name: clone
      image: quay.io/skopeo/stable:v1.8.0
      env:
      - name: DOCKER_CONFIG
        value: $(workspaces.dockerconfig.path) 2
      script: |
        #!/usr/bin/env sh
        set -eu
        skopeo copy docker://docker.io/library/ubuntu:latest docker://quay.io/example_repository/ubuntu-copy:latest

1
包含 config.json 文件的工作区名称。
2
DOCKER_CONFIG 环境变量指向 dockerconfig 工作区中的 config.json 文件的位置。Skopeo 使用这个环境变量来获取身份验证信息。

运行任务的命令示例

$ tkn task start skopeo-copy
      --workspace name=dockerconfig,secret=my-registry-credentials
      --use-param-defaults --showlog

5.3.3. 使用工作区将 secret 限制到特定步骤

当您使用工作区提供身份验证 secret 并在任务中定义工作区时,默认情况下工作区可用于任务中的所有步骤。

要将 secret 限制到特定的步骤,请在任务规格和步骤规格中定义工作区。

流程

  • 在任务规格和步骤规格中添加 workspaces: 定义,如下例所示:

    任务定义示例,其中只有一个步骤可以访问凭证工作区

    apiVersion: tekton.dev/v1beta1
    kind: Task
    metadata:
      name: git-clone-build
    spec:
      workspaces: 1
        - name: ssh-directory
          description: |
            A .ssh directory with private key, known_hosts, config, etc.
    # ...
      steps:
        - name: clone
          workspaces: 2
            - name: ssh-directory
    # ...
        - name: build 3
    # ...

    1
    任务规格中的 ssh-directory 工作区的定义。
    2
    步骤规格中 ssh-directory 工作区的定义。此步骤可以使用身份验证信息作为 $(workspaces.ssh-directory.path) 目录。
    3
    由于此步骤不包含 ssh-directory 工作区的定义,因此此步骤不提供身份验证信息。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.