Workspace-pipline高级语法
一,Workspace
Workspace是什么?
◼ Workspace用于为Task中的各Step提供工作目录,基于该Task运行的TaskRun需要在运行时提供该目录
◼ TaskRun的实际运行形式为Pod,因而Workspace对应的实际组件为Pod上的Volume
◆ConfigMap和Secret:只读式的Workspace
◆PersistentVolumeClaim:支持跨Task共享数据的Workspace
⚫ 静态预配
⚫ 动态预配:基于VolumeClaimTemplate动态创建
◆emptyDir:临时工作目录,用后即弃
Workspace的功用
◼ 跨Task共享数据
◆定义在Pipeline上的Workspace
◼ 借助于Secrets加载机密凭据
◼ 借助于ConfigMap加载配置数据
◼ 持久化存储数据
◼ 为Task提供缓存以加速构建过程
◆定义在Task上的Workspace
◆也可用于与Sidecar共享数据
另外,Task上也可以直接使用volumes定义要使用的存储卷,但其管理和使用方式与Workspace不同;
在Task配置Workspace
◼ 定义在spec.wordspaces字段中
◼ 支持嵌套如下字段
◆name:必选字段,该Workspace的唯一标识符
◆description:描述信息,通常标明其使用目的
◆readOnly:是否为只读,默认为false
◆optional:是否为可选,默认为false
◆mountPath:在各Step中的挂载路径,默认为“/workspace/<name>”,其中<name>是当前Workspace的名称
在Task中可用的workspace变量
◼ $(workspaces.<name>.path):由<name>指定的Workspace挂载的路径,对于可选且TaskRun未声明时,其值为空;
◼ $(workspaces.<name>.bound):其值为true或false,用于标识指定的Workspace是已经绑定;
◆对于optional为false的Workspace,该变量的值将始终为true;
◼ $(workspaces.<name>.claim):由<name>标示的Workspace所使用的PVC的名称
◆对于非PVC类型的存储卷,该变量值为空
◼ $(workspaces.<name>.volume):由<name>标示的Workspace所使用的存储卷的名称
root@master01:~/tekton-and-argocd-in-practise/03-tekton-advanced# cat 01-task-workspace-demo.yaml apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: workspace-demo spec: params: - name: target type: string default: MageEdu steps: - name: write-message image: alpine:3.15 script: | #!/bin/sh set -xe if [ "$(workspaces.messages.bound)" == "true" ] ; then echo "Hello $(params.target)" > $(workspaces.messages.path)/message cat $(workspaces.messages.path)/message fi echo "Mount Path: $(workspaces.messages.path)" echo "Volume Name: $(workspaces.messages.volume)" workspaces: - name: messages description: | The folder where we write the message to. If no workspace is provided then the message will not be written. optional: true mountPath: /data
root@master01:~/tekton-and-argocd-in-practise/03-tekton-advanced# tkn task list NAME DESCRIPTION AGE workspace-demo 7 seconds ag
root@master01:~/tekton-and-argocd-in-practise/03-tekton-advanced# tkn task start workspace-demo --showlog -p target="chuan" -w name=messages,emptyDir="" TaskRun started: workspace-demo-run-l29fg Waiting for logs to be available... [write-message] + '[' true '==' true ] [write-message] + echo 'Hello chuan' [write-message] + cat /data/message [write-message] Hello chuan [write-message] Mount Path: /data [write-message] Volume Name: ws-sqfb7 [write-message] + echo 'Mount Path: /data' [write-message] + echo 'Volume Name: ws-sqfb7'
二,Taskrun
root@master01:~/tekton-and-argocd-in-practise/03-tekton-advanced# kubectl apply -f task-source-to-package task.tekton.dev/source-to-package created root@master01:~/tekton-and-argocd-in-practise/03-tekton-advanced# cat task-source-to-package apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: source-to-package spec: params: - name: git-repo-url type: string workspaces: - name: source description: code storage steps: - name: fetch-from-source image: alpine/git:v2.32.0 script: | git clone $(params.git-repo-url) $(workspaces.source.path)/source - name: build-to-package image: maven:3.8-openjdk-11-slim workingDir: $(workspaces.source.path)/source script: | mvn clean install
tkn task start source-to-package --showlog -p git-repo-url='https://gitee.com/mageedu/spring-boot-helloWorld.git' -w name=source,emptyDir=""
三,pipeline高级语法
Tekton系统组件
Tekton Pipelines
◼ Tekton最核心的组件,由一组CRD和相关的Operator、Webhook共同组成
◼ 需要部署并运行于Kubernetes集群之上,作为Kubernetes的集群扩展
Tekton Triggers
◼ 触发器,可触发Pipeline的实例化;可选组件;
Tekton CLI
◼ 命令行客户端工具,用于与Tekton进行交互;可选组件;
Tekton Dashboard
◼ Tekton Pipelines的基于Web的图形界面;可选组件;
Tekton Catalog
◼ 由社区贡献的Tekton构建块(building blocks,例如Tasks和Pipelines等),用户可直接使用
Tekton Hub
◼ 用于访问Catalog的图形界面,基于Web
Tekton Operator
Tekton Pipelines的Pipeline模型中存在三个核心术语:Step、Task和Pipeline
Step
◼ CI/CD工作流中的一个具体操作,例如Python web app的单元测试,或者是Java程序的编译操作
◼ 每个step都会通过一个特定Container(Pod中)运行
Task
◼ 由一组Step组成的序列,按照定义的顺序依次运行于同一个Pod内的不同容器中
◼ 可共享一组环境变量,以及存储卷
Pipeline
◼ 由一组Task组成的集合,可按照定义以不同的方式运行:串行、并行和DAG
◼ 一个Task的输出可由其后Task引用
TaskRun and PipelineRun
◼ TaskRun代表Task的一次具体执行过程,类似地,PipelineRun代表Pipeline的一次具体执行过程
◼ 具体运行时,Task和Pipeline连接至配置的Resource之上,进而创建出TaskRun和PipelineRun
◼ 它们既可由用户手动创建,也可由Trigger自动触发
注意:实际上,PipelineRun自身并不执行任何具体任务,它是由按特定顺序运行的TaskRun组合而成
Parameters是使得Task及Pipeline资源定义出的“模板”更加具有通用性的关键要素之一
具体到使用逻辑,例如
◼ 大多数CI Pipeline的起始位置都是从Git仓库中克隆代码,这通常会在定义一个Task,通过某个具体的Step进行
◼ 显然,如若将git仓库的url硬编码在Task及其Step中,将使得该Task失去了绝大部分的通用性
◼ 于是,我们可以在Task中,将操作的目标(包括数据)定义为参数(Parameter),而在Step的代码中引用这些参数作为操作对象
◼ TaskRun在针对该Task进行实例化时,通过向引用的Task中定义参数传值完成实例化
实际应用中,我们一般是通过Pipeline基于Task来创建TaskRun对象的,而非直接创建TaskRun
◼ Pipeline可引用已有的Task,或者直接内嵌专有的Task代码,其目标在于创建TaskRun
◼ 为了完成实例化,Pipeline需要向Task的Parameter进行赋值,但其值,也可以是对Pipeline级别的某个Parameter的引用
◼ 而对Pipeline上的Parameter的赋值,则由PipelineRun进行
TaskRun和Step的运行
每个TaskRun运行于一个独立的Pod中,而其内部的各Step则分别运行于一个Container中
Tekton Pipelines会在每个Step相关的容器中注入一个entrypoint程序,该程序会在系统就绪后启动并运行用户指定要运行的命令。
Tekton Pipelines使用KubernetesAnnotations跟踪Pipeline的状态,而这些Annotations通过DownwardAPI以文件的形式投射进每个Step容器中。由Tekton Pipelines注入到容器中的entrypoint程序负责密切监视这些投射进当前容器中的文件,并在某个特定Annotation作为文件出现时才启动用户指定的命令。例如,对于一个包含多个Step的某Task来说,后一个Step容器会在其annotation报告前一个容器成功执行完成后才会开始运行entrypoint。
Pipeline和Task上的数据共享
Pipeline上可能会存在数据共享的需要,例如
◼ 一个Task的多个Step之间,靠前的Step生成的结果,需要由后面某个Step引用
◼ 一个Pipeline的多个Task之间,前面的Task处理的结果,需要由后面的某个Task引用
常见的解决方案有两种
◼ Results
◆由Task声明
◆它将Task中Step生成的结果保存于临时文件中(/tekton/results/<NAME>),而后由同一Task中后面的Step引用,或者由后面其它Task中的Step引用
⚫ 文件名也能够以变量形式引用,例如“$(results.<NAME>.path)”
◆由Tekton的Results API负责实现,仅可用于共享小于4096字节规模的小数据片
◼ Workspace
◆由Task声明的,且需要由TaskRun在运行时提供的文件系统
◆通常对应于Kubernetes上的ConfigMap、Secret、emptyDir、静态PVC类型的卷,或者是VolumeClaimTemplate动态请求的PVC
◆emptyDir的生命周期与Pod相同,因此仅能在一个TaskRun的各Step间共享数据
◆若要跨Task共享数据,则需要使用PVC
root@master01:~/tekton-and-argocd-in-practise/03-tekton-advanced# cat pipeline-source-to-package apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: source-to-package spec: params: - name: git-repo-url type: string workspaces: - name: source description: code storage steps: - name: fetch-from-source image: alpine/git:v2.32.0 script: | git clone $(params.git-repo-url) $(workspaces.source.path)/source - name: build-to-package image: maven:3.8-openjdk-11-slim workingDir: $(workspaces.source.path)/source script: | mvn clean install --- apiVersion: tekton.dev/v1beta1 kind: Pipeline metadata: name: s2p-demo spec: params: - name: git-repo-url type: string workspaces: - name: source tasks: - name: source-to-package params: - name: git-repo-url value: $(params.git-repo-url) workspaces: - name: source #自定义 workspace: source #引用 taskRef: name: source-to-package
启动 s2p-demo pipeline
#tkn pipeline start s2p-demo --showlog -p git-repo-url='https://gitee.com/mageedu/spring-boot-helloWorld.git' -w name=source,emptyDir=""
root@master01:~/tekton-and-argocd-in-practise/03-tekton-advanced# tkn pipeline list NAME AGE LAST RUN STARTED DURATION STATUS pipeline-demo 9 hours ago pipeline-demo-run-zhgc8 9 hours ago 12 seconds Succeeded pipeline-with-params 8 hours ago pipeline-with-params-run-dt2hc 8 hours ago 10 seconds Succeeded s2p-demo 2 hours ago s2p-demo-run-4snht 1 minute ago --- Running #启动中