配置


builds for Red Hat OpenShift 1.2

配置构建

Red Hat OpenShift Documentation Team

摘要

本文档提供有关配置构建的信息。

第 1 章 配置构建

Build 自定义资源(CR)中,您可以定义源、构建策略、参数值、输出、保留参数和卷来配置构建。Build 资源可用于命名空间。

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

1.1. 构建中的可配置字段

您可以使用 Build 自定义资源(CR)中的以下字段:

表 1.1. Build CR 中的字段
字段存在描述

apiVersion

必填

指定资源的 API 版本,如 shipped wright.io/v1beta1

kind

必填

指定资源的类型,如 Build

metadata

必填

表示标识自定义资源定义实例的元数据,如 Build 资源的名称。

spec.source

必填

表示源代码的位置,如 Git 存储库或源捆绑包镜像。

spec.strategy

必填

表示用于 Build 资源的策略的名称和类型。

spec.output

必填

表示推送所生成的镜像的位置。

spec.output.pushSecret

必填

表示现有的 secret 以访问容器 registry。

spec.paramValues

选填

表示 name-value 列表,用于指定构建策略中定义的参数的值。

spec.timeout

选填

定义自定义超时。默认值为 10 分钟。您可以覆盖 BuildRun 资源中的此字段值。

spec.output.annotations

选填

表示可用于注解输出镜像的键值对列表。

spec.output.labels

选填

表示可用于标记输出镜像的键值对列表。

spec.env

选填

定义您可以传递给构建容器的额外环境变量。可用的变量取决于您的构建策略所使用的工具。

spec.retention.ttlAfterFailed

选填

指定失败的构建运行可以存在的持续时间。

spec.retention.ttlAfterSucceeded

选填

指定成功构建运行可以存在的持续时间。

spec.retention.failedLimit

选填

指定可以存在的失败构建运行次数。

spec.retention.succeededLimit

选填

指定可以存在的构建成功运行的数量。

1.2. 源定义

您可以通过设置以下字段的值,在 Build 自定义资源(CR)中配置构建的源详情:

  • source.git.url :定义 Git 存储库中提供的镜像的源位置。
  • source.git.cloneSecret :引用命名空间中包含私有 Git 存储库的 SSH 私钥的 secret。
  • source.git.revision :定义要从源 Git 仓库中选择的特定修订版本。例如,提交、标签或分支名称。此字段默认为 Git 存储库默认分支。
  • source.contextDir :指定源代码在根文件夹中不存在的存储库的上下文路径。

构建控制器不会自动验证您为拉取镜像指定的 Git 存储库是否存在。如果需要验证,请将 build.shipwright.io/verify.repository 注解的值设置为 true,如下例所示:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: buildah-golang-build
  annotations:
    build.shipwright.io/verify.repository: "true"
spec:
  source:
    git:
      url: https://github.com/shipwright-io/sample-go
    contextDir: docker-build

构建控制器在以下情况下验证 Git 存储库是否存在:

  • 当您将端点 URL 与 HTTP 或 HTTPS 协议搭配使用时。
  • 当您定义了 SSH 协议时,如 git@,而不是引用的 secret,如 source.git.cloneSecret

以下示例演示了如何使用不同源输入集配置构建。

示例:使用凭证配置构建

您可以通过指定凭证来使用源配置构建,如下例所示:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: buildah-build
spec:
  source:
    git:
      url: https://github.com/sclorg/nodejs-ex
      cloneSecret: source-repository-credentials

示例:使用上下文路径配置构建

您可以使用指定 Git 存储库中的上下文路径的源配置构建,如下例所示:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: buildah-custom-context-dockerfile
spec:
  source:
    git:
      url: https://github.com/userjohn/npm-simple
    contextDir: docker-build

示例:使用标签配置构建

您可以使用指定 Git 存储库标签 v.0.1.0 的源配置构建,如下例所示:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: buildah-golang-build
spec:
  source:
    git:
      url: https://github.com/shipwright-io/sample-go
      revision: v0.1.0

示例:使用环境变量配置构建

您还可以配置指定环境变量的构建,如下例所示:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: buildah-golang-build
spec:
  source:
    git:
      url: https://github.com/shipwright-io/sample-go
    contextDir: docker-build
  env:
    - name: <example_var_1>
      value: "<example_value_1>"
    - name: <example_var_2>
      value: "<example_value_2>"

1.3. 策略定义

