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
    ◼ 清理资源
        ◆清理此前任务遗留的资源
        ◆释放此前的任务运行时占用的资源
    ◼ 终止任务执行
    ◼ ……

 

posted @ 2023-07-11 09:28  しみずよしだ  阅读(69)  评论(0)    收藏  举报