×

BuildStrategyClusterBuildStrategy 自定义资源 (CR) 中,您可以定义策略参数、系统参数、步骤资源定义、注解和卷来配置构建策略。BuildStrategy 资源可在命名空间内使用,而 ClusterBuildStrategy 资源可在整个集群中使用。

要配置构建策略,请创建一个BuildStrategyClusterBuildStrategy 资源 YAML 文件并将其应用到 OpenShift Container Platform 集群。

策略参数定义

您可以在BuildStrategyClusterBuildStrategy 自定义资源 (CR) 中定义策略参数,并在您的BuildBuildRun CR 中设置或修改这些参数的值。您还可以在创建构建策略时在构建时配置或修改策略参数。

在为您的策略定义参数之前,请考虑以下几点

  • 在构建策略 CR 的spec.parameters 字段中定义参数列表。每个列表项包含名称、描述、类型以及数组类型的可选默认值。如果未设置默认值,则必须在BuildBuildRun CR 中定义值。

  • 在构建策略的spec.steps 字段中定义字符串或数组类型的参数。

  • 使用$(params.your-parameter-name) 语法指定字符串类型的参数。您可以在引用您的策略的BuildBuildRun CR 中为your-parameter-name 参数设置值。您可以根据需要定义以下字符串参数

    表 1. 字符串参数
    参数 描述

    image

    使用此参数定义自定义标签,例如golang:$(params.go-version)

    args

    使用此参数将数据传递到您的构建器命令

    env

    使用此参数为环境变量提供值

  • 使用$(params.your-array-parameter-name[*]) 语法指定数组类型的参数。指定数组后,您可以在参数或命令中使用它。对于数组中的每个项目,都会设置一个参数。以下示例在构建策略的spec.steps 字段中使用数组参数

    apiVersion: shipwright.io/v1beta1
    kind: ClusterBuildStrategy
    metadata:
      name: <cluster_build_strategy_name>
      # ...
    spec:
      parameters:
        - name: tool-args
          description: Parameters for the tool
          type: array
      steps:
        - name: a-step
          command:
            - some-tool
          args:
            - --tool-args
            - $(params.tool-args[*])
  • 提供参数值作为简单的字符串或作为配置映射或密钥的引用。对于参数,只有在spec.steps 字段的commandargsenv 部分中定义时,才能使用配置映射或密钥值。

系统参数定义

在定义构建策略的步骤时,您可以使用系统参数来访问系统信息,或访问BuildBuildRun 自定义资源 (CR) 中的用户定义信息。您无法配置或修改系统参数,因为它们是在运行时由构建运行控制器定义的。

您可以在构建策略定义中定义以下系统参数

表 2. 系统参数
参数 描述

$(params.shp-source-root)

表示包含源代码的目录的绝对路径。

$(params.shp-source-context)

表示源代码上下文目录的绝对路径。如果在Build CR 中未为spec.source.contextDir 指定任何值,则此参数使用$(params.shp-source-root) 系统参数的值。

$(params.shp-output-image)

表示要推送的镜像的 URL,如BuildBuildRun CR 的spec.output.image 字段中定义的那样。

步骤资源定义

您可以包含资源定义,例如构建策略中所有步骤的 CPU、内存和磁盘使用限制。对于包含多个步骤的策略,某些步骤可能需要比其他步骤更多的资源。作为策略管理员,您可以为每个步骤定义最佳的资源值。

例如,您可以在集群上安装具有相同步骤但名称和步骤资源不同的策略,以便用户可以创建具有较小或较大资源需求的构建。

具有不同资源的策略

定义具有相同策略但资源限制不同的多种类型。以下示例使用相同的buildah策略,并为资源定义了小和中限制。这些示例为策略管理员提供了对步骤资源定义的更多控制。

具有小限制的 Buildah 策略

使用小的资源限制为buildah策略定义spec.steps[].resources字段,如下例所示

示例:具有小限制的buildah策略
apiVersion: shipwright.io/v1beta1
kind: ClusterBuildStrategy
metadata:
  name: buildah-small