您可以在 Build CR 中为构建配置策略。以下构建策略可供使用:

  • buildah
  • Source-to-image

要配置构建策略,请在 Build CR 中定义 spec.strategy.namespec.strategy.kind 字段,如下例所示:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: buildah-build
spec:
  strategy:
    name: buildah
    kind: ClusterBuildStrategy

1.4. 构建的参数值定义

您可以在 Build CR 中为构建策略参数指定值。通过指定参数值,您可以控制构建策略的步骤的工作方式。您还可以覆盖 BuildRun 资源中的值。

对于所有参数,您必须直接指定值,或使用配置映射或 secret 的引用键来指定值。

注意

在构建策略步骤中使用参数限制了配置映射和 secret 的使用。只有命令、参数或环境变量中使用了参数,则只能使用配置映射和 secret。

Build CR 中使用 paramValues 字段时,请避免以下情况:

  • 指定与 BuildStrategy CR 中定义的一个 spec.parameters 不匹配的 spec.paramValues 名称。
  • 指定与 Shipwright 保留参数冲突的 spec.paramValues 名称。这些参数包括 BUILDER_IMAGECONTEXT_DIR 以及以 shp- 开头的任何名称。

另外,请确保在 Build CR 中定义 paramValues 字段前了解策略的内容。

1.4.1. 定义参数值配置示例

以下示例演示了如何在构建策略中定义参数,并使用 Build CR 为这些参数分配值。您还可以为 Build CR 中的 type 数组 的参数分配一个值。

示例:在 ClusterBuildStrategy CR 中定义参数

以下示例显示了定义几个参数的 ClusterBuildStrategy CR:

apiVersion: shipwright.io/v1beta1
kind: ClusterBuildStrategy
metadata:
  name: buildah
spec:
  parameters:
    - name: build-args
      description: "The values for the args in the Dockerfile. Values must be in the format KEY=VALUE."
      type: array
      defaults: []
    # ...
    - name: storage-driver
      description: "The storage driver to use, such as 'overlay' or 'vfs'."
      type: string
      default: "vfs"
# ...
steps:
# ...

示例:将值分配给 Build CR 中的参数

以上 ClusterBuildStrategy CR 定义了一个 storage-driver 参数,您可以在 Build CR 中指定 storage-driver 参数的值,如下例所示:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: <your_build>
  namespace: <your_namespace>
spec:
  paramValues:
  - name: storage-driver
    value: "overlay"
  strategy:
    name: buildah
    kind: ClusterBuildStrategy
  output:
  # ...

示例:创建 ConfigMap CR 以集中控制参数

如果要将 storage-driver 参数用于多个构建并集中控制其使用情况,您可以创建一个 ConfigMap CR,如下例所示:

apiVersion: v1
kind: ConfigMap
metadata:
  name: buildah-configuration
  namespace: <your_namespace>
data:
  storage-driver: overlay

您可以使用创建的 ConfigMap CR 作为 Build CR 中的参数值,如下例所示:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: <your_build>
  namespace: <your_namespace>
spec:
  paramValues:
  - name: storage-driver
    configMapValue:
      name: buildah-configuration
      key: storage-driver
  strategy:
    name: buildah
    kind: ClusterBuildStrategy
  output:
  # ...

示例:将值分配给 Build CR 中的 type 数组 的参数

您可以为类型 数组 的参数分配值。如果使用 buildah 策略,您可以定义一个 registry-search 参数来搜索特定 registry 中的镜像。以下示例演示了如何为 registry-search 数组参数分配值:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: <your_build>
  namespace: <your_namespace>
spec:
  paramValues:
  - name: storage-driver
    configMapValue:
      name: buildah-configuration
      key: storage-driver
  - name: registries-search
    values:
    - value: registry.redhat.io
  strategy:
    name: buildah
    kind: ClusterBuildStrategy
  output:
  # ...

示例:引用 构建 CR 中的 secret

您可以为 registry-block 数组参数引用 secret,如下例所示:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: <your_build>
  namespace: <your_namespace>
spec:
  paramValues:
  - name: storage-driver
    configMapValue:
      name: buildah-configuration
      key: storage-driver
  - name: registries-block
    values:
    - secretValue: 1
        name: registry-configuration
        key: reg-blocked
  strategy:
    name: buildah
    kind: ClusterBuildStrategy
  output:
  # ...
1
该值引用 secret。

1.5. builder 或 docker 文件定义

