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/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/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 #启动中