《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可用于以下目的:
- 输入和/或输出的储存。
- 在任务之间共享数据。
- 在Secret中安全凭证的装载点。
- 在ConfigMaps中保存的配置的挂载点。
- 一个组织共享的通用工具的装载点。
- 缓存构建工件,加快Pipeline作业的执行速度。
在Task中可以为多个Steps指定Workspace使用的存储。在运行时,TaskRun会提供针对性的“卷”并将其挂在到Workspace。在Pipeline中可以用Workspace为多个Tasks指定共享的存储。 例如,Task A将一个源码库克隆到一个Workspace上,而Task B编译在该Workspace中找到的代码。Pipeline的工作是确保这两个Task所使用的Workspace是相同的,更重要的是确保他们访问Workspace的顺序是正确的。
使用 Workspace
在 Task 中使用 Workspace
- 首先在OpenShift中创建名为tekton-maven的项目。
$ oc new-project tekton-maven
- 然后根据以下 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 对象
- 在 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
- 在 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 对象
- 在OpenShift中创建以下PVC对象。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: maven-repo-pvc
spec:
resources:
requests:
storage: 2Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
运行 Pipeline
- 进入名为 maven-build 的管道,然后在 “操作” 中选择 “启动”。在 “启动管道” 窗口中为工作区选择名为 maven-repo-pvc 的持久卷声明,然后点击 “开始”。
- 记录其运行完成后的时间,34分31秒。
- 再次执行本步骤的(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