工作区
允许Tasks
定义一部分文件系统,然后通过TaskRuns
在运行时提供。TaskRun
可以通过多种方式来指定:使用只读的ConfigMap
或Secret
,已存在的PersistentVolumeClaim
,由提供的VolumeClaimTemplate
模版创建新的PersistentVolumeClaim
,或则简单的emptyDir
.
工作区
与Volumes
相似,除了它允许Task
作者让用户和TaskRuns
运行是决定使用哪一个存储类.
工作区可用于以下目的:
- 存储输入或输出
- 在
Tasks
之间分享数据 - 挂载
Secrets
中的凭证 - 挂载
ConfigMaps
中的配置 - 挂载组织中的常用工具
- 缓存工件来加速构建过程
Tasks
为起步骤指明一个工作区
存在于磁盘中,在运行时,TaskRun
提供Volume
明细来挂载到工作区
中.
关注点的分离可以提供更多的灵活性,例如,隔离的TaskRun
可以通过提供emptyDir
卷来更快地挂载,然后在执行完成后自动清除. 在更复杂的系统中,TaskRun
可能使用PersistentVolumeClaim
提前准备好数据供Task
处理。这两种场景可能使用同一个Task's
及工作区
,然后在TaskRun
中根据情况来指定.
Pipeline
可以使用工作区
来在属于它的Tasks
之间共享存储。例如,Task
可以克隆源代码仓储到一个工作区
,然后另一个Task
可以从工作区
中编译代码。Pipeline's
保证两个Tasks
使用相同的工作区,更重要的时,采用正确的顺序来访问工作区.
PipelineRuns
处理方式与TaskRuns
一样 —— 它们提供特定的Volume
信息来让每一个Pipeline
使用工作区
.
PipelineRuns
另外的职责是确保无论何种类型的Volume
都可以在Tasks
间安全和正确的共享.
本节描述如何在TaskRun
中配置一个或多个工作区
.
要在Task
中配置一个或多个工作区
,添加一个workspaces
,并指定包含以下字段的列表:
name
- (必须) 一个 唯一 的字符串标识,通过它可以引用此工作区description
- 描述此工作区的信息readOnly
- 定义Task
是否可写入此工作区
.mountPath
- 工作区挂载的磁盘位置,Steps
中可通过此路径访问。路径相对于/workspace
,如果未指定mountPath
,将会默认为/workspace/<name>
,<name>
为工作区唯一的名称.
注意:
Task
可以包含多个工作区
.readOnly
Workspace
将会通过read-only方式挂载,尝试写入只读工作区将导致TaskRuns
失败.mountPath
可以是绝对路径或相对路径,绝对路径必须以/
开始,相对路径开始于目录名称,例如,mountPath
为"/foobar"
是绝对路径,导出的工作区路径为/foobar
,但是mountPath
为"foobar"
是相对路径,其实际路径为/workspace/foobar
.
以下Task
示例包含一个名称为messages
的工作区
,Task
将消息写入此位置:
spec:
steps:
- name: write-message
image: ubuntu
script: |
#!/usr/bin/env bash
set -xe
echo hello! > $(workspaces.messages.path)/message
workspaces:
- name: messages
description: The folder where we write the message to
mountPath: /custom/path/relative/to/root
Tasks
中可通过以下变量获取工作区
信息:
$(workspaces.<name>.path)
- 工作区的路径,<name>
是工作区
的名称.$(workspaces.<name>.volume)
- 工作区的Volume
,<name>
是工作区
的名称.
TaskRun
在执行包含工作区
列表的Task
时,必须将工作区
绑定到真实的物理Volumes
,由此,TaskRun
包含自己的workspaces
列表,每一项包含以下字段:
name
- (必须)工作区
的名称subPath
- 可选的Volume
中的子路径,这里面的数据将会挂载到Workspace
项中也必须包含一个VolumeSource
,参考与工作区
一起使用 VolumeSources
获取更多信息.
注意:
- 在
TaskRun
执行之前,subPath
必须 存在在卷
中,否则TaskRun
将会执行失败. 工作区
必须在执行与Task
关联的TaskRun
之前有效,否则TaskRun
将会失败.
以下示例展示了如何在TaskRun
中指定工作区
,有关更多信息, 参考 在TaskRun
中的工作区
.
在以下示例中,存在一个名称为PersistentVolumeClaim
的持久化存储声明,它被用于名称为myworkspace
的工作区
中,它只导出PVC中的my-subdir
子目录:
workspaces:
- name: myworkspace
persistentVolumeClaim:
claimName: mypvc
subPath: my-subdir
在以下示例中,提供一个emptyDir
给任务的名称为myworkspace
的工作区
:
workspaces:
- name: myworkspace
emptyDir: {}
以下示例中,为Task
中名称为myworkspace
的工作区指定一个名称为my-configmap
的配置映射:
workspaces:
- name: myworkspace
configmap:
name: my-configmap
以下示例,为Task
中名称为myworkspace
的工作区指定一个名称为my-secret
的密文
:
workspaces:
- name: myworkspace
secret:
secretName: my-secret
有关更深入的示例,请参考workspace.yaml.
独立的Tasks
定义其运行所需工作区
,Pipeline
决定需要在其Tasks
之间共享的工作区。要定义共享的工作区,你必须在Pipeline
中定义以下信息:
- 需要由
PipelineRuns
提供的工作区列表,使用workspaces
字段定义工作区列表,列表中每一项具有唯一的名称. - 映射
Pipeline
与Task
中工作区名称的映射.
以下示例定义了一个具有一个工作区的Pipeline
,名称为pipeline-ws1
.此工作区绑定到了两个Tasks
—— 第一个gen-code
任务作为输出
工作区,然后作为第二个commit
任务的src
工作区. 如果PipelineRun
提供了PersistentVolumeClaim
作为工作区,则可在Task
之间共享数据.
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"
workspaces:
- name: src
workspace: pipeline-ws1
runAfter:
- use-ws-from-pipeline # 重要: 实现执行use-ws-from-pipeline任务来写入数据
在Tasks
之间共享一个工作区
需要你定义这些Tasks
访问工作区
的顺序,因为不同的存储类具有不同的并发读写的限制. 例如,PersistentVolumeClaim
可能只允许一个Task
写入一次.
警告: 你 必须 确保顺序的正确性,不正确的顺序可能导致死锁,比如在多个Task
Pods
同时尝试挂载一个PersistentVolumeClaim
来在同一时间写入时,这将导致Tasks
超时.
要定义顺序,在Pipeline
定义中使用runAfter
字段,更多信息,参见runAfter
文档.
要使用PipelineRun
运行一个包含工作区
的Pipeline
,必须先将工作区绑定到真实的物理卷,这可以通过PipelineRun
workspaces
字段来设置工作区列表,列表中每一项包含以下字段:
name
- (必须)Pipeline
中定义的工作区
名称.subPath
- (可选) 卷中的子路径,该路径中存储工作区需要使用的数据,该路径必须存在,否则TaskRun
将执行失败.
项中必须包含一种VolumeSource
,参考与工作区
一起使用VolumeSources
.
注意: 如果Pipeline
中定义的工作区,在PipelineRun
中未绑定,PipelineRun
将会失败.
以下示例阐述了如何在PipelineRuns
中指定工作区,更深入的示例请参考PipelineRun
中的工作区 YAML 示例.
在以下示例中,存在一个名称为mypvc
的PersistentVolumeClaim
,用于名称为myworkspace
的工作区,它只导出了mypvc
中的my-subdir
子路径:
workspaces:
- name: myworkspace
persistentVolumeClaim:
claimName: mypvc
subPath: my-subdir
以下示例中, 将名称为my-configmap
的配置映射
用于Pipeline
中定义的名称为myworkspace
的工作区中:
workspaces:
- name: myworkspace
configmap:
name: my-configmap
以下示例中, 将名称为my-secret
的密文
用于Pipeline
中定义的名称为myworkspace
的工作区中:
workspaces:
- name: myworkspace
secret:
secretName: my-secret
你在每一个工作区中可使用一种类型的VolumeSource
. 每一种类型具有不同的配置项Workspaces
支持以下字段:
emptyDir
字段指向emptyDir
卷 ,它存储TaskRun
运行的临时数据. emptyDir
卷不 适合于在管道任务之间共享数据.
但是,它适用于在TaskRuns
内部步骤之间共享数据.
persistentVolumeClaim
指向persistentVolumeClaim
卷.
PersistentVolumeClaim
卷是在Pipeline
中Tasks
之间共享数据的好选择.
volumeClaimTemplate
是persistentVolumeClaim
卷的模版, 为每一个PipelineRun
或者TaskRun
创建,由PipelineRun
或TaskRun
从模版创建的PVC,将在PipelineRun
或TaskRun
删除后被删除.
当需要在运行PipelineRun
或TaskRun
时共享数据时,volumeClaimTemplate
卷是好的选择.
configMap
指向configMap
卷.
使用configMap
作为工作区,具有以下限制:
configMap
卷总是只读,步骤不能进行写入.configMap
指定的配置映射必须在TaskRun
运行时存在.configMaps
最大不超过1MB.
secret
字段指向secret
卷.
使用secret
卷作为工作区,具有以下限制:
secret
卷总是只读,步骤不能进行写入.secret
指定的密文必须在TaskRun
运行时存在.secret
最大不超过1MB.
如果你需要一个目前尚未存在的VolumeSource
类型, 可在github上提交需求 或者 pull request.
以下包含有关配置工作区
的更详细的示例: