构建器和镜像自动化
前言 复制链接链接已复制到粘贴板!
以下指南演示了如何在裸机和虚拟机上配置 Red Hat Quay 构建 功能。
第 1 章 Red Hat Quay 构建概述 复制链接链接已复制到粘贴板!
Red Hat Quay 构建 或仅构建 是一项支持自动化容器镜像构建的功能。构建 功能使用 worker 节点从 Dockerfile 或其他构建规格构建镜像。这些构建可以通过 GitHub 等存储库(如 GitHub)的 webhook 手动或自动触发,允许用户将持续集成(CI)和持续交付(CD)管道集成到其工作流中。
OpenShift Container Platform 和 Kubernetes 集群上的 Red Hat Quay 支持构建功能。对于基于 Operator 的部署和 Kubernetes 集群,构建是使用协调和处理 构建作业的构建 管理器 创建的。构建 支持在裸机平台和使用虚拟 构建器在虚拟 平台上构建 Dockerfile。这种通用性使组织能够适应现有基础架构,同时利用 Red Hat Quay 的容器镜像构建功能。
Red Hat Quay 构建 功能的主要功能包括:
- 由代码提交或版本控制事件触发的自动化构建
- 支持 Docker 和 Podman 容器镜像
- 对构建环境和资源的精细控制
- 与 Kubernetes 和 OpenShift Container Platform 集成以实现可扩展构建
- 与裸机和虚拟化基础架构的兼容性
直接在裸机平台上的容器中运行构建与使用虚拟机时没有同样的隔离,但它仍然提供良好的保护。
构建 非常复杂,建议管理员审查 构建自动化架构指南,然后再继续。
1.1. 构建容器镜像 复制链接链接已复制到粘贴板!
构建容器镜像涉及为容器化应用程序创建蓝图。蓝图依赖于其他公共存储库中的基础镜像,它们定义如何安装和配置应用程序。
Red Hat Quay 支持构建 Docker 和 Podman 容器镜像。此功能对于依赖容器和容器编排的开发人员和组织而言非常宝贵。
1.1.1. 构建上下文 复制链接链接已复制到粘贴板!
使用 Docker 或 Podman 构建镜像时,将指定目录成为 构建上下文。对于手动构建和构建触发器,这是正确的,因为由 创建的构建与在本地机器上运行 docker build 或 podman build 不同。
从 Build 设置的 子目录中 始终指定构建上下文,如果未指定目录,则回退到 Build 源的根目录。
触发构建时,Build worker 会将 Git 存储库克隆到 worker 机器,然后在执行构建前输入构建上下文。
对于基于 .tar 归档的构建,构建工作程序提取存档并输入构建上下文。例如:
提取的构建存档
假设 Extracted Build 归档 是目录结构,它有一个 Github 存储库,名为 example。如果在 Build 触发器设置中没有指定子目录,或者在手动启动构建时指定,则构建在示例目录中运行。
如果在 Build 触发器设置中指定子目录,如 subdir,则构建中只有其中的 Dockerfile 才可以看到。这意味着您不能使用 Dockerfile 中的 ADD 命令来添加文件,因为它不在构建上下文之外。
与 Docker Hub 不同,Dockerfile 是构建上下文的一部分,因此它不能出现在 .dockerignore 文件中。
第 2 章 为构建配置 OpenShift Container Platform TLS 组件 复制链接链接已复制到粘贴板!
QuayRegistry 自定义资源定义(CRD)的 tls 组件允许您控制 SSL/TLS 是否由 Red Hat Quay Operator 管理,还是自我管理。在其当前状态中,当 tls 组件由 Red Hat Quay Operator 管理时,Red Hat Quay 不支持构建功能或 构建器 worker。
当将 tls 组件设置为 非受管 时,您必须提供自己的 ssl.cert 和 ssl.key 文件。另外,如果您希望集群支持 构建器 (或负责构建镜像的 worker 节点),您必须将 Quay 路由和 构建器 路由名称添加到证书中的 SAN 列表中。或者,您可以使用通配符。
以下流程演示了如何添加 构建器 路由。
先决条件
-
您已将
tls组件设置为非受管组件,并将自定义 SSL/TLS 证书上传到 Red Hat Quay Operator。如需更多信息,请参阅 Red Hat Quay 的 SSL 和 TLS。
流程
在定义 SSL/TLS 证书参数的配置文件中,如
openssl.cnf,将以下信息添加到证书的 Subject Alternative Name (SAN)字段中。例如:# ... [alt_names] <quayregistry-name>-quay-builder-<namespace>.<domain-name>:443 # ...
# ... [alt_names] <quayregistry-name>-quay-builder-<namespace>.<domain-name>:443 # ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如:
# ... [alt_names] example-registry-quay-builder-quay-enterprise.apps.cluster-new.gcp.quaydev.org:443 # ...
# ... [alt_names] example-registry-quay-builder-quay-enterprise.apps.cluster-new.gcp.quaydev.org:443 # ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
本节中的步骤解释了如何在 OpenShift Container Platform 上为 Red Hat Quay 为 裸机构建 创建环境。
使用以下步骤为 OpenShift Container Platform 上的 Red Hat Quay 配置 裸机构建。
如果您在 OpenShift Container Platform 上使用带有 QuayRegistry CRD 中的受管 路由 组件的 Red Hat Quay Operator,请参阅 "Red Hat Quay on OpenShift Container Platform build limitations with self-managed routes"。
先决条件
- 您已在运行 Red Hat Quay Operator 时置备了 OpenShift Container Platform 集群。
-
您已将
tls组件设置为非受管组件,并将自定义 SSL/TLS 证书上传到 Red Hat Quay Operator。如需更多信息,请参阅 Red Hat Quay 的 SSL 和 TLS。 - 以集群管理员身份登录 OpenShift Container Platform。
流程
输入以下命令创建一个运行构建的项目,如
bare-metal-builder:oc new-project bare-metal-builder
$ oc new-project bare-metal-builderCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令在
bare-metal-builder命名空间中创建一个新ServiceAccount:oc create sa -n bare-metal-builder quay-builder
$ oc create sa -n bare-metal-builder quay-builderCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令在
bare-metal-builder命名空间中授予用户edit角色:oc policy add-role-to-user -n bare-metal-builder edit system:serviceaccount:bare-metal-builder:quay-builder
$ oc policy add-role-to-user -n bare-metal-builder edit system:serviceaccount:bare-metal-builder:quay-builderCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令检索与
bare-metal-builder命名空间中的quay-builder服务帐户关联的令牌。此令牌用于对 OpenShift Container Platform 集群的 API 服务器进行身份验证并与之交互。如果您的 OpenShift Container Platform 集群是 4.11+ 版本,请输入以下命令:
oc create token quay-builder -n bare-metal-builder --duration 24h
oc create token quay-builder -n bare-metal-builder --duration 24hCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您的 OpenShift Container Platform 集群早于 4.11 版本,例如版本 4.10,请输入以下命令:
oc sa get-token -n bare-metal-builder quay-builder
$ oc sa get-token -n bare-metal-builder quay-builderCopy to Clipboard Copied! Toggle word wrap Toggle overflow
- 识别 OpenShift Container Platform 集群的 API 服务器的 URL。这可在 OpenShift Container Platform Web 控制台中找到。
识别调度 构建作业时使用的 worker 节点标签。由于 构建 pod 必须在裸机 worker 节点上运行,因此通常使用特定标签来标识这些 pod。
使用集群管理员检查,确定应该使用哪个节点标签。
获取 Kube API 服务器的证书颁发机构(CA)以添加到 Red Hat Quay 的额外证书。
在 OpenShift Container Platform 版本 4.15+ 中,输入以下命令获取包含 CA 的 secret 名称:
oc extract cm/kube-root-ca.crt -n openshift-apiserver
$ oc extract cm/kube-root-ca.crt -n openshift-apiserverCopy to Clipboard Copied! Toggle word wrap Toggle overflow mv ca.crt build_cluster.crt
$ mv ca.crt build_cluster.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在早于 4.15 的 OpenShift Container Platform 版本中,如 4.14,输入以下命令:
oc get sa openshift-apiserver-sa --namespace=openshift-apiserver -o json | jq '.secrets[] | select(.name | contains("openshift-apiserver-sa-token"))'.name$ oc get sa openshift-apiserver-sa --namespace=openshift-apiserver -o json | jq '.secrets[] | select(.name | contains("openshift-apiserver-sa-token"))'.nameCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
从 OpenShift Container Platform Web 控制台中的 secret 获取
ca.crt键值。该值以 "-----BEGIN CERTIFICATE-----"' 开头。 -
将 CA 导入到 Red Hat Quay。确保此文件的名称与第 9 步中使用的
K8S_API_TLS_CA字段匹配。
为
ServiceAccount创建以下SecurityContextConstraints资源:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 OpenShift Container Platform Web 控制台更新 OpenShift Container Platform 部署上的 Red Hat Quay 的
config.yaml文件,使其包含适当的 裸机 构建配置。- 点 Operators → Installed Operators → Red Hat Quay → Quay Registry。
- 点 registry 的名称,如 example-registry。
- 在 Config Bundle Secret 下,单击配置捆绑包的名称,如 extra-ca-certificate-config-bundle-secret。
- 点 Actions → Edit Secret。
在您的 Red Hat Quay
config.yaml文件中添加以下信息,将每个值替换为与您特定安装相关的信息:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 运行以下命令获取
:$ oc get route quayregistry-quay-builder -n ${QUAY_PROJECT} -o jsonpath='{.spec.host}'. - 2
- Redis 服务的主机名。
- 3
- 设置为 与裸机构建 命名空间的名称匹配。本例使用
bare-metal-builder。 - 4
K8S_API_SERVER通过运行$ oc cluster-info获取。- 5
- 您必须手动创建并添加自定义 CA 证书,如
K8S_API_TLS_CA: /conf/stack/extra_ca_certs/build-cluster.crt。 - 6
- 如果未指定,则默认为
5120Mi。 - 7
- 如果未指定,则默认为
1000m。 - 8
- 如果未指定,则默认为
3968Mi。 - 9
- 如果未指定,则默认为
500m。 - 10
- 运行
$ oc create sa时获取。 - 11
- 允许将公共 SSH 密钥添加到构建环境中,以进行远程故障排除访问。此密钥或密钥应当与管理员或开发人员用来 SSH 到构建工作程序的私钥对应,用于调试目的。此密钥可以通过使用特定的 SSH 密钥和端口建立与远程主机的 SSH 连接来获取。例如
:$ ssh -i /path/to/ssh/key/set/in/ssh_authorized_keys -p 9999 core@localhost.
- 重启 Red Hat Quay registry 以启用 构建功能。
当您在带有受管 路由 组件的 OpenShift Container Platform 中使用 Red Hat Quay Operator 时,会有以下限制:
- 目前,OpenShift Container Platform 路由 只能为单个端口提供流量。设置 Red Hat Quay 构建需要额外的步骤。
-
确保
kubectl或ocCLI 工具已配置为与安装 Red Hat Quay Operator 的集群以及您的存在;QuayRegistry 不必位于运行 构建器 的同一裸机集群中。QuayRegistry - 按照以下步骤,确保 OpenShift 集群上启用了 HTTP/2 入口。
Red Hat Quay Operator 创建一个
Route资源,将 gRPC 流量定向到现有Quaypod 或 pod 中运行的 Build manager 服务器。如果要使用自定义主机名或类似 <builder-registry.example.com>的子域,请确保使用指向创建Route资源的status.ingress[0].host的 DNS 供应商创建一个 CNAME 记录。例如:kubectl get -n <namespace> route <quayregistry-name>-quay-builder -o jsonpath={.status.ingress[0].host}$ kubectl get -n <namespace> route <quayregistry-name>-quay-builder -o jsonpath={.status.ingress[0].host}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 OpenShift Container Platform UI 或 CLI,使用 构建 集群 CA 证书更新
QuayRegistry的spec.configBundle引用的 Secret。将键命名为Secretextra_ca_cert_build_cluster.cert。使用您在配置 Red Hat Quay 构建时 创建的构建配置中引用的正确值更新config.yaml文件条目,并添加BUILDMAN_HOSTNAMECONFIGURATION FIELD:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 构建作业用来传回 构建 管理器 的外部访问服务器主机名。默认为与
SERVER_HOSTNAME相同。对于 OpenShift路由资源,如果使用自定义主机名,它是status.ingress[0].host或 CNAME 条目。BUILDMAN_HOSTNAME必须包括端口号,例如 OpenShift Container Platform路由资源的somehost:443,因为用于与 构建管理器 通信的 gRPC 客户端不会推断任何端口(如果省略)。
本节中的步骤解释了如何在 OpenShift Container Platform 上为 Red Hat Quay 为 裸机构建 创建环境。
虚拟构建 可以在 OpenShift Container Platform 上的 Red Hat Quay 在虚拟机上运行。使用此方法时,构建管理器 首先创建 Job Object 资源。然后,作业对象 使用 quay-builder-image 创建一个 pod。quay-builder-image 包含 quay-builder 二进制文件和 Podman 服务。创建的 pod 作为非特权 运行。然后,quay-builder 二进制文件在通信状态并从构建 管理器检索构建信息时构建镜像。
4.1. 虚拟构建限制 复制链接链接已复制到粘贴板!
以下限制适用于 虚拟构建功能 :
- 在非特权上下文中使用 Red Hat Quay 运行 虚拟构建 可能会导致在上一个构建策略下工作的一些命令失败。尝试更改构建策略可能会导致构建出现性能问题和可靠性。
- 直接在容器中运行虚拟 构建与使用虚拟机没有相同的隔离。更改构建环境也可能会导致之前正常工作的构建失败。
本节中的步骤解释了如何在 OpenShift Container Platform 上为 Red Hat Quay 创建虚拟 构建环境。
- 如果使用 Amazon Web Service (AWS) S3 存储,则必须在运行构建器前在 AWS 控制台中修改存储桶。有关所需参数,请参阅以下部分"修改 AWS S3 存储桶"。
- 如果使用 Google Cloud Platform (GCP)对象存储桶,您必须配置跨原始资源共享(CORS)以启用 虚拟构建。
先决条件
- 您已在运行 Red Hat Quay Operator 时置备了 OpenShift Container Platform 集群。
-
您已将
tls组件设置为非受管组件,并将自定义 SSL/TLS 证书上传到 Red Hat Quay Operator。如需更多信息,请参阅 Red Hat Quay 的 SSL 和 TLS。 - 您已为构建配置了 OpenShift Container Platform TLS 组件。
- 以集群管理员身份登录 OpenShift Container Platform。
流程
运行以下命令,创建一个运行虚拟构建器的新项目,如
virtual-builders:oc new-project virtual-builders
$ oc new-project virtual-buildersCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令在项目中创建一个
ServiceAccount,用于运行 构建 :oc create sa -n virtual-builders quay-builder
$ oc create sa -n virtual-builders quay-builderCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
serviceaccount/quay-builder created
serviceaccount/quay-builder createdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为创建的服务帐户提供编辑权限,使其可以 运行构建 :
oc adm policy -n virtual-builders add-role-to-user edit system:serviceaccount:virtual-builders:quay-builder
$ oc adm policy -n virtual-builders add-role-to-user edit system:serviceaccount:virtual-builders:quay-builderCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
clusterrole.rbac.authorization.k8s.io/edit added: "system:serviceaccount:virtual-builders:quay-builder"
clusterrole.rbac.authorization.k8s.io/edit added: "system:serviceaccount:virtual-builders:quay-builder"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令,授予 构建器 worker
anyuid scc权限。这要求集群管理员特权,因为 构建器 必须以 Podman 用户身份运行,才能使非特权或无根构建正常工作。oc adm policy -n virtual-builders add-scc-to-user anyuid -z quay-builder
$ oc adm policy -n virtual-builders add-scc-to-user anyuid -z quay-builderCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
clusterrole.rbac.authorization.k8s.io/system:openshift:scc:anyuid added: "quay-builder"
clusterrole.rbac.authorization.k8s.io/system:openshift:scc:anyuid added: "quay-builder"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令来获取 builder 服务帐户的令牌:
oc create token quay-builder -n virtual-builders
$ oc create token quay-builder -n virtual-buildersCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意当令牌过期时,您需要请求新令牌。另外,您还可以添加自定义过期。例如,使用
specify-duration 20160m来保留令牌两周。输出示例
eyJhbGciOiJSUzI1NiIsImtpZCI6IldfQUJkaDVmb3ltTHZ0dGZMYjhIWnYxZTQzN2dJVEJxcDJscldSdEUtYWsifQ...
eyJhbGciOiJSUzI1NiIsImtpZCI6IldfQUJkaDVmb3ltTHZ0dGZMYjhIWnYxZTQzN2dJVEJxcDJscldSdEUtYWsifQ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令确定 构建器 路由:
oc get route -n quay-enterprise
$ oc get route -n quay-enterpriseCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令,使用
.crt扩展生成自签名 SSL/TlS 证书:oc extract cm/kube-root-ca.crt -n openshift-apiserver
$ oc extract cm/kube-root-ca.crt -n openshift-apiserverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
ca.crt
ca.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令将
ca.crt文件重命名为build-cluster.crt:mv ca.crt build-cluster.crt
$ mv ca.crt build-cluster.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 OpenShift Container Platform Web 控制台更新 OpenShift Container Platform 部署上的 Red Hat Quay 的
config.yaml文件,使其包含适当的 虚拟 构建配置。- 点 Operators → Installed Operators → Red Hat Quay → Quay Registry。
- 点 registry 的名称,如 example-registry。
- 在 Config Bundle Secret 下,单击配置捆绑包的名称,如 extra-ca-certificate-config-bundle-secret。
- 点 Actions → Edit Secret。
使用以下内容 添加适当的虚拟 构建配置作为参考:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 构建路由可通过在 OpenShift Container Platform 部署中使用 Red Hat Quay 的命名空间运行
$ oc get route -n来获得。路由末尾必须提供端口,并且应使用以下格式:[quayregistry-cr-name]-quay-builder-[ocp-namespace].[ocp-domain-name]:443。 - 2
- 如果
JOB_REGISTRATION_TIMEOUT参数设置过低,您可能会收到以下错误:failed to register job to build manager: rpc error: code = Unauthenticated desc = Invalid build token: Signature has expired。这个参数应至少设置为240。 - 3
- 如果您的 Redis 主机有密码或 SSL/TLS 证书,您必须相应地更新此字段。
- 4
- 设置为与 虚拟构建 命名空间的名称匹配。本例使用了
virtual-builders。 - 5
K8S_API_SERVER通过运行$ oc cluster-info获取。- 6
- 您必须手动创建并添加自定义 CA 证书,如
K8S_API_TLS_CA: /conf/stack/extra_ca_certs/build-cluster.crt。 - 7
- 如果未指定,则默认为
5120Mi。 - 8
- 对于 虚拟构建,您必须确保集群中有足够的资源。如果未指定,则默认为
1000m。 - 9
- 如果未指定,则默认为
3968Mi。 - 10
- 如果未指定,则默认为
500m。 - 11
- 运行
$ oc create sa时获取。
虚拟构建配置 示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 在 Edit Secret 页面上点 Save。
- 使用新配置重启 OpenShift Container Platform registry 上的 Red Hat Quay。
4.2.1. 修改 AWS S3 存储桶 复制链接链接已复制到粘贴板!
如果使用 AWS S3 存储,则必须在启动构建前更改 AWS 控制台中的存储桶。
流程
- 登录到位于 s3.console.aws.com 的 AWS 控制台。
-
在搜索栏中,搜索
S3,然后单击 S3。 -
单击存储桶的名称,如
myawsbucket。 - 单击权限选项卡。
在 Cross-origin 资源共享(CORS) 下,包括以下参数:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.2.2. 修改 Google Cloud Platform 对象存储桶 复制链接链接已复制到粘贴板!
目前,IBM Power 和 IBM Z 不支持修改 Google Cloud Platform 对象存储桶。
使用以下步骤为虚拟构建器配置跨原始资源共享(CORS)。如果没有 CORS 配置,上传构建 Dockerfile 会失败。
流程
使用以下参考来为您的特定 CORS 需要创建一个 JSON 文件。例如:
cat gcp_cors.json
$ cat gcp_cors.jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令更新 GCP 存储桶:
gcloud storage buckets update gs://<bucket_name> --cors-file=./gcp_cors.json
$ gcloud storage buckets update gs://<bucket_name> --cors-file=./gcp_cors.jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Updating Completed 1
Updating Completed 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以运行以下命令来显示 GCP 存储桶的更新 CORS 配置:
gcloud storage buckets describe gs://<bucket_name> --format="default(cors)"
$ gcloud storage buckets describe gs://<bucket_name> --format="default(cors)"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 5 章 启动新构建 复制链接链接已复制到粘贴板!
通过配置部署来启用 Red Hat Quay 构建 功能后,您可以通过调用 构建触发器 或上传 Dockerfile 来启动新构建。
通过上传 Dockerfile,请使用以下步骤启动新的构建。有关创建 构建触发器 的详情,请参考"Build triggers"。
先决条件
- 您已导航到存储库的 Builds 页面。
- 您已将您的环境配置为使用 构建功能。
流程
- 在 Builds 页面上,单击 Start New Build。
- 出现提示时,单击 Upload Dockerfile 以上传 Dockerfile 或在根目录中包含 Dockerfile 的存档。
单击 Start Build。
注意- 目前,在手动启动构建时,用户无法指定 Docker 构建上下文。
- 目前,BitBucket 在 Red Hat Quay v2 UI 上不支持。
- 您将被重定向到 构建,可实时查看。等待 Dockerfile 构建完成 并推送。
- 可选。您可以点 Download Logs 下载日志,或 Copy Logs 来复制日志。
单击 back 按钮,以返回到 Repository Builds 页面,您可以在其中查看 构建历史记录。
您可以点击 Build History 页面中的提交或运行以下命令来检查构建的状态:
oc get pods -n virtual-builders
$ oc get pods -n virtual-buildersCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE f192fe4a-c802-4275-bcce-d2031e635126-9l2b5-25lg2 1/1 Running 0 7s
NAME READY STATUS RESTARTS AGE f192fe4a-c802-4275-bcce-d2031e635126-9l2b5-25lg2 1/1 Running 0 7sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 构建完成后,
oc get pods -n virtual-builders命令不会返回任何资源:oc get pods -n virtual-builders
$ oc get pods -n virtual-buildersCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
No resources found in virtual-builders namespace.
No resources found in virtual-builders namespace.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 6 章 构建触发器 复制链接链接已复制到粘贴板!
构建触发器 是在满足特定条件时自动启动容器镜像构建的机制,如更改源代码、依赖项更新或 创建 webhook 调用。这些触发器有助于自动化镜像构建过程,并确保容器镜像始终保持最新状态,而无需手动干预。
以下小节涵盖了与创建构建触发器、标签命名约定、如何跳过源控制构建、启动构建或手动触发构建相关的内容。
6.1. 创建构建触发器 复制链接链接已复制到粘贴板!
以下流程 设置自定义 Git 触发器。自定义 Git 触发器是任何 Git 服务器充当 构建触发器 的通用方法。它依赖于 SSH 密钥和 webhook 端点。创建自定义 Git 触发器与创建任何其他触发器类似,但以下情况除外:
但是,可以复制这些步骤,以使用 Github、Gitlab 或 Bitbucket 创建 构建触发器,但在 config.yaml 文件中为这些服务配置凭证。
- 如果要使用 Github 创建 构建触发器,则必须通过创建 OAuth 应用程序将 Github 配置为与 Red Hat Quay 搭配使用。如需更多信息,请参阅"创建 OAuth 应用程序 Github"。
先决条件
- 对于 OpenShift Container Platform 部署上的 Red Hat Quay,您必须为 裸机构建 或虚拟构建 配置了 OpenShift Container Platform 环境。
流程
- 登录到您的 Red Hat Quay registry。
- 在导航窗格中,单击 Repositories。
- 单击 Create Repository。
- 点 Builds 选项卡。
- 在 Builds 页面上,单击 Create Build Trigger。
- 选择所需的平台,如 Github、Bitbucket、Gitlab 或使用自定义 Git 存储库。在本例中,单击 Custom Git Repository Push。
-
输入自定义 Git 存储库名称,例如
git@github.com:<username>/<repo>.git。然后,单击 Next。 提示时,通过选择其中一个或两个选项来配置标记选项:
- 使用分支或标签名称 标记清单。在选择此选项时,构建的清单会标记 git commit 的分支或标签名称。
如果在默认分支上添加
latest标签。在选择此选项时,如果构建在存储库的默认分支中进行了标记,则构建的清单具有 latest。另外,您可以添加自定义标记模板。您可以在这里输入多个标签模板,包括使用提交中的简短 SHA ID、时间戳、作者名称、提交者和分支名称作为标签。如需更多信息,请参阅 "Tag naming for build triggers"。
配置标记后,点 Next。
- 出现提示时,选择调用触发器时要构建的 Dockerfile 的位置。如果 Dockerfile 位于 git 存储库的根目录并命名为 Dockerfile,请输入 /Dockerfile 作为 Dockerfile 路径。然后,单击 Next。
-
出现提示时,选择 Docker 构建的上下文。如果 Dockerfile 位于 Git 存储库的根目录中,请输入
/作为构建上下文目录。然后,单击 Next。 - 可选。选择可选的机器人帐户。这可让您在构建过程中拉取私有基础镜像。如果您知道不使用私有基础镜像,您可以跳过这一步。
- 点击 Next。检查任何验证警告。如有必要,请在单击 Finish 前修复问题。
您会被警报,该触发器已被成功激活。请注意,使用这个触发器需要以下操作:
- 您必须授予以下对 git 存储库的读取访问权限。
您必须将存储库设置为
POST到以下 URL,才能触发构建。保存 SSH Public Key,然后单击 return to <organization_name>/<repository_name>。您将被重定向到存储库的 Builds 页面。
在 Builds 页面中,您现在有一个 构建触发器。例如:
创建自定义 Git 触发器后,需要额外的步骤。继续 继续"设置自定义 Git 触发器"。
如果您要为 Github、Gitlab 或 Bitbucket 设置构建触发器,请继续" 手动触发构建 "。
6.1.1. 设置自定义 Git 触发器 复制链接链接已复制到粘贴板!
创建自定义 Git 触发器 后,需要额外的步骤:
- 您必须提供在创建触发器时生成的 SSH 公钥的读取访问权限。
- 您必须设置 POST 到 Red Hat Quay 端点的 Webhook,以触发构建。
只有在使用 自定义 Git 触发器 时,才需要这些步骤。
6.1.1.1. 获取构建触发器凭证 复制链接链接已复制到粘贴板!
SSH 公钥和 Webhook 端点 URL 在 Red Hat Quay UI 上提供。
先决条件
- 您已创建了自定义 Git 触发器。
流程
- 在存储库的 Builds 页面中,单击 自定义 Git 触发器 菜单 kebab。
- 单击 View Credentials。
- 保存 SSH 公钥和 Webhook 端点 URL。
通过从 Settings 或 gear 图标选择 View Credentials,可以使用密钥和 URL。
从您的存储库中查看和修改标签
6.1.1.1.1. SSH 公钥访问 复制链接链接已复制到粘贴板!
根据 Git 服务器配置,可以通过多种方法安装为自定义 Git 触发器生成的 SSH 公钥。
例如,服务器上获取 Git 的文档描述了如何在基于 Linux 的机器上设置 Git 服务器,专注于通过 SSH 管理存储库和访问控制。在此过程中,将小服务器设置为将密钥添加到 $HOME/.ssh/authorize_keys 文件夹,它为 构建器 提供克隆存储库的访问权限。
对于任何未正式支持的 Git 存储库管理软件,通常有一个位置来输入通常标记为 Deploy Keys 的密钥。
6.1.1.1.2. Webhook 复制链接链接已复制到粘贴板!
要自动触发构建,您必须使用以下格式将 .json 有效负载 POST 到 webhook URL:
此请求需要一个包含 application/json 的 Content-Type 标头才能有效。
Webhook 示例
这通常可以通过 post-receive Git hook 来完成,但它取决于服务器设置。
6.1.2. 构建触发器的标签命名 复制链接链接已复制到粘贴板!
自定义标签可用于 Red Hat Quay。
一个选项是包括分配给每个构建镜像标签的任何字符字符串。或者,您可以使用构建触发器的 Configure Tagging 部分中的以下标签模板来标记带有每个提交信息的镜像:
- ${commit} :已发布的提交的完全 SHA
- ${parsed_ref.branch}: 分支信息(如果可用)
- ${parsed_ref.tag}: 标签信息(如果可用)
- ${parsed_ref.remote} :远程名称
- ${commit_info.date}: 签发提交的日期
- ${commit_info.author.username}: 提交作者的用户名
- ${commit_info.short_sha}: 提交 SHA 的前 7 个字符
- ${committer.properties.username}: committer 的 Username
此列表未完成,但包含用于标记目的的最有用的选项。您可以在此页面中找到完整的标签模板模式。https://github.com/quay/quay/blob/abfde5b9d2cf7d7145e68a00c9274011b4fe0661/buildtrigger/basehandler.py#L96-L195
6.1.3. 跳过源 control-triggered 构建 复制链接链接已复制到粘贴板!
要指定构建系统应该忽略提交,请在提交消息中的任何位置添加文本 [skip build] 或 [build skip]。
6.2. 手动触发构建 复制链接链接已复制到粘贴板!
可以按照以下流程手动触发 构建。
流程
- 在 Builds 页面中,启动新构建。
- 出现提示时,选择 Invoke Build Trigger。
- 点 Run Trigger Now 来手动启动此过程。
输入要启动构建的提交 ID,例如
1c002dd。构建启动后,您可以在 Repository Builds 页面上看到 构建 ID。
您可以点击 Build History 页面中的提交或运行以下命令来检查构建的状态:
oc get pods -n virtual-builders
$ oc get pods -n virtual-buildersCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE f192fe4a-c802-4275-bcce-d2031e635126-9l2b5-25lg2 1/1 Running 0 7s
NAME READY STATUS RESTARTS AGE f192fe4a-c802-4275-bcce-d2031e635126-9l2b5-25lg2 1/1 Running 0 7sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 构建完成后,
oc get pods -n virtual-builders命令不会返回任何资源:oc get pods -n virtual-builders
$ oc get pods -n virtual-buildersCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
No resources found in virtual-builders namespace.
No resources found in virtual-builders namespace.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 7 章 在 GitHub 中创建 OAuth 应用程序 复制链接链接已复制到粘贴板!
以下小节介绍了如何通过创建 OAuth 应用程序授权 Red Hat Quay 与 GitHub 集成。这允许 Red Hat Quay 代表用户访问 GitHub 存储库。
与 GitHub 的 OAuth 集成主要用于允许自动构建等功能,从中可以启用 Red Hat Quay 来监控特定 GitHub 存储库的更改,如提交或拉取请求,并在进行这些更改时触发包含镜像构建。
7.1. 创建新 GitHub 应用程序 复制链接链接已复制到粘贴板!
使用以下步骤在 Github 中创建 OAuth 应用程序。
流程
- 登录 GitHub Enterprise。
- 在导航窗格中,选择 您的用户名 → 您的机构。
- 在导航窗格中,选择 Applications → Developer Settings。
在导航窗格中,点击 OAuth Apps → New OAuth App。您可以进入以下页面:
- 在 Application name 文本框中输入应用程序的名称。
在 Homepage URL 文本框中,输入您的 Red Hat Quay URL。
注意如果您使用公共 GitHub,则输入的 Homepage URL 必须可以被您的用户访问。它仍然可能是一个内部 URL。
- 在 Authorization 回调 URL 中,输入 https://<RED_HAT_QUAY_URL>/oauth2/github/callback。
- 点 Register application 保存您的设置。
- 显示新应用的摘要时,记录新应用显示的客户端 ID 和客户端 Secret。
第 8 章 构建故障排除 复制链接链接已复制到粘贴板!
由 构建管理器 启动的 构建器 实例是临时的。这意味着它们由 Red Hat Quay 在超时或失败时关闭,或由 control plane (EC2/K8s)收集垃圾回收。要获取构建日志,必须在 构建 运行时进行此操作。
8.1. DEBUG 配置标志 复制链接链接已复制到粘贴板!
DEBUG 标志可以设置为 true,以防止 构建程序 实例在完成或失败后被清理。例如:
当设置为 true 时,debug 功能可防止 构建节点在 quay-builder 服务完成或失败后关闭。它还可防止 构建管理器 通过终止 EC2 实例或删除 Kubernetes 作业来清理实例。这允许调试 构建器节点 问题。
不应在产品周期中设置调试。生命周期服务仍然存在;例如,实例仍然会在大约 2 小时后关闭。发生这种情况时,EC2 实例将终止并完成 Kubernetes 作业。
启用 debug 也会影响 ALLOWED_WORKER_COUNT,因为未确定的实例和作业仍计算为运行 worker 的总数。因此,如果达到 ALLOWED_WORKER_COUNT,则必须手动删除现有的 构建器 worker 才能调度 新构建。
8.2. OpenShift Container Platform 和 Kubernetes 构建故障排除 复制链接链接已复制到粘贴板!
使用以下步骤对 OpenShift Container Platform Kubernetes 构建进行故障排除。
流程
输入以下命令在本地机器和使用 OpenShift Container Platform 集群或 Kubernetes 集群运行的 pod 之间创建端口转发隧道:
oc port-forward <builder_pod> 9999:2222
$ oc port-forward <builder_pod> 9999:2222Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用指定的 SSH 密钥和端口建立到远程主机的 SSH 连接,例如:
ssh -i /path/to/ssh/key/set/in/ssh_authorized_keys -p 9999 core@localhost
$ ssh -i /path/to/ssh/key/set/in/ssh_authorized_keys -p 9999 core@localhostCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令来获取
quay-builder服务日志:systemctl status quay-builder
$ systemctl status quay-builderCopy to Clipboard Copied! Toggle word wrap Toggle overflow journalctl -f -u quay-builder
$ journalctl -f -u quay-builderCopy to Clipboard Copied! Toggle word wrap Toggle overflow