spec:
  steps:
    - name: build-and-push
      image: quay.io/containers/buildah:v1.31.0
      workingDir: $(params.shp-source-root)
      securityContext:
        capabilities:
          add:
          - "SETFCAP"
      command:
        - /bin/bash
      args:
        - -c
        - |
          set -euo pipefail
          # Parse parameters
        # ...
        # That's the separator between the shell script and its args
        - --
        - --context
        - $(params.shp-source-context)
        - --dockerfile
        - $(build.dockerfile)
        - --image
        - $(params.shp-output-image)
        - --build-args
        - $(params.build-args[*])
        - --registries-block
        - $(params.registries-block[*])
        - --registries-insecure
        - $(params.registries-insecure[*])
        - --registries-search
        - $(params.registries-search[*])
      resources:
        limits:
          cpu: 250m
          memory: 65Mi
        requests:
          cpu: 250m
          memory: 65Mi
  parameters:
    - name: build-args
      description: "The values for the args in the Dockerfile. Values must be in the format KEY=VALUE."
      type: array
      defaults: []
    # ...

具有中等限制的 Buildah 策略

使用中等资源限制为buildah策略定义spec.steps[].resources字段,如下例所示

示例:具有中等限制的buildah策略
apiVersion: shipwright.io/v1beta1
kind: ClusterBuildStrategy
metadata:
  name: buildah-medium
spec:
  steps:
    - name: build-and-push
      image: quay.io/containers/buildah:v1.31.0
      workingDir: $(params.shp-source-root)
      securityContext:
        capabilities:
          add:
          - "SETFCAP"
      command:
        - /bin/bash
      args:
        - -c
        - |
          set -euo pipefail
          # Parse parameters
        # ...
        # That's the separator between the shell script and its args
        - --
        - --context
        - $(params.shp-source-context)
        - --dockerfile
        - $(build.dockerfile)
        - --image
        - $(params.shp-output-image)
        - --build-args
        - $(params.build-args[*])
        - --registries-block
        - $(params.registries-block[*])
        - --registries-insecure
        - $(params.registries-insecure[*])
        - --registries-search
        - $(params.registries-search[*])
      resources:
        limits:
          cpu: 500m
          memory: 1Gi
        requests:
          cpu: 500m
          memory: 1Gi
  parameters:
    - name: build-args
      description: "The values for the args in the Dockerfile. Values must be in the format KEY=VALUE."
      type: array
      defaults: []
    # ...

配置策略的资源定义后,必须在您的Build CR 中引用该策略,如下例所示

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: buildah-medium
spec:
  source:
    git:
      url: https://github.com/shipwright-io/sample-go
    contextDir: docker-build
  strategy:
    name: buildah-medium
    kind: ClusterBuildStrategy
  # ...

Tekton pipeline 中的资源管理

构建控制器与 Tekton pipeline 控制器协同工作,以便它可以调度 pod 来执行策略步骤。在运行时,构建控制器创建一个 Tekton TaskRun 资源,而TaskRun 资源在特定命名空间中创建一个新的 pod。然后,此 pod 按顺序执行所有策略步骤以构建镜像。

注释定义

您可以为构建策略或集群构建策略定义注释,就像为任何其他 Kubernetes 对象一样。构建策略首先将注释传播到TaskRun资源。然后,Tekton 将它们传播到 pod。

您可以将注释用于以下目的:

  • 为了限制 pod 允许使用的网络带宽,在 Kubernetes 网络流量整形功能中定义了kubernetes.io/ingress-bandwidthkubernetes.io/egress-bandwidth注释。

  • 为了定义容器的 AppArmor 配置文件,使用了container.apparmor.security.beta.kubernetes.io/<container_name>注释。

以下示例显示了在构建策略中使用注释的情况

apiVersion: shipwright.io/v1beta1
kind: ClusterBuildStrategy
metadata:
  name: <cluster_build_strategy_name>
  annotations:
    container.apparmor.security.beta.kubernetes.io/step-build-and-push: unconfined
    container.seccomp.security.alpha.kubernetes.io/step-build-and-push: unconfined
spec:
  # ...

