Knative - Volume/Results/Pipeline 高级用法【十九】
在Task和Step上使用Volume
#Volume可显式定义要在Task和Step上使用的存储卷
◼ 例如,为Maven指定Cache
◆将下载的模块保存于指定的Volume上,即可由相关的Task和Step重复使用
◆即便是不同的Pipeline,也能够使用同一个基于PVC等支持多个Pod访问的存储卷的maven cache
◼ Volume的定义和使用
◆在Task的spec.volumes字段中定义存储卷列表
◆在Step中使用volumeMounts进行引用
◼ 其使用方式与在Pod和Container上的方式相同
下面示例即为使用了Volume的task/build-package的定义
◼ 提示:相关的PVC资源需要事先定义
◼ 另外,基于该Pipeline多次运行的PipelineRun便可通过该Volume使用maven cahe;
# volumes:
# - name: m2
# persistentVolumeClaim:
# claimName: maven-cache
# volumeMounts:
# - name: m2
# mountPath: /root/.m2
[root@xianchaomaster1 03-tekton-advanced]# cat 06-pipeline-source-to-package.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: maven-cache
spec:
storageClassName: nfs-csi
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
---
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: source-2-package
spec:
params:
- name: git-url
type: string
workspaces:
- name: codebase
tasks:
- name: fetch-from-source
params:
- name: url
value: $(params.git-url)
taskSpec:
workspaces:
- name: source
params:
- name: url
steps:
- name: git-clone
image: alpine/git:v2.36.1
script: git clone -v $(params.url) $(workspaces.source.path)/source
workspaces:
- name: source
workspace: codebase
- name: build-package
runAfter:
- fetch-from-source
taskSpec:
steps:
- name: build
image: maven:3.8-openjdk-11-slim
workingDir: $(workspaces.source.path)/source
volumeMounts:
- name: m2
mountPath: /root/.m2
script: mvn clean install
workspaces:
- name: source
volumes:
- name: m2
persistentVolumeClaim:
claimName: maven-cache
workspaces:
- name: source
workspace: codebase
---
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
name: source-2-package-run-002
spec:
pipelineRef:
name: source-2-package
params:
- name: git-url
#value: https://gitee.com/mageedu/spring-boot-helloWorld.git
value: http://code.gitlab.svc.cluster.local/root/spring-boot-helloWorld.git
workspaces:
- name: codebase
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nfs-csi

使用Results 进行数据传递
#Results简介
◼ 在Pipeline的Task之间使用同一个共享的Workspace可以完成数据共享,但对于简单的字符串数据的传递,则可以使用Results API完成
◼ Results用于让Task及其Step保存执行结果,并可在同一Pipeline中的后续Task中调用该结果在Task中使用Results
◼ 以列表形式定义在spec.results字段中
◼ Task将会为每个results条目自动创建一个文件以进行保存,这些文件统一放置于/tektons/results目录中
◼ 每个results条目的相关值(value)需要在Step中进行生成并保存,且Task不会对相关数据进行任何多余的操作
◼ 在Step代码中引用results条目的便捷格式为“$(results.<resultName>.path)”,这样可以避免硬编码
◆注意: $(results.<resultName>.path)”会被替换为文件路径,获取结果值需要获取该文件中保存的内容
#在Task中引用Results时使用的变量
◼ results.<resultName>.path
◼ results['<resultName>'].path 或 results["<resultName>"].path
#在Pipeline中引用Results时使用的变量
◼ tasks.<taskName>.results.<resultName>
◼ tasks.<taskName>.results['<resultName>'] 或 tasks.<taskName>.results["<resultName>"]
#在一个Task中定义了两个Step
◼ 前一个Step生成日期时间
◼ 后一个Step结果应用程序版本号及日期时间生成build ID
◼ build ID将作为后续Task中的镜像文件标签使用
#创建一个results:datetime Step1:将日期保存在results.datetime.path、Step2:读取之前results.datetime.path并且参数输入保存为buildID
#在step中引用同一个task中的results时,变量$(results.datetime.path)会展开为文件名,因而这里使用cat打印其内容;
#另外,在bash中,$()也是命令引用的操作符;
[root@xianchaomaster1 03-tekton-advanced]# cat 07-results-demo.yaml
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: generate-buildid
spec:
params:
- name: version
description: The version of the application
type: string
default: "v0.9"
results:
- name: datetime
description: The current date and time
- name: buildId
description: The build ID
steps:
- name: generate-datetime
image: ikubernetes/admin-box:v1.2
script: |
#!/usr/bin/env bash
datetime=`date +%Y%m%d-%H%M%S`
echo -n ${datetime} | tee $(results.datetime.path)
- name: generate-buildid
image: ikubernetes/admin-box:v1.2
script: |
#!/usr/bin/env bash
buildDatetime=`cat $(results.datetime.path)`
buildId=$(params.version)-${buildDatetime}
echo -n ${buildId} | tee $(results.buildId.path)
[root@xianchaomaster1 03-tekton-advanced]# kubectl apply -f 07-results-demo.yaml
task.tekton.dev/generate-buildid created
[root@xianchaomaster1 03-tekton-advanced]# tkn task start generate-buildid --showlog
? Value for param `version` of type `string`? (Default is `v0.9`) v0.9.1-
TaskRun started: generate-buildid-run-ts5kx
Waiting for logs to be available...
[generate-datetime] 20230711-011400
[generate-buildid] v0.9.1--20230711-011400
Pipeline高级用法
#使用taskRef或taskSpec可将Task添加至Pipeline上,它们以列表形式定义在spec.tasks字段中;对于这些Task的运行,它们允许用户
◼ 使用when表达式来为其添加执行条件
◼ 使用conditions添加限制条件(已弃用)
◼ 使用timeout定义任务超时时长
◼ 使用runAfter定义任务的执行顺序
◼ 定义finally任务,定义一个最终任务
◼ 使用retries定义重试次数
在Pipeline上定义Task的执行方式

在Pipeline上使用When表达式
#When表达式共有三个字段组成
◼ input
◆被评估的内容,支持使用静态值或者变量(Parameters或者Results变量)
◆默认值为空;
◼ operator
◆比较操作符
◆仅支持in或notin两个
◼ values
◆由字符串组成的列表
◆必须定义,且不能使用空值,但允许使用静态值或者变量


在Pipeline上使用Finally Task

#关于finally task
◼ 用于在tasks中的各任务执行结束后运行最后的任务
◼ 其定义格式与tasks字段相似
◼ 支持嵌套定义多个Task
◼ 这些Task上支持使用Parameters和Results
◼ 支持使用When表达式
#常用场景
◼ 发送通知
◆将Pipeline的执行结果通知给相关用户
◆例如右图中的构建和测试的pipeline
◼ 清理资源
◆清理此前任务遗留的资源
◆释放此前的任务运行时占用的资源
◼ 终止任务执行
◼ ……

浙公网安备 33010602011771号