云原生CI/CD:Tekton/pipelin之pipeline概念篇

本节介绍下tekton中pipeline概念。作为云原生的CI/CD神器在之前介绍的task和taskrun之后,还有什么强大的功能呢?

Pipeline

用于定义一系列完成特定构建或交付目标的任务。pipeline的运行是由事件触发或从PipelineRun调用。pipeline和task的区别在于,task只能执行一个task,而pipeline中可以编排多个task,注意是编排,并不只是简单运行。pipeline的spec.tasks定义了需要编排的task,是个数组,而这个数组中的task的顺序并不一定是执行顺序,pipeline中task的执行顺序是可以指定的。下面讲下pipeline的使用:

1.1 Declared resources

为了使pipeline能与外界互动,可能需要PipelineResources,PipelineResources作为输入和输出提供给Tasks。下面就是pipeline中使用pipelineResource:

spec:resources:- name: my-repotype: git- name: my-imagetype: image

1.2 Workspaces

工作空间是一种为执行中的管道及其任务提供可用的共享卷的方法。在pipeline中定义worksapce作为共享卷传递个相关的task。在tekton中定义workspace的用途有以下几点:

  • 存储输入和/或输出
  • 在task之间共享数据
  • secret认证的挂载点
  • ConfigMap中保存的配置的挂载点
  • 组织共享的常用工具的挂载点
  • 高速缓存的构建工件可加快工作速度,简而言之,用于缓存构建时的包,例如作为Maven仓库存储
    使用方式如下:
spec:workspaces:- name: pipeline-ws1 # workspace的名称tasks:- name: use-ws-from-pipelinetaskRef:name: gen-code # 使用的Taskworkspaces:- name: outputworkspace: pipeline-ws1- name: use-ws-againtaskRef:name: commit # 使用的taskrunAfter:- use-ws-from-pipeline # 定义任务的执行顺序,该task在use-ws-from-pipeline之后执行workspaces:- name: srcworkspace: pipeline-ws1

1.3 使用task和pipelineresource

pipeline中使用已经定义好的task和pipelineResource:

spec:tasks:- name: build-the-imagetaskRef:name: build-push # 使用定义好的taskresources:inputs:#输入资源 代码- name: workspaceresource: my-repooutputs:#输出资源 镜像- name: imageresource: my-image

1.4 from

你可能需要将先前任务的输出作为输入,举个例子:

- name: build-apptaskRef:name: build-pushresources:outputs: #定义任务输出- name: imageresource: my-image
- name: deploy-apptaskRef:name: deploy-kubectlresources:inputs:#定义任务输入- name: imageresource: my-imagefrom:- build-app #任务输入源,也意味着任务deploy-kubectl要在任务build-app之后执行

resource my-image将会从build-app的输出作为deploy-app的输入,所以my-image必须是build-app任务的输出结果,当然这也意味着build-app必须先于deloy-app运行完,无论它们在定义中出现的顺序如何。

1.5 runAfter

有时,您需要具有按特定顺序运行的pipeline task,但它们没有明确的输出来输入依赖项(通过from表示)。在这种情况下,可以使用runAfter指示应在一个或多个先前的管道任务之后执行管道任务。

- name: test-apptaskRef:name: make-testresources:inputs:- name: workspaceresource: my-repo
- name: build-apptaskRef:name: kaniko-buildrunAfter:- test-app #build-app任务在test-app任务之后执行resources:inputs:- name: workspaceresource: my-repo

build-app任务会在test-app之后执行

1.6 retries

有时,你需要一项重试策略以应对可能会遇到的网络错误、缺少依赖或者上传问题等.
默认retries确省值为0,不会重试,自定义重试策略如下:

tasks:- name: build-the-imageretries: 1taskRef:name: build-push

build-the-image任务在第一次失败后,马上就会启动第二个。当前设置只能重试1次。

1.7 conditions

有时你需要在某些条件为true的情况下才去执行task,condition字段允许您列出对在任务运行之前运行的条件的一系列引用。如果所有条件都为真,则运行任务。要是有一个条件不满足,那任务就不会运行,同时任务的status标志位会被置为ConditionCheckFailed。注意正常来讲,一个task不能运行,不会影响整个pipelinerun。pipeline中使用condition:

tasks:- name: conditional-tasktaskRef:name: build-pushconditions:- conditionRef: my-condition #使用已有condition params:- name: my-paramvalue: my-valueresources:- name: workspaceresource: source-repo

关于如何定义condition,后面找个机会详细找下。

1.8 Timeout

Pipeline Task的Timeout属性允许为PipelineRun的一部分TaskRun定义超时。如果TaskRun超过指定的时间,则TaskRun将失败,并且与Pipeline关联的PipelineRun也将失败。Pipeline的Tasks没有默认超时设置,因此在定义pipeline时必须使用pipeline task指定超时。带有超时的管道任务示例如下所示:

spec:tasks:- name: build-the-imagetaskRef:name: build-pushTimeout: "0h1m30s"

timeout的完整例子:

apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:name: task-echo-message
spec:inputs:params:- name: MESSAGEtype: stringdefault: "Hello World"steps:- name: echoimage: ubuntucommand:- sleep 90sargs:- "$(inputs.params.MESSAGE)"
---apiVersion: tekton.dev/v1alpha1
kind: PipelineRun
metadata:name: pipelinerun-timeout
spec:# 1 hour and half timeouttimeout: 1h30mpipelineSpec:params:- name: MORNING_GREETINGSdescription: "morning greetings, default is Good Morning!"type: stringdefault: "Good Morning!"- name: NIGHT_GREETINGSdescription: "Night greetings, default is Good Night!"type: stringdefault: "Good Night!"tasks:# Task to display morning greetings- name: echo-good-morningtaskRef:name: task-echo-messageparams:- name: MESSAGEvalue: $(params.MORNING_GREETINGS)# Task to display night greetings- name: echo-good-nighttaskRef:name: task-echo-messageparams:- name: MESSAGEvalue: $(params.NIGHT_GREETINGS)params:- name: MORNING_GREETINGSvalue: "Good Morning, Bob!"- name: NIGHT_GREETINGSvalue: "Good Night, Bob!"

注意:设置超时时间是很有必要的,不然task 的pod会一直运行不完,浪费k8s集群资源,对于超时的任务确实应该kill掉。我之前构建Java项目时,使用的maven仓库没有配置阿里云的源,拉包很慢,跑了一个小时,最后到了默认的超时时间才强制关掉任务。

1.8 Results

piple中可以使用task的运行结果作为其他Task的输入,即task可在执行过程中生成一些result,这些result可用作pipeline后续task中的参数值,此外Tekton将根据输入参数来推断tasks的执行顺序,以确保生成result的task在那些消耗其结果的task之前运行。
通过变量替换将Task结果用作另一个Task参数的值:

params:- name: foovalue: "$(tasks.previous-task-name.results.bar-result)"

"previous-task-name"产生的result被用于参数值。完整的例子如下:

apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:name: sum-and-multiply-pipeline
spec:params:- name: atype: stringdefault: "1"- name: btype: stringdefault: "1"tasks:- name: sum-inputstaskRef:name: sumparams:- name: avalue: "$(params.a)"- name: bvalue: "$(params.b)"- name: multiply-inputstaskRef:name: multiplyparams:- name: avalue: "$(params.a)"- name: bvalue: "$(params.b)"- name: sum-and-multiplytaskRef:name: sumparams:- name: avalue: "$(tasks.multiply-inputs.results.product)$(tasks.sum-inputs.results.sum)" #该任务在multiply-inputs之后执行- name: bvalue: "$(tasks.multiply-inputs.results.product)$(tasks.sum-inputs.results.sum)"
---
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:name: sumannotations:description: |A simple task that sums the two provided integers
spec:params:- name: atype: stringdefault: "1"description: The first integer- name: btype: stringdefault: "1"description: The second integerresults:- name: sumdescription: The sum of the two provided integerssteps:- name: sumimage: bash:latestscript: |#!/usr/bin/env bashecho -n $(( "$(params.a)" + "$(params.b)" )) | tee $(results.sum.path)
---
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:name: multiplyannotations:description: |A simple task that multiplies the two provided integers
spec:params:- name: atype: stringdefault: "1"description: The first integer- name: btype: stringdefault: "1"description: The second integerresults:- name: productdescription: The product of the two provided integerssteps:- name: productimage: bash:latestscript: |#!/usr/bin/env bashecho -n $(( "$(params.a)" * "$(params.b)" )) | tee $(results.product.path)
---
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:generateName: sum-and-multiply-pipeline-run-
spec:pipelineRef:name: sum-and-multiply-pipelineparams:- name: avalue: "2"- name: bvalue: "10"

1.9 Ordering

前面有讲过单独使用from和runAfter这边讲下,这两者联合使用能到达指定顺序执行任务:

- name: lint-repotaskRef:name: pylintresources:inputs:- name: workspaceresource: my-repo
- name: test-apptaskRef:name: make-testresources:inputs:- name: workspaceresource: my-repo
- name: build-apptaskRef:name: kaniko-build-apprunAfter:- test-app #build-app在test-app之后执行resources:inputs:- name: workspaceresource: my-repooutputs:- name: imageresource: my-app-image
- name: build-frontendtaskRef:name: kaniko-build-frontendrunAfter:- test-app #build-frontend在test-app之后执行resources:inputs:- name: workspaceresource: my-repooutputs:- name: imageresource: my-frontend-image
- name: deploy-alltaskRef:name: deploy-kubectlresources:inputs:- name: my-app-imageresource: my-app-imagefrom:- build-app # 在build-app之后执行- name: my-frontend-imageresource: my-frontend-imagefrom:- build-frontend #在build-frontend之后执行

执行过程图:

        |            |v            vtest-app    lint-repo/        \v          v
build-app  build-frontend\          /v        vdeploy-all

总结