Build CR 中,您可以使用 spec.paramValues 字段指定包含构建输出镜像的工具的镜像。以下示例指定了 Build CR 中的 Dockerfile 镜像:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: buildah-golang-build
spec:
  source:
    git:
      url: https://github.com/shipwright-io/sample-go
    contextDir: docker-build
  strategy:
    name: buildah
    kind: ClusterBuildStrategy
  paramValues:
  - name: dockerfile
    value: Dockerfile

您还可以在 Build CR 中使用 构建器镜像 作为 source-to-image 构建策略的一部分,如下例所示:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: s2i-nodejs-build
spec:
  source:
    git:
      url: https://github.com/shipwright-io/sample-nodejs
    contextDir: source-build/
  strategy:
    name: source-to-image
    kind: ClusterBuildStrategy
  paramValues:
  - name: builder-image
    value: docker.io/centos/nodejs-10-centos7

1.6. 输出定义

Build CR 中,您可以指定一个输出位置来推送镜像。当使用外部私有 registry 作为输出位置时,您必须指定一个 secret 才能访问该镜像。您还可以指定输出镜像的注解和标签。

注意

当您指定注解或标签时,输出镜像会被推送两次。第一个推送来自构建策略,第二次推送会更改镜像配置以添加注解和标签。

以下示例定义了推送镜像的公共 registry:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: s2i-nodejs-build
spec:
  source:
    git:
      url: https://github.com/shipwright-io/sample-nodejs
    contextDir: source-build/
  strategy:
    name: source-to-image
    kind: ClusterBuildStrategy
  paramValues:
  - name: builder-image
    value: docker.io/centos/nodejs-10-centos7
  output:
    image: image-registry.openshift-image-registry.svc:5000/build-examples/nodejs-ex

以下示例定义了推送镜像的私有 registry:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: s2i-nodejs-build
spec:
  source:
    git:
      url: https://github.com/shipwright-io/sample-nodejs
    contextDir: source-build/
  strategy:
    name: source-to-image
    kind: ClusterBuildStrategy
  paramValues:
  - name: builder-image
    value: docker.io/centos/nodejs-10-centos7
  output:
    image: us.icr.io/source-to-image-build/nodejs-ex
    pushSecret: icr-knbuild

以下示例为镜像定义注解和标签:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: s2i-nodejs-build
spec:
  source:
    git:
      url: https://github.com/shipwright-io/sample-nodejs
    contextDir: source-build/
  strategy:
    name: source-to-image
    kind: ClusterBuildStrategy
  paramValues:
  - name: builder-image
    value: docker.io/centos/nodejs-10-centos7
  output:
    image: us.icr.io/source-to-image-build/nodejs-ex
    pushSecret: icr-knbuild
    annotations:
      "org.opencontainers.image.source": "https://github.com/org/repo"
      "org.opencontainers.image.url": "https://my-company.com/images"
    labels:
      "maintainer": "team@my-company.com"
      "description": "This is my cool image"

1.7. 构建的保留参数定义

您可以针对以下目的定义保留参数:

  • 指定已完成的构建运行的时间
  • 指定构建可以存在的成功或失败的构建运行数量

保留参数提供了一种自动清理 BuildRun 实例或资源的方法。您可以在 Build CR 中设置以下保留参数的值:

  • retention.succeededLimit: 定义构建可以存在的成功构建运行数量。
  • retention.failedLimit :定义构建可以存在的失败构建运行数量。
  • retention.ttlAfterFailed: 指定失败的构建运行可以存在的持续时间。
  • retention.ttlAfterSucceeded: 指定成功构建运行可以存在的持续时间。

以下示例显示了在 Build CR 中使用保留参数:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: build-retention-ttl
spec:
  source:
    git:
      url: "https://github.com/shipwright-io/sample-go"
    contextDir: docker-build
  strategy:
    kind: ClusterBuildStrategy
    name: buildah
  output:
  # ...
  retention:
    ttlAfterFailed: 30m
    ttlAfterSucceeded: 1h
    failedLimit: 10
    succeededLimit: 20
  # ...
注意

当您更改 retention.failedLimitretention.succeededLimit 参数的值时,会在构建中应用这些更改后立即强制新限制。但是,当更改 retention.ttlAfterFailedretention.ttlAfterSucceeded 参数的值时,新的保留持续时间仅在新构建运行时强制使用。旧构建会遵循旧的保留持续时间。如果您在 BuildRun 和 Build CR 中定义了保留持续时间,则 Build Run CR 中定义的保留持续时间会获得优先级。

