OpenShift 4 Tekton (4) - 使用 Workspaces 为包含 Maven Build 的 Pipeline 提速

21 篇文章 1 订阅
7 篇文章 0 订阅

OpenShift 4.x HOL教程汇总
说明:本文已经在OpenShift 4.10环境中验证

需求场景

Tekton是从Knative的Build独立出来的一个开源项目,它能够以Kubernetes原生的方式创建在任何Kubernetes上运行的CI/CD Pipeline。Tekton通过引入一系列CRD(自定义资源定义),如Pipeline、Task和ClusterTask等。
在运行Tekton Pipeline的时候,如果能在任务之间共享工件就能缩短运行耗时。本位将在Java构建中使用工作空间来缓存Maven依赖项,以消除每次构建时下载依赖项的需求。

什么是 Workspaces

Tekton Pipeline中的Workspace指的是Pipeline在运行时需要的共享卷的声明。它们类似于卷,只是不提供实际的卷,而只是声明意图。在Pipeline定义中,Workspaces可以作为共享卷传递给相关Task。当同一个Workspaces提供给多个Task时,这些Task可以从完全相同的卷中读写,并根据需要共享文件和工件。尽管以上的“卷”指的是用于缓存Maven依赖关系的持久化卷,但它也可以是ConfigMap,或者是传递给Pipeline运行的Secret,这些资源都可以在Task之间共享。

Tekton的Workspace可用于以下目的:

  1. 输入和/或输出的储存。
  2. 在任务之间共享数据。
  3. 在Secret中安全凭证的装载点。
  4. 在ConfigMaps中保存的配置的挂载点。
  5. 一个组织共享的通用工具的装载点。
  6. 缓存构建工件,加快Pipeline作业的执行速度。

在Task中可以为多个Steps指定Workspace使用的存储。在运行时,TaskRun会提供针对性的“卷”并将其挂在到Workspace。在Pipeline中可以用Workspace为多个Tasks指定共享的存储。 例如,Task A将一个源码库克隆到一个Workspace上,而Task B编译在该Workspace中找到的代码。Pipeline的工作是确保这两个Task所使用的Workspace是相同的,更重要的是确保他们访问Workspace的顺序是正确的。

使用 Workspace

在 Task 中使用 Workspace

  1. 首先在OpenShift中创建名为tekton-maven的项目。
$ oc new-project tekton-maven
  1. 然后根据以下 YAML 创建 Task 对象。这个 Task 中定义了一个名为 maven-repo 的 Workspace。这个 Workspace 规定,每当这个 Task 要运行时需要挂载一个卷,用来作为本地的 Maven 仓库。然后将这个 Workspace 的路径传递给 Maven 命令,以便作为本地 Maven 仓库。
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: mvn
spec:
  params:
    - default:
        - package
      description: The Maven goals to run
      name: GOALS
      type: array
  resources:
    inputs:
      - name: source
        type: git
  steps:
    - args:
        - '-Dmaven.repo.local=$(workspaces.maven-repo.path)'
        - $(inputs.params.GOALS)
      command:
        - /usr/bin/mvn
      image: maven:3.6.0-jdk-8-slim
      name: mvn
      workingDir: /workspace/source
  workspaces:
    - name: maven-repo

创建 Pipeline 和 PipelineResource 对象

  1. 在 OpenShift 中创建以下 Pipeline 对象,其中使用了名为 local-maven-repo 的 workspace。
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: maven-build
spec:
  resources:
    - name: app-git
      type: git
  tasks:
    - name: build
      params:
        - name: GOALS
          value:
            - package
      resources:
        inputs:
          - name: source
            resource: app-git
      taskRef:
        kind: Task
        name: mvn
      workspaces:
        - name: maven-repo
          workspace: local-maven-repo
    - name: int-test
      params:
        - name: GOALS
          value:
            - verify
      resources:
        inputs:
          - name: source
            resource: app-git
      runAfter:
        - build
      taskRef:
        kind: Task
        name: mvn
      workspaces:
        - name: maven-repo
          workspace: local-maven-repo
  workspaces:
    - name: local-maven-repo
  1. 在 OpenShift 中创建以下 PipelineResource 对象,其中定义了应用代码所在的 Git Repository。
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
  name: helloworld-git
  namespace: tekton-maven
spec:
  params:
    - name: url
      value: 'https://github.com/liuxiaoyu-git/springboot-helloworld'
  type: git

创建 PVC 对象

  1. 在OpenShift中创建以下PVC对象。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: maven-repo-pvc
spec:
  resources:
    requests:
      storage: 2Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain 

运行 Pipeline

  1. 进入名为 maven-build 的管道,然后在 “操作” 中选择 “启动”。在 “启动管道” 窗口中为工作区选择名为 maven-repo-pvc持久卷声明,然后点击 “开始”。在这里插入图片描述
  2. 记录其运行完成后的时间,34分31秒。
    在这里插入图片描述
  3. 再次执行本步骤的(1)操作,再次运行 Pipeline。这次 Pipeline 只用了 4分44秒就完成了。
    在这里插入图片描述

参考

https://developers.redhat.com/blog/2020/02/26/speed-up-maven-builds-in-tekton-pipelines/
https://github.com/tektoncd/pipeline/blob/master/docs/workspaces.md
https://github.com/siamaksade/tekton-pipelines-maven-demo

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值