对于比较复杂的CI/CD任务或者需要指定执行顺序时,可以选择使用pipeline来运行,pipeline定义好了就创建,然后不用管了。在运行pipelineRun时指定必要的参数,每次运行构建任务时,只要运行pipelineRun就行,pipelineRun的使用我们下一次再讲。总体来说,pipeline的功能相对于task来说还比较全,之后我会找一些场景进行演示。
欢迎关注“南君手记”公众号,欢迎评论指正。技术之路,我们一起成长!

云原生CI/CD:Tekton/pipelin之pipeline概念篇相关推荐

  1. 云原生CI/CD:tekton/pipeline之认证篇

    云原生CI/CD:tekton/pipeline之认证篇 既然说tekton/pipeline是CI/CD,必然需要用到拉取git仓库代码,仓库代码可能是私有的,看下tekton/pipeline在这 ...

  2. 云原生 CI/CD 框架 Tekton 初体验

    Tekton 是一款功能非常强大而灵活的 CI/CD 开源的云原生框架.Tekton 的前身是 Knative 项目的 build-pipeline 项目,这个项目是为了给 build 模块增加 pi ...

  3. 云原生CI/CD:Tekton之trigger介绍

    云原生CI/CD:Tekton之trigger组件 简介 上面背景图片用了一张手枪扳机的图片,啥意思呢?trigger对于pipeline的作用就像扳机对于手枪的作用的,读完文章再来体会这句话. 前面 ...

  4. 开源云原生CI/CD框架Tekton国内部署方式

    Tekton 是一款功能非常强大而灵活的 CI/CD 开源的云原生框架.致力于提供全功能.标准化的云原生 CI/CD 解决方案.[本文主要是通过流水线自动化的将tekton镜像同步到腾讯云仓库,并部署 ...

  5. 云原生CI/CD框架Tekton国内部署方式

    Tekton 是一款功能非常强大而灵活的 CI/CD 开源的云原生框架.致力于提供全功能.标准化的云原生 CI/CD 解决方案.[本文主要是通过流水线自动化的将tekton镜像同步到腾讯云仓库,并部署 ...

  6. Kubernetes原生CI/CD构建框架Tekton详解

    流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术.本文主要介绍了诞生于云原生时代的流水线框架 Tekton. 什么是流水线? 在计算机中,流水线是 ...

  7. 【 云原生 | kubernetes 】- tekton构建CI/CD流水线(二)

    ​ 上一节我们是通过创建Pipelinerun来触发流水线来进行构建,实际生产中完全自动化的实现需要借助tekton中的triggers.本文是上篇的拓展请先了解这篇文章 Tekton Trigger ...

  8. kubernetes原生ci/cd工具tekton版本升级至v0.18.1

    前言 最近没啥好写的,一直都在弄hpa的问题,也就是解决hpa没生效的问题,以及最优minReplica最小基数的问题.也已经划水了两篇博客了,所以今天就来简单记录一下之前做过的一个小任务,也就是将项 ...

  9. 明源云创CI/CD技术演进

    源宝导读:在敏捷迭代的过程中需要能够快速的把开发的代码集成打包部署到各个环节对应的环境中.为了高效稳定的完成这个工作,我们引入了DevOps实践理论,并形成了配套的CI/CD工具.本文将介绍云创的CI ...

最新文章

  1. JVM内存管理:深入Java内存区域与OOM
  2. 分数加减法_JAVA
  3. linux查看 idt日志,实现RCP的日志管理
  4. linux查看磁盘io最多的进程,Linux 查看磁盘IO并找出占用IO读写很高的进程,磁盘占用很高...
  5. 乒乓球单循环赛_乒乓球单循环比赛规则
  6. 计算机硬件清理步骤,联想笔记本电脑清理灰尘详细步骤
  7. mandriva urpm类命令
  8. Java:基础 :集合和迭代器
  9. 社交之战,结局:被封?,这只是一个开始
  10. 用C++解决数学类问题的练习
  11. 微博营销的价值和优缺点
  12. CodeForces 1K-1400R-1324D
  13. html ui标记是什么,ui是啥
  14. LM386喇叭驱动电路
  15. MySQL中使用UUID()函数生成主键
  16. 【docker-compose】一键部署WordPress博客
  17. 2022-解决Android studio 模拟机没有网络,app接口api运行不起来的问题
  18. idea如何配置tomcat
  19. Android复杂界面布局解决方案
  20. I. 知识图谱 应用案例 --- 阿里巴巴电商知识图谱

热门文章

  1. unity3d 5.2 添加广点通广告
  2. mysql分组查询选择数量最多的前十个_mysql 查询每一个分组前N条记录
  3. Bugku CTF web 你必须让他停下来 解题思路
  4. 2022-2028年全球与中国低速电动汽车行业发展趋势及投资战略分析
  5. NKOJ 3762 守夜人 (并查集)
  6. Linux : Screen 详解
  7. unity 镜头标签
  8. vue项目导出EXCEL功能
  9. Matlab播放音频文件(音乐)!
  10. 双机热备ppt_中兴通讯4G产品介绍(PPT)