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

文章目录

  • 需求场景
  • 什么是Workspaces
  • 使用Workspace
    • 在Maven Task中使用Workspace
    • 定义Pipeline对象
    • 定义PVC对象
    • 运行Pipeline
  • 参考

需求场景

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

在Maven Task中使用Workspace

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

定义Pipeline对象

  1. 在OpenShift中创建以下Pipeline对象,其中使用了名为local-maven-repo的workspace。
apiVersion: tekton.dev/v1alpha1
kind: Pipeline
metadata:
  name: maven-build
spec:
  workspaces:
  - name: local-maven-repo
  resources:
  - name: app-git
    type: git
  tasks:
  - name: build
    taskRef:
      name: mvn
    resources:
      inputs:
      - name: source
        resource: app-git
    params:
    - name: GOALS
      value: ["package"]
    workspaces:
    - name: maven-repo
      workspace: local-maven-repo
  - name: int-test
    taskRef:
      name: mvn
    runAfter: ["build"]
    resources:
      inputs:
      - name: source
        resource: app-git
    params:
    - name: GOALS
      value: ["verify"]
    workspaces:
    - name: maven-repo
      workspace: local-maven-repo
  - name: gen-report
    taskRef:
      name: mvn
    runAfter: ["build"]
    resources:
      inputs:
      - name: source
        resource: app-git
    params:
    - name: GOALS
      value: ["site"] 
    workspaces:
    - name: maven-repo
      workspace: local-maven-repo

定义PVC对象

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

运行Pipeline

  1. 创建以下PipelineRun对象,运行Pipeline。其中为名为local-maven-repo的workspace使用了名为maven-repo-pvc的PVC。
apiVersion: tekton.dev/v1alpha1
kind: PipelineRun
metadata:
  generateName: petclinic-run-
spec:
  pipelineRef:
    name: maven-build
  resources:
  -- name: app-git
    resourceSpec:
      type: git
      params:
        - name: url
          value: https://github.com/spring-projects/spring-petclinic
  workspaces:
  -- name: local-maven-repo
    persistentVolumeClaim:
      claimName: maven-repo-pvc
  1. 记录其运行完成后的时间,34分31秒。
    OpenShift 4 Tekton (5) - 使用Workspaces为包含Maven Build的Pipeline提速_第1张图片
  2. 再次执行本步骤的(1)操作,再次运行Pipeline。这次Pipeline只用了4分44秒就完成了。
    OpenShift 4 Tekton (5) - 使用Workspaces为包含Maven Build的Pipeline提速_第2张图片

参考

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

你可能感兴趣的:(Dev,pipeline,Tekton)