云原生CI/CD:Tektoncd/pipeline之pipelineRun

简介

上一节我们讲过了pipeline,以及pipeline中如何进行与其他资源进行交互。但是pipeline就像个函数,它自己不会运行,要有个调用函数的触发,才能让pipeline开始运行。这个调用就是pipelineRun(同样taskRun也是调用task)。本节着重介绍pipelineRun.

pipelineRun概览

PipelineRun可以实例化并执行pipeline,一个pipeline可以指定1个或者多个tasks以指定顺序执行,而一个pipelineRun则可以执行Pipeline中的task直到所有的Task都执行结束或者执行某个task失败。
注意:pipelineRun会自动的创建taskrun执行执行Pipeline中task,有几个task就有自动创建几个taskRun.

pipelineRun与其他资源的交互

指定目标pipeline

您必须通过引用现有的Pipeline定义,或直接在PipelineRun中嵌入Pipeline定义来指定希望PipelineRun执行的目标Pipeline。
使用pipelineSpec字段来指定已有的pipeline:

spec:
  pipelineRef:
    name: mypipeline

直接在pipelineRun中内嵌一个pipeline定义:

spec:
  pipelineSpec:
    tasks:
    - name: task1
      taskRef:
        name: mytask

也可在内嵌pipeline定义时定义task:

spec:
  pipelineSpec:
    tasks:
    - name: task1
      taskSpec:
        steps:
          ...
指定resource

pipeline需要pipelineResources来提供输入和task的输出。用户必须在PipelineRun的spec部分的resources字段中配置这些资源。resource的配置可以对接tekton的trigger组件用于拉取仓库代码,也可以用于定于github上的仓库代码,还可以用于定义docker 仓库。
用户可以使用resourceRef字段引用PipelineResources:

spec:
  resources:
    - name: source-repo
      resourceRef:
        name: skaffold-git
    - name: web-image
      resourceRef:
        name: skaffold-image-leeroy-web
    - name: app-image
      resourceRef:
        name: skaffold-image-leeroy-app

用户也可以使用resourceSpec字段将PipelineResource定义嵌入PipelineRun中:

spec:
  resources:
    - name: source-repo
      resourceSpec:
        type: git
        params:
          - name: revision
            value: v0.32.0
          - name: url
            value: https://github.com/GoogleContainerTools/skaffold
    - name: web-image
      resourceSpec:
        type: image
        params:
          - name: url
            value: gcr.io/christiewilson-catfactory/leeroy-web
    - name: app-image
      resourceSpec:
        type: image
        params:
          - name: url
            value: gcr.io/christiewilson-catfactory/leeroy-app
指定参数

用户可以指定要在执行期间传递给pipeline的参数,包括pipeline中不同task的同一参数的不同值。举例:

spec:
  params:
  - name: pl-param-x
    value: "100"
  - name: pl-param-y
    value: "500"
指定自定义的ServiceAccount凭据

通过在PipelineRun定义的serviceAccountName字段中指定ServiceAccount对象名称,可以使用一组特定的凭据在PipelineRun中执行Pipeline。如果未明确指定,则PipelineRun创建的TaskRun将使用configmap-defaults ConfigMap中指定的凭据执行。如果未指定此默认值,则TaskRun将使用为目标名称空间设置的默认服务帐户执行。

将ServiceAccount凭据映射到task

如果在指定执行凭据时需要更多粒度,请使用serviceAccounNames字段将特定serviceAccountName值映射到管道中的特定Task。这将覆盖您可能为管道设置的全局serviceAccountName,如上一节所述。
例如,用户指定以下映射:

spec:
  serviceAccountName: sa-1
  serviceAccountNames:
    - taskName: build-task
      serviceAccountName: sa-for-build   # 每个Task都指定一个serviceAccount

对于此pipeline:

kind: Pipeline
spec:
  tasks:
    - name: build-task
      taskRef:
        name: build-push
    - name: test-task
      taskRef:
        name: test

那么test-task将使用sa-1帐户执行, 而build-task将使用sa-for-build执行。

指定workspace

如果管道指定一个或多个工作区,则必须将这些工作区映射到PipelineRun定义中的相应物理卷。例如,可以将PersistentVolumeClaim卷映射到工作区,如下所示:

workspaces:
- name: myworkspace # must match workspace name in Task
  persistentVolumeClaim:
    claimName: mypvc # this PVC must already exist
  subPath: my-subdir
配置故障超时

用户可以使用超时字段以分钟为单位设置PipelineRun的所需超时值。如果未在PipelineRun中指定此值,则将应用全局默认超时值。如果将超时设置为0,则在遇到错误时PipelineRun将立即失败。首次安装Tekton时,全局默认超时设置为60分钟。您可以使用tekton-pipeline命名空间下的config-defaults configmao中的default-timeout-minutes字段设置其他全局默认超时值。
超时值是符合Go的ParseDuration格式的持续时间。例如,有效值为1h30m,1h,1m和60s。如果将全局超时设置为0,则在遇到错误时所有未设置常规超时的PipelineRun将立即失败

指定task运行规范

指定PipelineRunTaskSpec的列表,其中包含TaskServiceAccountName,TaskPodTemplate和TaskName。根据TaskName将规范映射到相应的Task,PipelineTask将与配置的TaskServiceAccountName和TaskPodTemplate一起运行,覆盖pipeline范围的ServiceAccountName和podTemplate配置,例如:

spec:
   podTemplate:
    securityContext:
      runAsUser: 1000
      runAsGroup: 2000
      fsGroup: 3000
  taskRunSpecs:
    - taskName: build-task  #指定task的名称
      taskServiceAccountName: sa-for-build
      taskPodTemplate:
        nodeSelector:
          disktype: ssd

如果与此pipeline一起使用,则build-task将使用任务特定的Pod模板(其中nodeSelector的磁盘类型等于ssd)。

总结要点

  • pipelineRun与pipeline的关系是调用与被调用关系。pipeline就像定义好的函数,而pipelineRun就像是对函数的调用,还可以在函数中传参数;
  • 一直有个疑惑,task和pipeline感觉差不太多,task有多个step作为执行步骤,pipeline分多个Task来执行任务。为什么不同意task和pipeline呢?可能是因为pipeline能提供比task更复杂的功能,比如task的输出作为task的输入这种。所以复杂的设计使用pipeline,简单的使用task和taskRun就可以了。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