Pipeline
包含一系列排列为指定顺序的Tasks
,通过它来执行持续集成流. 在Pipeline
中的每一个Task
作为Pod
在你的Kubernetes集群中运行. 你可以配置多个条件来满足你的业务需求.
Pipeline
定义支持以下字段:
- 必须:
apiVersion
- API版本, 例如tekton.dev/v1beta1
.kind
- 定义资源对象类型,固定为Pipeline
.metadata
-Pipeline
对象相关的元数据,例如名称name
.spec
- `Pipeline对象的配置信息, 它包括:tasks
- 指定Task
,它构成了Pipeline
的执行流程与功能.
- 可选:
resources
- alpha 指定组成Pipeline
的Tasks
所需要的PipelineResources
.tasks
:resources.inputs
/resource.outputs
from
- 指定PipelineResource
的数据来源于之前Task
的输出.
runAfter
- 指定一个Task
应该在某个或多个其他Task
之后执行.retries
- 当错误发生后,Task
可重试的次数. 而不会取消任务执行.conditions
- 指定任务执行的条件
,当评估结果为true
时才执行任务.timeout
-Task
失败前的超时时间.
results
- 指定Pipeline
执行结果存放的位置.description
-Pipeline
对象的描述信息.
Pipeline
使用PipelineResources
来为组成它的Task
提供输入或存储输出,你可以通过spec
下的resources
字段来定义,其中的每一项资源中必须指定唯一的name
及其type
。例如:
spec:
resources:
- name: my-repo
type: git
- name: my-image
type: image
工作区
允许你为Pipeline
中每一个Task
指定在其执行期间所需的一个或多个卷. 你可以通过workspaces
字段指定一个或多个工作区
.
例如:
spec:
workspaces:
- name: pipeline-ws1 # Pipeline中工作区的名称
tasks:
- name: use-ws-from-pipeline
taskRef:
name: gen-code # gen-code包含一个名称为`output`的工作区
workspaces:
- name: output
workspace: pipeline-ws1
- name: use-ws-again
taskRef:
name: commit # commit包含一个名称为`src`的工作区
runAfter:
- use-ws-from-pipeline # 重要: use-ws-from-pipeline任务首先需要写入工作区
workspaces:
- name: src
workspace: pipeline-ws1
有关更多信息, 参考:
你可以指定需要在Pipeline
执行时传递的全局参数,如编译标识或者制品名称. 参数
通过PipelineRun
传递给Pipeline
,可替换Pipeline
中每一个Task
的模板值.
参数名称:
- 必须只能使用字符或数字,及连字符(
-
)或下划线(_
). - 必须以字母或下划线开始(
_
).
例如, fooIs-Bar_
是有效的参数名称, 但 barIsBa$
或者 0banana
无效.
每一个定义的参数包含一个type
字段,它可以设置为array
或者字符串
. array
可用于传递Pipeline
中所需要的多个编译标识,如果未指定type
字段,默认为string
. 当应用实际的参数值时,将会验证type
值. 参数的description
及default
字段是可选的.
以下示例展示了如何在Pipeline
中使用Parameters
.
以下Pipeline
定义了一个输入参数,名称为context
,然后传递值到Task
,以便于设置Task
中的pathToContext
参数.
如果你设置了default
字段,然后在调用Pipeline
的PipelineRun
中未设置值,那么将会使用此默认值.
注意: 输入参数值在整个Pipeline
中可作为变量使用,通过变量替换的方式.
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: pipeline-with-parameters
spec:
params:
- name: context
type: string
description: Path to context
default: /some/where/or/other
tasks:
- name: build-skaffold-web
taskRef:
name: build-push
params:
- name: pathToDockerFile
value: Dockerfile
- name: pathToContext
value: "$(params.context)"
以下PipelineRun
提供了context
参数的值:
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
name: pipelinerun-with-parameters
spec:
pipelineRef:
name: pipeline-with-parameters
params:
- name: "context"
value: "/workspace/examples/microservices/leeroy-web"
Pipeline
定义中必须引用至少一个Task
.
Pipeline
中的每一个Task
必须具有一个有效的name
以及taskRef
。例如:
tasks:
- name: build-the-image
taskRef:
name: build-push
你可以使用PipelineResources
作为Tasks
的输入和输出。例如:
spec:
tasks:
- name: build-the-image
taskRef:
name: build-push
resources:
inputs:
- name: workspace
resource: my-repo
outputs:
- name: image
resource: my-image
你也可以为任务提供参数
:
spec:
tasks:
- name: build-skaffold-web
taskRef:
name: build-push
params:
- name: pathToDockerFile
value: Dockerfile
- name: pathToContext
value: /workspace/examples/microservices/leeroy-web
如果Pipeline
中的一个Task
需要使用之前的Task
的输出作为它的输入,可使用from
参数来指定一个Tasks
列表,指明这边任务必须在目标任务执行之前执行。当你的目标任务执行时,只有任务列表中最后一个Task
输出的结果PipelineResource
被使用。此输出PipelineResource
的名称必须与目标Task
输入PipelineResource
名称一致.
在以下示例中,deploy-app
Task
使用build-app
任务名称为my-image
资源的输出作为其输入. 因此, build-app
Task
将会在deploy-app
Task
之前执行,而不管任务在Pipeline
中的顺序.
- name: build-app
taskRef:
name: build-push
resources:
outputs:
- name: image
resource: my-image
- name: deploy-app
taskRef:
name: deploy-kubectl
resources:
inputs:
- name: image
resource: my-image
from:
- build-app
如果你需要Pipeline
中的任务按照指定的顺序执行,而没有需要通过from
参数指定的依赖资源,可使用runAfter
参数来指定任务需要在一个或多个其他Task
之后执行.
在以下示例中,我们需要在构建之前先进行代码测试。由于构建任务不会使用test-app
任务的任何输出,所以build-app
任务使用runAfter
来指定test-app
必须在之前运行,而不管任务在Pipeline
中的实际顺序.
- name: test-app
taskRef:
name: make-test
resources:
inputs:
- name: workspace
resource: my-repo
- name: build-app
taskRef:
name: kaniko-build
runAfter:
- test-app
resources:
inputs:
- name: workspace
resource: my-repo
在Pipeline
中的每一个Task
,你可以指定Tekton在任务失败后可以自动重试的次数. 当Task
失败了, 其关联的TaskRun
将会设置成功
条件
为False
. retries
参数命令Tekton在此条件发生时重试.
如果你知道Task
在执行过程中可能会有些问题(例如,你可能知道有一些网络连接问题或者依赖丢失),那么你可以将retries
参数值设置为大于0的数。如果你没有设置此参数,Tekton不会在Task
失败时进行重试的尝试。.
在以下示例中,build-the-image
Task
将会在失败后重试一次,如果重试失败,Task
执行将会失败.
tasks:
- name: build-the-image
retries: 1
taskRef:
name: build-push
有时你只需要在某些条件满足时才执行任务,condition
字段允许你应用一系列的条件
,这些条件在任务执行前运行,如果所有的条件评估为true,任务将会运行,如果其中任何一个条件返回false,任务将不会被执行。此时status.ConditionSucceeded被设置为ConditionCheckFailed
, 不过,与其他任务失败不同的是,条件失败不会自动导致整个管道失败 -- 其它不依赖于此任务的任务(通过from
或者runAfter
)将会持续运行.
tasks:
- name: conditional-task
taskRef:
name: build-push
conditions:
- conditionRef: my-condition
params:
- name: my-param
value: my-value
resources:
- name: workspace
resource: source-repo
在此示例中,my-condition
引用一个条件自定义资源. build-push
任务将会在条件评估为true时执行.
条件中的资源同样可以使用from
字段来使用之前任务的输出作为条件的输入资源. 就像Pipeline中的任务一样,通过from
会影响任务执行顺序 -- 如果一个条件需要另外一个任务的输出,那么产生资源的任务将会首先被执行:
tasks:
- name: first-create-file
taskRef:
name: create-file
resources:
outputs:
- name: workspace
resource: source-repo
- name: then-check
conditions:
- conditionRef: "file-exists"
resources:
- name: workspace
resource: source-repo
from: [first-create-file]
taskRef:
name: echo-hello
你可以通过Pipeline
中的Task
配置下的Timeout
参数来设置执行Pipeline
关联的PipelineRun
中通过TaskRun
来执行具体Task
的超时时间。
超时时间
值是一个Go语言的duration
格式,可参考ParseDuration
, 有效值为1h30m
, 1h
, 1m
, 以及 60s
.
注意: 如果你没有设置Timeout
值,Tekton将使用PipelineRun
超时替代.
在以下示例中,build-the-image
Task
任务配置的超时时间为90秒:
spec:
tasks:
- name: build-the-image
taskRef:
name: build-push
Timeout: "0h1m30s"
任务执行后可以产出Results
,你可以在Pipeline
随后的Task
中以参数的方式使用这些结果
,通过变量替换, Tekton可推断Task
的执行顺序,以便于在Task
使用这些结果之前确保结果对应任务已被执行.
在以下示例中,previous-task-name
Task
任务结果作为bar-result
公开:
params:
- name: foo
value: "$(tasks.previous-task-name.results.bar-result)"
你可以配置你的Pipeline
来产出结果
, 这些结果由管道中的Task
所产生.
在以下示例中,Pipeline
指定了一个results
项,名称为sum
,它是由second-add
任务
所产生的.
results:
- name: sum
description: the sum of all three operands
value: $(tasks.second-add.results.sum)
有关示例,可参考PipelineRun
中的结果.
你可以通过Pipeline
来连接Task
,所以他们的执行可以构成有向无环图(DAG).
Pipeline
中的每一个Task
作为图中的一个节点,他们可以通过边连接起来,所以Pipeline
可以处理完成而不会死循环.
这可通过使用:
from
子句, 由每一个Task
使用的PipelineResources
, 以及runAfter
子句.
例如, 如下的Pipeline
定义:
- name: lint-repo
taskRef:
name: pylint
resources:
inputs:
- name: workspace
resource: my-repo
- name: test-app
taskRef:
name: make-test
resources:
inputs:
- name: workspace
resource: my-repo
- name: build-app
taskRef:
name: kaniko-build-app
runAfter:
- test-app
resources:
inputs:
- name: workspace
resource: my-repo
outputs:
- name: image
resource: my-app-image
- name: build-frontend
taskRef:
name: kaniko-build-frontend
runAfter:
- test-app
resources:
inputs:
- name: workspace
resource: my-repo
outputs:
- name: image
resource: my-frontend-image
- name: deploy-all
taskRef:
name: deploy-kubectl
resources:
inputs:
- name: my-app-image
resource: my-app-image
from:
- build-app
- name: my-frontend-image
resource: my-frontend-image
from:
- build-frontend
执行顺序图如下:
| |
v v
test-app lint-repo
/ \
v v
build-app build-frontend
\ /
v v
deploy-all
详细说明:
lint-repo
和test-app
任务
没有from
或runAfter
子句,他们将会被立即同时执行.- 一旦
test-app
完成,build-app
和build-frontend
任务将会同时开始,因为他们都有runAfter
子句,并指向test-app
任务. deploy-all
任务
在build-app
和build-frontend
任务完成后执行,因为他会使用这两个任务的输出资源.- 整个
Pipeline
将会在lint-repo
和deploy-all
任务完成时完成.
description
字段是可选字段,可通过此字段设置Pipeline
的描述信息.
为了更好地理解Pipelines
, 可通过学习我们的示例.
除非另有说明,本页内容采用Creative Commons Attribution 4.0 License授权协议,示例代码采用Apache 2.0 License授权协议