搜索

4.5. 为使用 OpenShift Pipelines 的应用程序创建 CI/CD 解决方案

download PDF

使用 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-manifestsupdate-deployment 任务在 pipelines-tutorial Git 存储库中。

4.5.1. 先决条件

4.5.2. 创建项目并检查管道服务帐户

流程

  1. 登录您的 OpenShift Container Platform 集群:

    $ oc login -u <login> -p <password> https://openshift.example.com:6443
  2. 为示例应用程序创建一个项目。在本例中,创建 pipelines-tutorial 项目:

    $ oc new-project pipelines-tutorial
    注意

    如果您使用其他名称创建项目,请确定使用您的项目名称更新示例中使用的资源 URL。

  3. 查看 pipeline 服务帐户:

    Red Hat OpenShift Pipelines Operator 添加并配置一个名为 pipeline 的服务帐户,该帐户有足够的权限来构建和推送镜像。PipelineRun 对象使用此服务帐户。

    $ oc get serviceaccount pipeline

4.5.3. 创建管道任务

流程

  1. pipelines-tutorial 存储库安装 apply-manifestsupdate-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
  2. 使用 tkn task list 命令列出您创建的任务:

    $ tkn task list

    输出会确认创建了 apply-manifestsupdate-deployment 任务:

    NAME                DESCRIPTION   AGE
    apply-manifests                   1 minute ago
    update-deployment                 48 seconds ago
  3. 使用 tkn clustertasks list 命令列出由 Operator 安装的额外集群任务,如 buildahs2i-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 流,由要执行的任务定义。它被设计为在多个应用程序和环境中通用且可重复使用。

管道指定任务如何使用 fromrunAfter 参数相互交互以及它们执行的顺序。它使用 workspaces 字段指定管道中每个任务在执行过程中所需的一个或多个卷。

在本小节中,您将创建一个管道,从 GitHub 获取应用程序的源代码,然后在 OpenShift Container Platform 上构建和部署应用程序。

管道为后端应用程序 pipelines-vote-api 和前端应用程序 pipelines-vote-ui 执行以下任务:

  • 通过引用 git-urlgit-revision 参数,从 Git 存储库中克隆应用程序的源代码。
  • 使用 buildah 集群任务构建容器镜像。
  • 通过引用 image 参数将镜像推送到内部 镜像 registry。
  • 通过使用 apply-manifestsupdate-deployment 任务在 OpenShift Container Platform 上部署新镜像。

流程

  1. 复制以下管道 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 添加。

  2. 创建管道:

    $ 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
  3. 使用 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 中镜像相应的构建器镜像。

流程

  1. 为前端接口 pipelines-vote-ui 从 mirror registry 中镜像构建器镜像。

    1. 验证所需镜像标签没有导入:

      $ 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
      
      [...]

    2. 将支持的镜像标签镜像到私有 registry:

      $ oc image mirror registry.redhat.io/ubi8/python-38:latest <mirror-registry>:<port>/ubi8/python-38
    3. 导入镜像:

      $ oc tag <mirror-registry>:<port>/ubi8/python-38 python:latest --scheduled -n openshift

      您必须定期重新导入镜像。--scheduled 标志启用镜像自动重新导入。

    4. 验证带有指定标签的镜像已被导入:

      $ 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
      
      [...]

  2. 为后端接口 pipelines-vote-api 从 mirror registry 中镜像构建器镜像。

    1. 验证所需镜像标签没有导入:

      $ 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
      
      [...]

    2. 将支持的镜像标签镜像到私有 registry:

      $ oc image mirror registry.redhat.io/ubi8/go-toolset:1.14.7 <mirror-registry>:<port>/ubi8/go-toolset
    3. 导入镜像:

      $ oc tag <mirror-registry>:<port>/ubi8/go-toolset golang:latest --scheduled -n openshift

      您必须定期重新导入镜像。--scheduled 标志启用镜像自动重新导入。

    4. 验证带有指定标签的镜像已被导入:

      $ 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
      
      [...]

  3. cli 的镜像 registry 中镜像构建器镜像。

    1. 验证所需镜像标签没有导入:

      $ 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
      
      [...]

    2. 将支持的镜像标签镜像到私有 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
    3. 导入镜像:

      $ oc tag <mirror-registry>:<port>/openshift-release-dev/ocp-v4.0-art-dev cli:latest --scheduled -n openshift

      您必须定期重新导入镜像。--scheduled 标志启用镜像自动重新导入。

    4. 验证带有指定标签的镜像已被导入:

      $ 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 资源。

