云原生CI/CD:Tekton/pipeline之pipelineRun
云原生CI/CD:Tektoncd/pipeline之pipelineRun。pipelineRun主要用于运行pipeline。相当于是对pipeline的一次调用。
云原生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就可以了。
更多推荐
所有评论(0)