以下注释不会传播:

  • kubectl.kubernetes.io/last-applied-configuration

  • clusterbuildstrategy.shipwright.io/*

  • buildstrategy.shipwright.io/*

  • build.shipwright.io/*

  • buildrun.shipwright.io/*

策略管理员可以使用策略引擎进一步限制注释的使用。

安全引用字符串参数

当您在BuildStrategyClusterBuildStrategy自定义资源 (CR) 中定义环境变量、参数或镜像时,可以使用字符串参数。在构建策略步骤中,您可以使用$(params.your-parameter-name)语法引用字符串参数。

您也可以使用$(params.your-parameter-name)语法在构建策略步骤中引用系统参数和策略参数。

在 pod 中,所有$(params.your-parameter-name)变量都将被实际字符串替换。但是,当您使用内联脚本在参数中引用字符串参数时,必须注意。例如,为了安全地将参数值传递到使用脚本定义的参数中,您可以选择以下方法之一:

  • 使用环境变量

  • 使用参数

示例:将字符串参数引用到环境变量

您可以将字符串参数传递到环境变量中,而不是直接在脚本中使用它。通过对环境变量使用引号,您可以避免命令注入漏洞。您可以将此方法用于buildah等策略。以下示例在脚本中使用环境变量来引用字符串参数

apiVersion: shipwright.io/v1beta1
kind: BuildStrategy
metadata:
  name: sample-strategy
spec:
  parameters:
    - name: sample-parameter
      description: A sample parameter
      type: string
  steps:
    - name: sample-step
      env:
        - name: PARAM_SAMPLE_PARAMETER
          value: $(params.sample-parameter)
      command:
        - /bin/bash
      args:
        - -c
        - |
          set -euo pipefail

          some-tool --sample-argument "${PARAM_SAMPLE_PARAMETER}"
示例:将字符串参数引用到参数

您可以将字符串参数传递到脚本中定义的参数中。适当的 shell 引号可以防止命令注入。您可以将此方法用于buildah等策略。以下示例使用脚本中定义的参数来引用字符串参数

apiVersion: shipwright.io/v1beta1
kind: BuildStrategy
metadata:
  name: sample-strategy
spec:
  parameters:
    - name: sample-parameter
      description: A sample parameter
      type: string
  steps:
    - name: sample-step
      command:
        - /bin/bash
      args:
        - -c
        - |
          set -euo pipefail

          SAMPLE_PARAMETER="$1"

          some-tool --sample-argument "${SAMPLE_PARAMETER}"
        - --
        - $(params.sample-parameter)

系统结果定义

您可以将构建策略创建的镜像的大小和摘要存储到一组结果文件中。当BuildRun资源失败时,您还可以存储错误详细信息以进行调试。您可以在BuildStrategyClusterBuildStrategy CR 中定义以下结果参数:

表 3. 结果参数
参数 描述

$(results.shp-image-digest.path)

表示存储镜像摘要的文件的路径。

$(results.shp-image-size.path)

表示存储镜像压缩大小的文件的路径。

$(results.shp-error-reason.path)

表示存储错误原因的文件的路径。

$(results.shp-error-message.path)

表示存储错误消息的文件的路径。

以下示例显示BuildRun CR 的.status.output字段中的镜像大小和摘要

apiVersion: shipwright.io/v1beta1
kind: BuildRun
# ...
status:
 # ...
  output:
    digest: sha256:07626e3c7fdd28d5328a8d6df8d29cd3da760c7f5e2070b534f9b880ed093a53
    size: 1989004
  # ...

以下示例显示BuildRun CR 的.status.failureDetails字段中的错误原因和消息

apiVersion: shipwright.io/v1beta1
kind: BuildRun
# ...
status:
  # ...
  failureDetails:
    location:
      container: step-source-default
      pod: baran-build-buildrun-gzmv5-b7wbf-pod-bbpqr
    message: The source repository does not exist, or you have insufficient permission
      to access it.
    reason: GitRemotePrivate

卷和卷挂载定义

构建策略包括卷和卷挂载的定义。构建策略中定义的卷支持所有常用的volumeSource类型。构建步骤通过创建卷挂载来引用卷。

构建步骤中定义的卷挂载允许您访问在BuildStrategyBuildBuildRun资源中定义的卷。

构建策略中的卷使用一个overridable布尔标志,默认为false。如果BuildBuildRun资源试图覆盖在BuildStrategy资源中定义的卷,它将失败,因为overridable标志的默认值为false

以下示例显示一个定义了volumesvolumeMounts字段的BuildStrategy资源

apiVersion: shipwright.io/v1beta1
kind: BuildStrategy
metadata:
  name: buildah
spec:
  steps:
    - name: build
      image: quay.io/containers/buildah:v1.23.3
      # ...
      volumeMounts:
        - name: varlibcontainers
          mountPath: /var/lib/containers
  volumes:
    - name: varlibcontainers
      overridable: true
      emptyDir: {}