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/”,其中是当前Workspace的名称 ?在Task中可用的workspace变量   ? $(workspaces..path):由指定的Workspace挂载的路径,对于可选且TaskRun未声明时,其值为空;   ? $(workspaces..bound):其值为true或false,用于标识指定的Workspace是已经绑定;     ◆对于optional为false的Workspace,该变量的值将始终为true;   ? $(workspaces..claim):由标示的Workspace所使用的PVC的名称     ◆对于非PVC类型的存储卷,该变量值为空   ? $(workspaces..volume):由标示的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/),而后由同一Task中后面的Step引用,或者由后面其它Task中的Step引用       ? 文件名也能够以变量形式引用,例如“$(results..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  #启动中

 

相关