流程

  1. 启动后端应用程序的管道:

    $ 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

    上一命令使用卷声明模板,该模板为管道执行创建持久性卷声明。

  2. 要跟踪管道运行的进度,请输入以下命令:

    $ tkn pipelinerun logs <pipelinerun_id> -f

    上述命令中的 <pipelinerun_id> 是上一命令输出返回的 PipelineRun 的 ID。

  3. 启动前端应用程序的管道:

    $ 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
  4. 要跟踪管道运行的进度,请输入以下命令:

    $ tkn pipelinerun logs <pipelinerun_id> -f

    上述命令中的 <pipelinerun_id> 是上一命令输出返回的 PipelineRun 的 ID。

  5. 几分钟后,使用 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
  6. 获取应用程序路由:

    $ oc get route pipelines-vote-ui --template='http://{{.spec.host}}'

    记录上一个命令的输出。您可以使用此路由来访问应用程序。

  7. 要重新运行最后的管道运行,请使用上一管道的管道资源和服务帐户运行:

    $ tkn pipeline start build-and-deploy --last

4.5.7. 在管道中添加触发器

触发器(Trigger)使 Pipelines 可以响应外部 GitHub 事件,如推送事件和拉取请求。在为应用程序组装并启动管道后,添加 TriggerBindingTriggerTemplateTriggerEventListener 资源来捕获 GitHub 事件。

流程

  1. 复制以下 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)
  2. 创建 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
  3. 复制以下 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

    模板指定一个卷声明模板,用于创建用于为工作空间定义存储卷的持久性卷声明。因此,您不需要创建持久性卷声明来提供数据存储。

  4. 创建 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
  5. 复制以下 Trigger YAML 示例文件的内容并保存:

    apiVersion: triggers.tekton.dev/v1alpha1
    kind: Trigger
    metadata:
      name: vote-trigger
    spec:
      serviceAccountName: pipeline
      bindings:
        - ref: vote-app
      template:
        ref: vote-app
  6. 创建 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
  7. 复制以下 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
  8. 通过执行以下步骤来创建 EventListener 资源:

    • 使用安全 HTTPS 连接创建 EventListener 资源:

      1. 添加一个标签,在 Eventlistener 资源中启用安全 HTTPS 连接:

        $ oc label namespace <ns-name> operator.tekton.dev/enable-annotation=enabled
      2. 创建 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
      3. 使用重新加密 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-----

        1 2
        对象的名称,长度限于 63 个字符。
        3
        termination 字段设置为 reencrypt。这是唯一需要 tls 的字段。
        4
        重新加密需要。destinationCACertificate 指定用来验证端点证书的 CA 证书,保护从路由器到目标 pod 的连接。如果服务使用服务签名证书,或者管理员为路由器指定默认 CA 证书,且服务有由该 CA 签名的证书,则可以省略此字段。

        如需了解更多选项,请参阅 oc create route reencrypt --help

    • 使用不安全的 HTTP 连接创建 EventListener 资源:

      1. 创建 EventListener 资源。
      2. EventListener 服务公开为 OpenShift Container Platform 路由,使其可以被公开访问:

        $ oc expose svc el-vote-app

4.5.8. 创建 Webhook

Webhook 是事件监听程序在存储库中配置事件时接收到的 HTTP POST 信息。然后,事件有效负载映射到触发器绑定,并由触发器模板处理。触发器模板最终启动一个或多个管道运行,从而创建并部署 Kubernetes 资源。

在本小节中,您将在 Git 存储库 pipelines-vote-uipipelines-vote-api 的副本中配置 webhook URL。这个 URL 指向公开访问的 EventListener 服务路由。

注意

添加 Webhook 需要对该存储库有管理特权。如果您没有对库的管理权限,请联络您的系统管理员来添加 webhook。

流程

  1. 获取 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。

  2. 在前端存储库中手动配置 Webhook:

    1. 在浏览器中打开前端 Git 存储库 pipelines-vote-ui
    2. Settings Webhooks Add Webhook
    3. Webhooks/Add Webhook 页面中:

      1. Payload URL 字段中输入第 1 步中的 webhook URL
      2. Content type 选择 application/json
      3. Secret 字段中指定 secret
      4. 确定选择了 Just the push event
      5. 选择 Active
      6. 点击 Add webhook
  3. 重复步骤 2 来使用后端存储库 pipelines-vote-api

4.5.9. 触发一个管道运行

每当 Git 仓库中发生 push 事件时,配置的 Webhook 会将事件有效负载发送到公开的 EventListener 服务路由。应用程序的 EventListener 服务处理有效负载,并将其传递给相关的 TriggerBindingTriggerTemplate 资源对。TriggerBinding 资源提取参数,TriggerTemplate 资源使用这些参数并指定必须创建资源的方式。这可能会重建并重新部署应用程序。

在本小节中,您将把一个空的提交推送到前端 pipelines-vote-ui 存储库,该存储库将触发管道运行。

流程

  1. 在终端中,克隆 fork 的 Git 存储库 pipelines-vote-ui

    $ git clone git@github.com:<your GitHub ID>/pipelines-vote-ui.git -b pipelines-1.5
  2. 推送空提交:

    $ git commit -m "empty-commit" --allow-empty && git push origin pipelines-1.5
  3. 检查管道运行是否已触发:

    $ tkn pipelinerun list

    请注意,一个新的管道运行被启动。

4.5.10. 其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.