经过抽象底层实现细节,用户能够跨多云平台和本地系统进行构建、测试和部署。java
Pipelines建立自定义资源做为构建块去声明Pipelines。git
Tekton Pipeline中有5类对象,核心理念是经过定义yaml定义构建过程构建任务的状态存放在status字段中。sql
其中5类对象分别是:PipelineResouce、Task、TaskRun、Pipeline、PipelineRun。docker
Task是单个任务的构建过程,须要经过定义TaskRun任务去运行Task。ubuntu
Pipeline包含多个Task,并在此基础上定义input和output,以PipelineResource做为交付。api
PipelineResource是可用于input和output的对象集合。数组
一样地,须要定义PipelineRun才会运行Pipeline。bash
下图中的箭头放下描述了从一种资源到另外一种资源的依赖。微信
关于Tekton的设计理念:app
Pipelines不知道什么会触发它们,它们能够由事件或手动建立PipelineRun触发;
Tasks能够单独存在,而且能够彻底独立于Pipelines调用。它们具备高内聚低耦合特色;
Tasks能够取决于其余Tasks建立的工件和参数;
Tasks能够被TaskRuns调用;
PipelineResources是用做Tasks输入和输出的工件。
咱们这里主要介绍下Task。
Task(或ClusterTask)是但愿在连续集成流程中运行的顺序步骤的集合。任务将在集群上的pod内运行。
一个 Task 声明包括:
Inputs
Outputs
Steps
Task的做用范围是一个namespace,而ClusterTask的做用范围是整个kubernetes 集群。
语法
要为Task资源定义配置文件,能够指定如下字段:
必写:
steps
- 指定要在Task中运行的一个或多个容器镜像。apiVersion
- 指定 API 版本, 例如tekton.dev/v1alpha1
.kind
- 指定Task
资源对象.metadata
- 指定数据以惟一标识Task
资源对象, 例如name
.spec
- 为Task
资源对象指定配置信息。必须经过如下任一字段定义Task steps:可选:
inputs
- 指定你Task
须要用到的参数和PipelineResources
outputs
- 指定你Task
产生的PipelineResources
volumes
- 指定一个或多个要用于Task
中steps
的 挂载卷.stepTemplate
- 指定容器
step 定义,以用做“Task”中全部step
的基础。.sidecars
- 指定sidercar容器与steps一块儿运行.
apiVersion: tekton.dev/v1alpha1kind: Taskmetadata: name: example-task-namespec: inputs: resources: name: workspace type: git params: name: pathToDockerFile type: string description: The path to the dockerfile to build default: /workspace/workspace/Dockerfile outputs: resources: name: builtImage type: image steps: name: ubuntu-example image: ubuntu args: ["ubuntu-build-example", "SECRETS-example.md"] image: gcr.io/example-builders/build-example command: ["echo"] args: ["$(inputs.params.pathToDockerFile)"] name: dockerfile-pushexample image: gcr.io/example-builders/push-example args: ["push", "$(outputs.resources.builtImage.url)"] volumeMounts: name: docker-socket-example mountPath: /var/run/docker.sock volumes: name: example-volume emptyDir: {}
参考上面的例子,咱们来看一下几个参数的解释:
Steps
Steps字段是必填字段。定义一个或多个Step字段以定义Task主体。
若是定义了多个Step,则由TaskRun调用任务时,将按照定义的顺序执行它们。
Task中的每一个Step都必须指定一个遵照容器规约的容器镜像。对于定义的每一个Step字段或容器镜像:
按照配置文件,依次运行和评估容器镜像。
这个容器镜像一直运行到完成或检测到第一个故障为止。
若是容器镜像在“Task”中的全部容器镜像中没有最大的资源请求,则CPU,内存和临时存储资源请求将设置为零。这样能够确保执行任务的Pod仅请求执行任务中任何单个容器镜像所需的资源,而不是请求全部容器镜像资源请求的总和。
Inputs
一个Task能够声明其所需的inputs,能够是如下之一或所有:
参数
输入资源
参数:
Task能够声明在TaskRun期间必须提供给任务的输入参数。此的一些示例用例包括:
须要知道一个Task构建应用程序时使用什么编译标志。
须要知道如何命名已构建工件的Task。
参数名称仅限于字母数字字符-和_,而且只能以字母字符和_开头。例如,fooIs-Bar_是有效的参数名称,barIsBa $或0banana不是。
每一个声明的参数都有一个类型字段,若是用户未提供,则假定为字符串。另外一个可能的类型是数组-例如,当须要向构建应用程序的任务提供动态数量的编译标志时,此数组颇有用。提供实际参数值时,将根据类型字段验证其解析的类型。
用法:
如下示例显示如何对Tasks进行参数化,以及如何将这些参数从TaskRun传递给Task。
$(inputs.params.foo)形式的输入参数在步骤内被替换(另请参见变量替换)。
如下Task声明一个名为“ flags”的输入参数,并在steps.args列表中使用它。
apiVersion: tekton.dev/v1alpha1kind: Taskmetadata: name: task-with-parametersspec: inputs: params: - name: flags type: array - name: someURL type: string steps: - name: build image: my-builder args: ["build", "$(inputs.params.flags)", "url=$(inputs.params.someURL)"]
Outputs
Task定义能够包括输入和输出PipelineResource声明。若是仅在输出中声明了特定的资源集,则预期在下一个任务上载或共享的资源副本位于路径/ workspace / output / resource_name /下。
resources: outputs: name: storage-gcs type: gcssteps: - image: objectuser/run-java-jar #https://hub.docker.com/r/objectuser/run-java-jar/ command: [jar] args: ["-cvf", "-o", "/workspace/output/storage-gcs/", "projectname.war", "*"] env: - name: "FOO" value: "world"
Pipeline的正常运转还须要其余的资源配合如: 经过Secrets挂载到工做容器的Git、Docker的帐户或token;容器内访问k8s集群所须要的serviceAccount。这些凭据资源挂载到tekton提供的特殊基础镜像容器,由这些基础容器(一般是initContainers)来对帐户、凭据进行读取。
结语
Tekton Pipeline 中的任务模板能够拿来复用,而不须要重复定义,另外经过 CRD 从新定义 CI/CD 是一大亮点。
---------------------------------------------------
官方资讯*最新技术*独家解读
本文分享自微信公众号 - Go Official Blog(Go_Official_Blog)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。