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

 

 

 

posted @ 2022-03-23 20:37  gg888666  阅读(332)  评论(0编辑  收藏  举报