1.8. 构建的卷定义

您可以在 Build CR 中定义卷。定义的卷覆盖 BuildStrategy 资源中指定的卷。如果卷没有被覆盖,则构建运行会失败。

以下示例显示了在 Build CR 中使用 volumes 字段:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: <build_name>
spec:
  source:
    git:
      url: https://github.com/example/url
  strategy:
    name: buildah
    kind: ClusterBuildStrategy
  paramValues:
  - name: dockerfile
    value: Dockerfile
  output:
    image: registry/namespace/image:latest
  volumes:
    - name: <your_volume_name>
      configMap:
        name: <your_configmap_name>

第 2 章 配置构建策略

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

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

2.1. 策略参数定义

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

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

  • 在构建策略 CR 的 spec.parameters 字段中定义参数列表。每个列表项包含名称、描述、类型和可选的默认值,或是数组类型的值。如果没有设置默认值,则必须在 BuildBuildRun CR 中定义值。
  • 在构建策略的 spec.steps 字段中定义字符串或数组类型的参数。
  • 使用 $(params.your-parameter-name) 语法指定字符串类型的参数。您可以在 BuildBuildRun CR 中为 your-parameter-name 参数设置一个值,以引用您的策略。您可以根据您的需要定义以下字符串参数:

    表 2.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[*])
  • 将参数值作为简单字符串提供,或作为配置映射或 secret 中键的引用。对于参数,只有在 spec.steps 字段 的命令argsenv 部分中定义了配置映射或 secret 值时,才能使用它。

2.2. 系统参数定义

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

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

表 2.2. 系统参数
参数描述

$(params.shp-source-root)

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

$(params.shp-source-context)

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

$(params.shp-output-image)

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

2.3. 步骤资源定义

您可以为构建策略中的所有步骤包含资源的定义,如对 CPU、内存和磁盘用量实施的限制。对于具有多个步骤的策略,步骤可能需要的资源数量超过其他步骤。作为策略管理员,您可以定义每个步骤最佳的资源值。

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

2.3.1. 具有不同资源的策略

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

2.3.1.1. 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: []
    # ...

2.3.1.2. 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
  # ...

2.3.2. Tekton 管道中的资源管理

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

2.4. 注解定义

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

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

  • 要限制 pod 允许使用的网络带宽,Kubernetes 网络流量控制功能中定义了 kubernetes.io/ingress-bandwidthkubernetes.io/egress-bandwidth 注解。
  • 要定义容器的 AppArmor 配置集,使用 container. apparmor.security.beta.kubernetes.io/<container_name& gt; 注解。

