4.5. 为使用 OpenShift Pipelines 的应用程序创建 CI/CD 解决方案
使用 Red Hat OpenShift Pipelines,您可以创建一个自定义的 CI/CD 解决方案来构建、测试和部署应用程序。
要为应用程序创建一个完整的自助 CI/CD 管道,请执行以下任务:
- 创建自定义任务,或安装现有的可重复使用的任务。
- 为应用程序创建并定义交付管道。
使用以下方法之一提供附加到管道执行的工作区中的存储卷或文件系统:
- 指定创建持久性卷声明的卷声明模板
- 指定一个持久性卷声明
-
创建一个
PipelineRun
对象来实例化并调用管道。 - 添加触发器以捕获源仓库中的事件。
本节使用 pipelines-tutorial
示例来演示前面的任务。这个示例使用一个简单的应用程序,它由以下部分组成:
-
一个前端接口,
pipelines-vote-ui
,它的源代码在pipelines-vote-ui
Git 存储库中。 -
一个后端接口
pipelines-vote-api
,它的源代码在pipelines-vote-api
Git 存储库中。 -
apply-manifests
和update-deployment
任务在pipelines-tutorial
Git 存储库中。
4.5.1. 先决条件
- 有访问 OpenShift Container Platform 集群的权限。
- 已使用在 OpenShift OperatorHub 中列出的 Red Hat OpenShift Pipelines Operator 安装了 OpenShift Pipelines。在安装后,它可用于整个集群。
- 已安装 OpenShift Pipelines CLI。
-
使用您的 GitHub ID fork 前端
pipelines-vote-ui
和后端pipelines-vote-api
Git 存储库,并具有对这些存储库的管理员访问权限。 -
可选:已克隆了
pipelines-tutorial
Git 存储库。
4.5.2. 创建项目并检查管道服务帐户
流程
登录您的 OpenShift Container Platform 集群:
$ oc login -u <login> -p <password> https://openshift.example.com:6443
为示例应用程序创建一个项目。在本例中,创建
pipelines-tutorial
项目:$ oc new-project pipelines-tutorial
注意如果您使用其他名称创建项目,请确定使用您的项目名称更新示例中使用的资源 URL。
查看
pipeline
服务帐户:Red Hat OpenShift Pipelines Operator 添加并配置一个名为
pipeline
的服务帐户,该帐户有足够的权限来构建和推送镜像。PipelineRun
对象使用此服务帐户。$ oc get serviceaccount pipeline
4.5.3. 创建管道任务
流程
从
pipelines-tutorial
存储库安装apply-manifests
和update-deployment
任务资源,其中包含可为管道重复使用的任务列表:$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/pipelines-1.5/01_pipeline/01_apply_manifest_task.yaml $ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/pipelines-1.5/01_pipeline/02_update_deployment_task.yaml
使用
tkn task list
命令列出您创建的任务:$ tkn task list
输出会确认创建了
apply-manifests
和update-deployment
任务:NAME DESCRIPTION AGE apply-manifests 1 minute ago update-deployment 48 seconds ago
使用
tkn clustertasks list
命令列出由 Operator 安装的额外集群任务,如buildah
和s2i-python
:注意要在受限环境中使用
buildah
集群任务,您必须确保 Dockerfile 使用内部镜像流作为基础镜像。$ tkn clustertasks list
输出列出了 Operator 安装的
ClusterTask
资源:NAME DESCRIPTION AGE buildah 1 day ago git-clone 1 day ago s2i-python 1 day ago tkn 1 day ago
4.5.4. 组装管道
管道(pipeline)代表一个 CI/CD 流,由要执行的任务定义。它被设计为在多个应用程序和环境中通用且可重复使用。
管道指定任务如何使用 from
和 runAfter
参数相互交互以及它们执行的顺序。它使用 workspaces
字段指定管道中每个任务在执行过程中所需的一个或多个卷。
在本小节中,您将创建一个管道,从 GitHub 获取应用程序的源代码,然后在 OpenShift Container Platform 上构建和部署应用程序。
管道为后端应用程序 pipelines-vote-api
和前端应用程序 pipelines-vote-ui
执行以下任务:
-
通过引用
git-url
和git-revision
参数,从 Git 存储库中克隆应用程序的源代码。 -
使用
buildah
集群任务构建容器镜像。 -
通过引用
image
参数将镜像推送到内部 镜像 registry。 -
通过使用
apply-manifests
和update-deployment
任务在 OpenShift Container Platform 上部署新镜像。
流程
复制以下管道 YAML 文件示例内容并保存:
apiVersion: tekton.dev/v1beta1 kind: Pipeline metadata: name: build-and-deploy spec: workspaces: - name: shared-workspace params: - name: deployment-name type: string description: name of the deployment to be patched - name: git-url type: string description: url of the git repo for the code of deployment - name: git-revision type: string description: revision to be used from repo of the code for deployment default: "pipelines-1.5" - name: IMAGE type: string description: image to be built from the code tasks: - name: fetch-repository taskRef: name: git-clone kind: ClusterTask workspaces: - name: output workspace: shared-workspace params: - name: url value: $(params.git-url) - name: subdirectory value: "" - name: deleteExisting value: "true" - name: revision value: $(params.git-revision) - name: build-image taskRef: name: buildah kind: ClusterTask params: - name: IMAGE value: $(params.IMAGE) workspaces: - name: source workspace: shared-workspace runAfter: - fetch-repository - name: apply-manifests taskRef: name: apply-manifests workspaces: - name: source workspace: shared-workspace runAfter: - build-image - name: update-deployment taskRef: name: update-deployment params: - name: deployment value: $(params.deployment-name) - name: IMAGE value: $(params.IMAGE) runAfter: - apply-manifests
Pipeline 定义提取 Git 源存储库和镜像 registry 的特定内容。当一个管道被触发并执行时,这些详细信息会作为
params
添加。创建管道:
$ oc create -f <pipeline-yaml-file-name.yaml>
或者,还可以从 Git 存储库直接执行 YAML 文件:
$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/pipelines-1.5/01_pipeline/04_pipeline.yaml
使用
tkn pipeline list
命令来验证管道是否已添加到应用程序中:$ tkn pipeline list
检查输出来验证创建了
build-and-deploy
pipeline:NAME AGE LAST RUN STARTED DURATION STATUS build-and-deploy 1 minute ago --- --- --- ---
4.5.5. 镜像以在受限环境中运行管道
要在断开连接的集群或受限环境中置备的集群中运行 OpenShift Pipelines,请确保为受限网络配置了 Samples Operator,或者集群管理员创建了带有镜像 registry 的集群。
以下流程使用 pipelines-tutorial
示例,使用带有镜像 registry 的集群在受限环境中为应用程序创建管道。为确保 pipelines-tutorial
示例在受限环境中工作,您必须为前端接口(pipelines-vote-ui
)后端接口(pipelines-vote-api
)和 cli
从 mirror registry 中镜像相应的构建器镜像。
流程
为前端接口
pipelines-vote-ui
从 mirror registry 中镜像构建器镜像。验证所需镜像标签没有导入:
$ oc describe imagestream python -n openshift
输出示例
Name: python Namespace: openshift [...] 3.8-ubi8 (latest) tagged from registry.redhat.io/ubi8/python-38:latest prefer registry pullthrough when referencing this tag Build and run Python 3.8 applications on UBI 8. For more information about using this builder image, including OpenShift considerations, see https://github.com/sclorg/s2i-python-container/blob/master/3.8/README.md. Tags: builder, python Supports: python:3.8, python Example Repo: https://github.com/sclorg/django-ex.git [...]
将支持的镜像标签镜像到私有 registry:
$ oc image mirror registry.redhat.io/ubi8/python-38:latest <mirror-registry>:<port>/ubi8/python-38
导入镜像:
$ oc tag <mirror-registry>:<port>/ubi8/python-38 python:latest --scheduled -n openshift
您必须定期重新导入镜像。
--scheduled
标志启用镜像自动重新导入。验证带有指定标签的镜像已被导入:
$ oc describe imagestream python -n openshift
输出示例
Name: python Namespace: openshift [...] latest updates automatically from registry <mirror-registry>:<port>/ubi8/python-38 * <mirror-registry>:<port>/ubi8/python-38@sha256:3ee3c2e70251e75bfeac25c0c33356add9cc4abcbc9c51d858f39e4dc29c5f58 [...]
为后端接口
pipelines-vote-api
从 mirror registry 中镜像构建器镜像。验证所需镜像标签没有导入:
$ oc describe imagestream golang -n openshift
输出示例
Name: golang Namespace: openshift [...] 1.14.7-ubi8 (latest) tagged from registry.redhat.io/ubi8/go-toolset:1.14.7 prefer registry pullthrough when referencing this tag Build and run Go applications on UBI 8. For more information about using this builder image, including OpenShift considerations, see https://github.com/sclorg/golang-container/blob/master/README.md. Tags: builder, golang, go Supports: golang Example Repo: https://github.com/sclorg/golang-ex.git [...]
将支持的镜像标签镜像到私有 registry:
$ oc image mirror registry.redhat.io/ubi8/go-toolset:1.14.7 <mirror-registry>:<port>/ubi8/go-toolset
导入镜像:
$ oc tag <mirror-registry>:<port>/ubi8/go-toolset golang:latest --scheduled -n openshift
您必须定期重新导入镜像。
--scheduled
标志启用镜像自动重新导入。验证带有指定标签的镜像已被导入:
$ oc describe imagestream golang -n openshift
输出示例
Name: golang Namespace: openshift [...] latest updates automatically from registry <mirror-registry>:<port>/ubi8/go-toolset * <mirror-registry>:<port>/ubi8/go-toolset@sha256:59a74d581df3a2bd63ab55f7ac106677694bf612a1fe9e7e3e1487f55c421b37 [...]
从
cli
的镜像 registry 中镜像构建器镜像。验证所需镜像标签没有导入:
$ oc describe imagestream cli -n openshift
输出示例
Name: cli Namespace: openshift [...] latest updates automatically from registry quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:65c68e8c22487375c4c6ce6f18ed5485915f2bf612e41fef6d41cbfcdb143551 * quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:65c68e8c22487375c4c6ce6f18ed5485915f2bf612e41fef6d41cbfcdb143551 [...]
将支持的镜像标签镜像到私有 registry:
$ oc image mirror quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:65c68e8c22487375c4c6ce6f18ed5485915f2bf612e41fef6d41cbfcdb143551 <mirror-registry>:<port>/openshift-release-dev/ocp-v4.0-art-dev:latest
导入镜像:
$ oc tag <mirror-registry>:<port>/openshift-release-dev/ocp-v4.0-art-dev cli:latest --scheduled -n openshift
您必须定期重新导入镜像。
--scheduled
标志启用镜像自动重新导入。验证带有指定标签的镜像已被导入:
$ oc describe imagestream cli -n openshift
输出示例
Name: cli Namespace: openshift [...] latest updates automatically from registry <mirror-registry>:<port>/openshift-release-dev/ocp-v4.0-art-dev * <mirror-registry>:<port>/openshift-release-dev/ocp-v4.0-art-dev@sha256:65c68e8c22487375c4c6ce6f18ed5485915f2bf612e41fef6d41cbfcdb143551 [...]
4.5.6. 运行管道
PipelineRun
资源启动管道,并将其与 Git 和用于特定调用的镜像资源相关联。它为管道中的每个任务自动创建并启动 TaskRun
资源。
流程
启动后端应用程序的管道:
$ tkn pipeline start build-and-deploy \ -w name=shared-workspace,volumeClaimTemplateFile=https://raw.githubusercontent.com/openshift/pipelines-tutorial/pipelines-1.5/01_pipeline/03_persistent_volume_claim.yaml \ -p deployment-name=pipelines-vote-api \ -p git-url=https://github.com/openshift/pipelines-vote-api.git \ -p IMAGE=image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/pipelines-vote-api \ --use-param-defaults
上一命令使用卷声明模板,该模板为管道执行创建持久性卷声明。
要跟踪管道运行的进度,请输入以下命令:
$ tkn pipelinerun logs <pipelinerun_id> -f
上述命令中的 <pipelinerun_id> 是上一命令输出返回的
PipelineRun
的 ID。启动前端应用程序的管道:
$ tkn pipeline start build-and-deploy \ -w name=shared-workspace,volumeClaimTemplateFile=https://raw.githubusercontent.com/openshift/pipelines-tutorial/pipelines-1.5/01_pipeline/03_persistent_volume_claim.yaml \ -p deployment-name=pipelines-vote-ui \ -p git-url=https://github.com/openshift/pipelines-vote-ui.git \ -p IMAGE=image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/pipelines-vote-ui \ --use-param-defaults
要跟踪管道运行的进度,请输入以下命令:
$ tkn pipelinerun logs <pipelinerun_id> -f
上述命令中的 <pipelinerun_id> 是上一命令输出返回的
PipelineRun
的 ID。几分钟后,使用
tkn pipelinerun list
命令列出所有管道运行来验证管道是否成功运行:$ tkn pipelinerun list
输出列出了管道运行:
NAME STARTED DURATION STATUS build-and-deploy-run-xy7rw 1 hour ago 2 minutes Succeeded build-and-deploy-run-z2rz8 1 hour ago 19 minutes Succeeded
获取应用程序路由:
$ oc get route pipelines-vote-ui --template='http://{{.spec.host}}'
记录上一个命令的输出。您可以使用此路由来访问应用程序。
要重新运行最后的管道运行,请使用上一管道的管道资源和服务帐户运行:
$ tkn pipeline start build-and-deploy --last
其他资源
4.5.7. 在管道中添加触发器
触发器(Trigger)使 Pipelines 可以响应外部 GitHub 事件,如推送事件和拉取请求。在为应用程序组装并启动管道后,添加 TriggerBinding
、TriggerTemplate
、Trigger
和 EventListener
资源来捕获 GitHub 事件。
流程
复制以下
TriggerBinding
YAML 示例文件的内容并保存:apiVersion: triggers.tekton.dev/v1alpha1 kind: TriggerBinding metadata: name: vote-app spec: params: - name: git-repo-url value: $(body.repository.url) - name: git-repo-name value: $(body.repository.name) - name: git-revision value: $(body.head_commit.id)
创建
TriggerBinding
资源:$ oc create -f <triggerbinding-yaml-file-name.yaml>
或者,您可以直接从
pipelines-tutorial
Git 仓库创建TriggerBinding
资源:$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/pipelines-1.5/03_triggers/01_binding.yaml
复制以下
TriggerTemplate
YAML 示例文件的内容并保存:apiVersion: triggers.tekton.dev/v1alpha1 kind: TriggerTemplate metadata: name: vote-app spec: params: - name: git-repo-url description: The git repository url - name: git-revision description: The git revision default: pipelines-1.5 - name: git-repo-name description: The name of the deployment to be created / patched resourcetemplates: - apiVersion: tekton.dev/v1beta1 kind: PipelineRun metadata: generateName: build-deploy-$(tt.params.git-repo-name)- spec: serviceAccountName: pipeline pipelineRef: name: build-and-deploy params: - name: deployment-name value: $(tt.params.git-repo-name) - name: git-url value: $(tt.params.git-repo-url) - name: git-revision value: $(tt.params.git-revision) - name: IMAGE value: image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/$(tt.params.git-repo-name) workspaces: - name: shared-workspace volumeClaimTemplate: spec: accessModes: - ReadWriteOnce resources: requests: storage: 500Mi
模板指定一个卷声明模板,用于创建用于为工作空间定义存储卷的持久性卷声明。因此,您不需要创建持久性卷声明来提供数据存储。
创建
TriggerTemplate
资源:$ oc create -f <triggertemplate-yaml-file-name.yaml>
另外,您还可以从
pipelines-tutorial
Git 仓库直接创建TriggerTemplate
资源:$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/pipelines-1.5/03_triggers/02_template.yaml
复制以下
Trigger
YAML 示例文件的内容并保存:apiVersion: triggers.tekton.dev/v1alpha1 kind: Trigger metadata: name: vote-trigger spec: serviceAccountName: pipeline bindings: - ref: vote-app template: ref: vote-app
创建
Trigger
资源:$ oc create -f <trigger-yaml-file-name.yaml>
另外,您还可以直接从
pipelines-tutorial
Git 仓库创建Trigger
资源:$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/pipelines-1.5/03_triggers/03_trigger.yaml
复制以下
EventListener
YAML 示例文件的内容并保存:apiVersion: triggers.tekton.dev/v1alpha1 kind: EventListener metadata: name: vote-app spec: serviceAccountName: pipeline triggers: - triggerRef: vote-trigger
或者,如果您还没有定义触发器自定义资源,将绑定和模板规格添加到
EventListener
YAML 文件中,而不是引用触发器的名称:apiVersion: triggers.tekton.dev/v1alpha1 kind: EventListener metadata: name: vote-app spec: serviceAccountName: pipeline triggers: - bindings: - ref: vote-app template: ref: vote-app
通过执行以下步骤来创建
EventListener
资源:使用安全 HTTPS 连接创建
EventListener
资源:添加一个标签,在 Eventlistener 资源中启用安全
HTTPS
连接:$ oc label namespace <ns-name> operator.tekton.dev/enable-annotation=enabled
创建
EventListener
资源:$ oc create -f <eventlistener-yaml-file-name.yaml>
或者,您可以直接从
pipelines-tutorial
Git 仓库创建EvenListener
资源:$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/pipelines-1.5/03_triggers/04_event_listener.yaml
使用重新加密 TLS 终止创建路由:
$ oc create route reencrypt --service=<svc-name> --cert=tls.crt --key=tls.key --ca-cert=ca.crt --hostname=<hostname>
另外,您可以创建一个重新加密 TLS 终止 YAML 文件,以创建安全路由。
安全路由重新加密 TLS 终止 YAML 示例
apiVersion: route.openshift.io/v1 kind: Route metadata: name: route-passthrough-secured 1 spec: host: <hostname> to: kind: Service name: frontend 2 tls: termination: reencrypt 3 key: [as in edge termination] certificate: [as in edge termination] caCertificate: [as in edge termination] destinationCACertificate: |- 4 -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE-----
如需了解更多选项,请参阅
oc create route reencrypt --help
。
使用不安全的 HTTP 连接创建
EventListener
资源:-
创建
EventListener
资源。 将
EventListener
服务公开为 OpenShift Container Platform 路由,使其可以被公开访问:$ oc expose svc el-vote-app
-
创建
4.5.8. 创建 Webhook
Webhook 是事件监听程序在存储库中配置事件时接收到的 HTTP POST 信息。然后,事件有效负载映射到触发器绑定,并由触发器模板处理。触发器模板最终启动一个或多个管道运行,从而创建并部署 Kubernetes 资源。
在本小节中,您将在 Git 存储库 pipelines-vote-ui
和 pipelines-vote-api
的副本中配置 webhook URL。这个 URL 指向公开访问的 EventListener
服务路由。
添加 Webhook 需要对该存储库有管理特权。如果您没有对库的管理权限,请联络您的系统管理员来添加 webhook。
流程
获取 Webhook URL:
对于安全 HTTPS 连接:
$ echo "URL: $(oc get route el-vote-app --template='https://{{.spec.host}}')"
对于 HTTP(不安全)连接:
$ echo "URL: $(oc get route el-vote-app --template='http://{{.spec.host}}')"
记录下输出中的 URL。
在前端存储库中手动配置 Webhook:
-
在浏览器中打开前端 Git 存储库
pipelines-vote-ui
。 -
点 Settings
Webhooks Add Webhook 在 Webhooks/Add Webhook 页面中:
- 在 Payload URL 字段中输入第 1 步中的 webhook URL
- 为 Content type 选择 application/json
- 在 Secret 字段中指定 secret
- 确定选择了 Just the push event
- 选择 Active
- 点击 Add webhook。
-
在浏览器中打开前端 Git 存储库
-
重复步骤 2 来使用后端存储库
pipelines-vote-api
。
4.5.9. 触发一个管道运行
每当 Git 仓库中发生 push
事件时,配置的 Webhook 会将事件有效负载发送到公开的 EventListener
服务路由。应用程序的 EventListener
服务处理有效负载,并将其传递给相关的 TriggerBinding
和 TriggerTemplate
资源对。TriggerBinding
资源提取参数,TriggerTemplate
资源使用这些参数并指定必须创建资源的方式。这可能会重建并重新部署应用程序。
在本小节中,您将把一个空的提交推送到前端 pipelines-vote-ui
存储库,该存储库将触发管道运行。
流程
在终端中,克隆 fork 的 Git 存储库
pipelines-vote-ui
:$ git clone git@github.com:<your GitHub ID>/pipelines-vote-ui.git -b pipelines-1.5
推送空提交:
$ git commit -m "empty-commit" --allow-empty && git push origin pipelines-1.5
检查管道运行是否已触发:
$ tkn pipelinerun list
请注意,一个新的管道运行被启动。
4.5.10. 其他资源
- 如需了解更多频道在 Developer 视角的信息,请参阅在 Developer 视角中使用频道小节中的内容。
- 要了解更多有关安全性上下文约束(SCC)的信息,请参阅 管理安全性上下文约束部分。
- 如需有关可重复使用的任务的更多示例,请参阅 OpenShift Catalog 仓库。另外,您还可以在 Tekton 项目中看到 Tekton Catalog。
- 有关重新加密 TLS 终止的详情,请参阅重新加密终止。
- 有关安全路由的详情,请参阅安全路由部分。