以下示例演示了在构建策略中使用注解:

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/*

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

2.5. 安全引用字符串参数

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

注意

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

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

  • 使用环境变量
  • 使用参数

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

您可以将 string 参数传递给环境变量,而不是直接在脚本中使用它。通过使用对环境变量进行引用,您可以避免命令注入漏洞。您可以使用这种方法进行策略,如 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}"

示例:引用字符串参数到参数中

您可以将 string 参数传递给脚本中定义的参数。适当的 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)

2.6. 系统结果定义

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

表 2.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

2.7. 卷和卷挂载定义

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

注意

构建步骤中定义的卷挂载允许您访问 BuildStrategy、Build 或 Build Run 资源中定义的卷。

构建策略中的卷 使用可覆盖 的布尔值标志,该标志默认设置为 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: {}

第 3 章 配置构建运行

BuildRun 自定义资源(CR)中,您可以定义构建引用、构建规格、参数值、服务帐户、输出、保留参数和卷来配置构建运行。BuildRun 资源可用于命名空间。

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

3.1. 构建运行中的可配置字段

您可以使用 BuildRun 自定义资源(CR)中的以下字段:

表 3.1. BuildRun CR 中的字段
字段存在描述

apiVersion

必填

指定资源的 API 版本。例如,In wright.io/v1beta1

kind

必填

指定资源的类型。例如,BuildRun

metadata

必填

指明标识自定义资源定义实例的元数据。例如,BuildRun 资源的名称。

spec.build.name

选填

指定要使用的现有 Build 资源实例。您不能将此字段与 spec.build.spec 字段一起使用。

spec.build.spec

选填

指定要使用的嵌入式 Build 资源实例。您不能将此字段与 spec.build.name 字段一起使用。

spec.serviceAccount

选填

指明构建镜像时要使用的服务帐户。

spec.timeout

选填

定义自定义超时。此字段值覆盖 Build 资源中定义的 spec.timeout 字段的值。

spec.paramValues

选填

表示一个 name-value 列表,用于指定构建策略中定义的参数值。参数值覆盖了在 Build 资源中使用相同名称定义的参数的值。

spec.output.image

选填

表示推送所生成的镜像的自定义位置。此字段值覆盖 Build 资源中定义的 output.image 字段的值。

spec.output.pushSecret

选填

指明现有 secret 以访问容器 registry。此 secret 将添加到服务帐户中,以及 Build 资源请求的其他 secret。

spec.env

选填

定义您可以传递给构建容器的额外环境变量。此字段值覆盖 Build 资源中指定的任何环境变量。可用的变量取决于您的构建策略所使用的工具。

注意

您不能在同一 CR 中使用 spec.build.namespec.build.spec 字段,因为它们是互斥的。

3.2. 构建引用定义

您可以在 BuildRun 资源中配置 spec.build.name 字段,以引用指示要构建的镜像的 Build 资源。以下示例显示了配置 spec.build.name 字段的 BuildRun CR:

apiVersion: shipwright.io/v1beta1
kind: BuildRun
metadata:
  name: buildah-buildrun
spec:
  build:
    name: buildah-build

3.3. 构建规格定义

您可以使用 spec.build.spec 字段将完整的构建规格嵌入到 BuildRun 资源中。通过嵌入规格,您可以在不创建和维护专用的 Build 自定义资源的情况下构建镜像。以下示例显示了配置 spec.build.spec 字段的 BuildRun CR:

apiVersion: shipwright.io/v1beta1
kind: BuildRun
metadata:
  name: standalone-buildrun
spec:
   build:
    spec:
      source:
        git:
          url: https://github.com/shipwright-io/sample-go.git
        contextDir: source-build
      strategy:
        kind: ClusterBuildStrategy
        name: buildah
      output:
        image: <path_to_image>
注意

您不能在同一 CR 中使用 spec.build.namespec.build.spec 字段,因为它们是互斥的。

3.4. 构建运行的参数值定义

您可以在 BuildRun CR 中指定构建策略参数的值。如果您为那些在 Build 资源中定义的参数提供了一个名称相同的参数,则 BuildRun 资源中定义的值具有优先权。

在以下示例中,BuildRun 资源中的 cache 参数的值会覆盖 cache 参数的值,该参数在 Build 资源中定义:

apiVersion: shipwright.io/v1beta1
kind: Build
metadata:
  name: <your_build>
  namespace: <your_namespace>
spec:
  paramValues:
  - name: cache
    value: disabled
  strategy:
    name: <your_strategy>
    kind: ClusterBuildStrategy
  source:
  # ...
  output:
  # ...
apiVersion: shipwright.io/v1beta1
kind: BuildRun
metadata:
  name: <your_buildrun>
  namespace: <your_namespace>
spec:
  build:
    name: <your_build>
  paramValues:
  - name: cache
    value: registry

3.5. 服务帐户定义

您可以在 BuildRun 资源中定义服务帐户。服务帐户托管 Build 资源中引用的所有 secret,如下例所示:

apiVersion: shipwright.io/v1beta1
kind: BuildRun
metadata:
  name: buildah-buildrun
spec:
  build:
    name: buildah-build
  serviceAccount: pipeline 1
1
您还可以将 spec.serviceAccount 字段的值设置为 ".generate",以便在运行时生成服务帐户。生成的服务帐户的名称与 BuildRun 资源的名称对应。
注意

如果没有定义服务帐户,则 BuildRun 资源会在命名空间中使用 pipeline 服务帐户。否则,BuildRun 资源使用 默认服务帐户。

3.6. 构建运行的保留参数定义

您可以指定 BuildRun 资源中可以存在已完成的构建运行的时间。保留参数提供了一种自动清理 BuildRun 实例的方法。您可以在 BuildRun CR 中设置以下保留参数的值:

  • retention.ttlAfterFailed: 指定失败的构建运行可以存在的持续时间
  • retention.ttlAfterSucceeded: 指定成功构建运行可以存在的持续时间

以下示例演示了如何在 BuildRun CR 中定义保留参数:

apiVersion: shipwright.io/v1beta1
kind: BuildRun
metadata:
  name: buidrun-retention-ttl
spec:
  build:
    name: build-retention-ttl
  retention:
    ttlAfterFailed: 10m
    ttlAfterSucceeded: 10m
注意

如果您在 BuildRunBuild CR 中都定义了 retention 参数,则 BuildRun CR 中定义的值会覆盖 Build CR 中定义的 retention 参数的值。

3.7. 构建运行的卷定义

您可以在 BuildRun CR 中定义卷。定义的卷覆盖 BuildStrategy 资源中指定的卷。如果卷没有被覆盖,则构建运行会失败。

如果 BuildBuildRun 资源覆盖同一卷,则使用 BuildRun 资源中定义的卷覆盖。

以下示例显示了使用 volumes 字段的 BuildRun CR:

apiVersion: shipwright.io/v1beta1
kind: BuildRun
metadata:
  name: <buildrun_name>
spec:
  build:
    name: <build_name>
  volumes:
    - name: <volume_name>
      configMap:
        name: <configmap_name>

3.8. 环境变量定义

您可以根据您的需要使用 BuildRun CR 中的环境变量。以下示例演示了如何定义环境变量:

示例:使用环境变量定义 BuildRun 资源

apiVersion: shipwright.io/v1beta1
kind: BuildRun
metadata:
  name: buildah-buildrun
spec:
  build:
    name: buildah-build
  env:
    - name: <example_var_1>
      value: "<example_value_1>"
    - name: <example_var_2>
      value: "<example_value_2>"

以下示例显示了使用 Kubernetes Downward API 将 pod 作为环境变量公开的 BuildRun 资源:

示例:定义 BuildRun 资源,以将 pod 作为环境变量公开

apiVersion: shipwright.io/v1beta1
kind: BuildRun
metadata:
  name: buildah-buildrun
spec:
  build:
    name: buildah-build
  env:
    - name: <pod_name>
      valueFrom:
        fieldRef:
          fieldPath: metadata.name

以下示例显示了使用 Kubernetes Downward API 将容器公开为环境变量的 BuildRun 资源:

示例:定义 BuildRun 资源,以将容器公开为环境变量

apiVersion: shipwright.io/v1beta1
kind: BuildRun
metadata:
  name: buildah-buildrun
spec:
  build:
    name: buildah-build
  env:
    - name: MEMORY_LIMIT
      valueFrom:
        resourceFieldRef:
          containerName: <my_container>
          resource: limits.memory

3.9. 构建运行状态

BuildRun 资源会在镜像构建状态更改时更新,如下例所示:

示例: BuildRun 带有 Unknown 状态

$ oc get buildrun buildah-buildrun-mp99r
NAME                    SUCCEEDED   REASON    STARTTIME   COMPLETIONTIME
buildah-buildrun-mp99r  Unknown     Unknown      1s

示例:带有 True 状态的 BuildRun

$ oc get buildrun buildah-buildrun-mp99r
NAME                   SUCCEEDED   REASON     STARTTIME   COMPLETIONTIME
buildah-buildrun-mp99r  True        Succeeded      29m       20m

BuildRun 资源将与状态相关的信息存储在 status.conditions 字段中。例如,类型为 Succeeded 的条件表示资源成功完成其操作。status.conditions 字段包括包括 BuildRun 资源的大量信息,如 status、reason 和 message。

3.9.1. 构建运行状态描述

BuildRun 自定义资源(CR)在镜像构建过程中可能具有不同的状态。下表涵盖了构建运行的不同状态:

表 3.2. 构建运行的状态
Status原因描述

Unknown

待处理

BuildRun 资源等待状态为 Pending 的 pod。

Unknown

Running

BuildRun 资源已被验证并启动来执行其工作。

Unknown

BuildRunCanceled

用户需要取消构建运行。此请求触发构建运行控制器,以请求取消相关任务运行。当这个状态存在时,取消仍在进行中。

True

Succeeded

创建 BuildRun 资源的 pod。

False

Failed

BuildRun 资源在其中一个步骤中失败。

False

BuildRunTimeout

BuildRun 资源的执行超时。

False

UnknownStrategyKind

Kind 字段中定义的策略类型是 unknown。您可以定义这些策略类型: ClusterBuildStrategyBuildStrategy

False

ClusterBuildStrategyNotFound

集群中没有找到引用的集群范围的策略。

False

BuildStrategyNotFound

在集群中没有找到引用的命名空间范围的策略。

False

SetOwnerReferenceFailed

BuildRun 资源的 ownerReferences 字段设置为相关的 TaskRun 资源会失败。

False

TaskRunIsMissing

未找到与 BuildRun 资源相关的 TaskRun 资源。

False

TaskRunGenerationFailed

TaskRun 规格的生成失败。

False

MissingParameterValues

您没有为构建策略中定义的一些参数提供任何值,而无需任何默认值。您必须在 BuildBuildRun CR 中提供这些参数的值。

False

RestrictedParametersInUse

提供了 system 参数的值,这是不允许的。

False

UndefinedParameter

提供了在构建策略中未定义的参数的值。

False

WrongParameterValueType

为带有错误类型的构建策略参数提供了一个值。例如,如果参数在构建策略中定义为数组或字符串,您必须相应地提供一组值或直接值。

False

InconsistentParameterValues

一个参数的值包括多个值: value,configMapValue, 和 secretValue。您必须仅提供上述值之一才能保持一致性。

False

EmptyArrayItemParameterValues

数组参数的值中的项目不包括这些值: value,configMapValue, 和 secretValue。您必须仅提供上述值之一,因为不允许使用 null 数组项。

False

IncompleteConfigMapValueParameterValues

参数的值包含一个 configMapValue 值,其中 namevalue 字段为空。您必须指定空字段以指向命名空间中的现有配置映射键。

False

IncompleteSecretValueParameterValues

一个参数的值包含一个 secretValue 值,其中 namevalue 字段为空。您必须指定空字段以指向命名空间中的现有 secret 密钥。

False

ServiceAccountNotFound

在集群中没有找到引用的服务帐户。

False

BuildRegistrationFailed

BuildRun 资源中引用的构建处于 Failed 状态。

False

BuildNotFound

BuildRun 资源中引用的构建未找到。

False

BuildRunCanceled

BuildRun 和相关的 TaskRun 资源已被成功取消。

False

BuildRunNameInvalid

metadata.name 字段中定义的构建运行名称无效。您必须在 BuildRun CR 中为构建运行名称提供有效的标签值。

False

BuildRunNoRefOrSpec

BuildRun 资源没有定义 spec.build.namespec.build.spec 字段。

False

BuildRunAmbiguousBuild

定义的 BuildRun 资源同时使用 spec.build.namespec.build.spec 字段。一次只允许其中一个参数。

False

BuildRunBuildFieldOverrideForbidden

定义的 spec.build.name 字段将覆盖与 spec.build.spec 字段结合使用,该字段不允许使用。使用 spec.build.spec 字段直接指定对应的值。

False

PodEvicted

构建运行 pod 已从其运行的节点中驱除。

3.9.2. 构建运行失败

当构建运行时,您可以检查 BuildRun CR 中的 status.failureDetails 字段,以识别 pod 或容器中故障的确切点。status.failureDetails 字段包含错误消息和失败原因。只有在构建策略中定义了消息和原因时,您才会看到失败的消息和原因。

以下示例显示了构建运行失败:

# ...
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
注意

status.failureDetails 字段还为与 Git 相关的所有操作提供错误详情。

3.9.3. 构建运行状态的步骤结果

BuildRun 资源完成其执行后,.status 字段包含从构建运行控制器生成的步骤发出的 .status.taskResults 结果。结果包括用于构建镜像的源代码的镜像摘要或提交 SHA。在 BuildRun 资源中,.status.sources 字段包含来自执行源步骤的结果,.status.output 字段包含执行输出步骤的结果。

以下示例显示了带有 Git 源步骤结果的 BuildRun 资源:

示例:一个 BuildRun 资源,其中包含 Git 源的步骤结果

# ...
status:
  buildSpec:
    # ...
  output:
    digest: sha256:07626e3c7fdd28d5328a8d6df8d29cd3da760c7f5e2070b534f9b880ed093a53
    size: 1989004
  sources:
  - name: default
    git:
      commitAuthor: xxx xxxxxx
      commitSha: f25822b85021d02059c9ac8a211ef3804ea8fdde
      branchName: main

以下示例显示了带有本地源代码步骤结果的 BuildRun 资源:

示例:一个带有本地源代码步骤结果的 BuildRun 资源

# ...
status:
  buildSpec:
    # ...
  output:
    digest: sha256:07626e3c7fdd28d5328a8d6df8d29cd3da760c7f5e2070b534f9b880ed093a53
    size: 1989004
  sources:
  - name: default
    bundle:
      digest: sha256:0f5e2070b534f9b880ed093a537626e3c7fdd28d5328a8d6df8d29cd3da760c7

注意

只有在构建策略中定义输出镜像时,才会查看输出镜像的摘要和大小。

3.9.4. 构建快照

对于每个构建运行协调,如果现有任务运行是该构建运行的一部分,则 BuildRun 资源更新状态中的 buildSpec 字段。

在这个版本中,Build 资源快照会生成并嵌入到 BuildRun 资源的 status.buildSpec 字段中。因此,buildSpec 字段包含原始 Build 规格的确切副本,用于执行特定的镜像构建。通过使用构建快照,您可以查看原始的 Build 资源配置。

3.10. 构建与 Tekton 任务的关系

BuildRun 资源将镜像构造的任务委派给 Tekton TaskRun 资源,该资源运行所有步骤,直到任务完成或任务中发生失败为止。

在构建运行协调过程中,构建运行控制器会生成一个新的 TaskRun 资源。控制器在 TaskRun 资源中嵌入构建运行执行所需的步骤。嵌入的步骤在您的构建策略中定义。

3.11. 构建运行取消

您可以通过将状态设置为 BuildRun Canceled 来取消活跃的 BuildRun 实例。取消 BuildRun 实例时,底层 TaskRun 资源也会标记为已取消。

以下示例显示了为 BuildRun 资源运行的已取消构建运行:

apiVersion: shipwright.io/v1beta1
kind: BuildRun
metadata:
  name: buildah-buildrun
spec:
  # [...]
  state: "BuildRunCanceled"

3.12. 自动构建运行删除

要自动删除构建运行,您可以在 build 或 build run 规格中添加以下保留参数:

  • buildrun TTL 参数:确保构建仅在完成后定义的持续时间内存在。

    • buildrun.spec.retention.ttlAfterFailed: 如果指定时间通过并且构建运行失败,则构建运行将被删除。
    • buildrun.spec.retention.ttlAfterSucceeded: 如果指定时间通过并且构建运行成功,则构建运行将被删除。
  • build TTL 参数:确保构建仅在定义的时间完成后才存在构建。

    • build.spec.retention.ttlAfterFailed :如果传递了指定时间,构建运行会被删除,构建运行失败。
    • build.spec.retention.ttlAfterSucceeded ed :如果通过了指定时间并且构建运行成功,构建运行会被删除。
  • 构建 限制参数:确保构建存在有限数量的成功或失败的构建。

    • build.spec.retention.succeededLimit: 定义构建可能存在的成功构建运行数量。
    • build.spec.retention.failedLimit: 定义构建可以存在的失败构建运行数量。

第 4 章 在网络受限环境中使用构建

Red Hat OpenShift Pipelines Operator 支持在网络受限网络环境中注入代理环境变量。

4.1. 验证集群范围代理

作为集群管理员,您可以验证集群范围的代理设置。

流程

  • 要验证集群范围代理是否已正确配置,请运行以下命令:

    $ oc describe proxy/cluster

    集群代理对象显示代理服务器和证书信息。

4.2. 验证代理环境变量

作为集群管理员,您可以验证环境变量,以确保为 OpenShift Container Platform 集群上的 Red Hat OpenShift 构建正确配置了代理设置。

流程

  • 要验证环境变量,请运行以下命令:

    $ oc set env deployment/openshift-builds-operator --list -n openshift-builds | grep PROXY

    以下示例输出列出了 HTTP_PROXYHTTPS_PROXYNO_PROXY 环境变量:

    HTTP_PROXY=http://192.168.130.1:3128
    HTTPS_PROXY=https://192.168.130.1:3129
    NO_PROXY=.cluster.local,.svc,.testing,10.217.0.0/22,10.217.4.0/23,127.0.0.1,192.168.126.0/24,192.168.1
    30.11,api-int.crc.testing,localhost

4.3. 其他资源

Legal Notice

Copyright © 2024 Red Hat, Inc.

OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).

Modified versions must remove all Red Hat trademarks.

Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.

Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.

Linux® is the registered trademark of Linus Torvalds in the United States and other countries.

Java® is a registered trademark of Oracle and/or its affiliates.

XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.

MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.

Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.

The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.

All other trademarks are the property of their respective owners.

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.