前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >在 Tekton 中如何实现审批功能

在 Tekton 中如何实现审批功能

原创
作者头像
陈少文
修改于 2021-06-26 05:10:38
修改于 2021-06-26 05:10:38
2K0
举报
文章被收录于专栏:陈少文陈少文

1. CICD 平台的基本功能

常见的 CICD 引擎并不适合直接提供给业务方使用。主要原因在于用户学习成本高、缺乏必要的鉴权、维护升级难度大。

我们通常会基于流程引擎,针对业务进行适配提高易用性,针对场景进行封装收敛复杂度,那么一个 CICD 平台需要具备哪些基本的功能呢?

  • 流程编排。基本而又核心的功能,借助开源的编排引擎即可。
  • 流程原子。流程原子组装得到流水线,越丰富的流程原子,越能够满足业务方的需求。
  • 流程控制。主要包括条件执行、暂停、继续、审批等,允许控制流水线的行为。
  • 自动触发。通过 API、Webhook 等方式自动触发流水线,会给使用方带来很大便利。
  • 权限控制。作为一个面向用户的平台,权限控制比不可少。

Tekton 作为云原生下的 CICD 引擎,用来构建面向 Kubernetes 基础设施的 CICD 平台,非常适用。本篇主要想和大家分享的是 Tekton 流程控制,特别是审批的功能。

2. Tekton 中的流程控制

2.1 runAfter

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

- 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

通过 runAfter 关键字可以控制任务的执行顺序,上面的示例中 build-app 会在 test-app 执行完成之后执行。使用 runAfter 可以实现对流程的编排。

2.2 conditions

这里首先创建一个 Condition 对象,检查代码仓库中是否存在指定文件。

1 2 3 4 5 6 7 8 9 10 11 12 13

apiVersion: tekton.dev/v1alpha1 kind: Condition metadata: name: file-exists spec: params: - name: "path" resources: - name: workspace type: git check: image: alpine script: 'test -f $(resources.workspace.path)/$(params.path)'

在创建 Pipeline 时,只需要在 Task 中引用这个 Condition,提供必要的参数即可。下面这个例子中,仅当代码仓库中存在 README.md 文件时,my-task 任务才会执行。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

apiVersion: tekton.dev/v1beta1 kind: Pipeline metadata: name: conditional-pipeline spec: resources: - name: source-repo type: git params: - name: "path" default: "README.md" tasks: - name: if-condition-then-run conditions: - conditionRef: "file-exists" params: - name: "path" value: "$(params.path)" resources: - name: workspace resource: source-repo taskRef: name: my-task

2.3 PipelineRunCancelled

当 PipelineRun Spec 中的状态处于 PipelineRunCancelled 时,Reconciler 会提前取消全部 Task 并更新状态。

参考代码: https://github.com/tektoncd/pipeline/blob/c8dc797cf5a6f11f90cb742d014470a444fcdc60/pkg/reconciler/pipelinerun/pipelinerun.go#L147

  • 查看正在运行的 pipelinerun

1 2 3 4

kubectl get pipelineruns.tekton.dev NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME cancel-pipelinerun-r-67qsr Unknown Running 51m

  • 修改 pipelineruns 的 status 为 PipelineRunCancelled

1

kubectl patch PipelineRun cancel-pipelinerun-r-67qsr --type=merge -p '{"spec":{"status":"PipelineRunCancelled"}}'

  • 查看取消的 pipelinerun

1 2 3 4

kubectl get pipelineruns.tekton.dev NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME cancel-pipelinerun-r-67qsr False PipelineRunCancelled 52m 3s

2.4 PipelineRunPending

除了上面的 PipelineRunCancelled 状态,pipelinerun 还有一个状态,PipelineRunPending。PipelineRunPending 实现的效果是,创建 PipelineRun 但不立即运行

  • 创建一条 PipelineRunPending 状态的流水线

1 2 3 4 5 6 7 8 9 10 11 12 13 14

--- apiVersion: tekton.dev/v1beta1 kind: PipelineRun metadata: name: pending-pipelinerun spec: params: - name: pl-param-x value: "100" - name: pl-param-y value: "500" pipelineRef: name: pending-pipeline status: "PipelineRunPending"

  • 查看流水线状态

1 2 3 4

kubectl get pipelineruns.tekton.dev NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME pending-pipelinerun Unknown PipelineRunPending

这条流水线没有执行时间,因为它一直处于等待状态。

  • 移除 PipelineRunPending 状态

1

kubectl patch PipelineRun pending-pipelinerun --type=merge -p '{"spec":{"status":""}}'

这条流水线开始执行。

  • 查看流水线状态

1 2 3 4

kubectl get pipelineruns.tekton.dev NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME pending-pipelinerun Unknown Running 4s

  • 无法将正在运行的流水线修改为 PipelineRunPending 状态

在 Tekton v0.24.1 中无法修改状态为 PipelineRunPending,如果运行将可以实现暂停的效果。

1 2 3 4

kubectl get pipelineruns.tekton.dev NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME cancel-pipelinerun Unknown Running 9s

1 2 3

kubectl patch PipelineRun cancel-pipelinerun --type=merge -p '{"spec":{"status":"PipelineRunPending"}}' Error from server (BadRequest): admission webhook "validation.webhook.pipeline.tekton.dev" denied the request: validation failed: invalid value: PipelineRun cannot be Pending after it is started: spec.status

validation 限制了这次修改操作。

3. 如何实现审批功能

上面提到了 Tekton 中的几个流程控制方法,但是社区并没有提供、也不准备提供审批的功能。因此,在对 Tekton 进行二次开发时,需要 CICD 平台自行实现审批和权限的控制。下面是两种实现方案,以供参考:

3.1 方案一,使用 Trigger

如上图,可以将用户的一条流水线拆解为两条流水线,pipeline-1/2 和 pipeline-2/2。两条流水线之间引入一个 trigger。

  1. 当流水线 pipeline-1/2 执行完成时,通知审批者。
  2. 审批者审批通过后,触发 pipeline-2/2 执行。
  3. pipeline-2/2 执行结束,完成整条流水线。

Tekton 社区提供了一个 triggers 组件,用来自动化触发流水线。如下图:

  1. 审批之后,推送一个触发事件 Event
  2. EventController 收到这个事件之后,从 TriggerBinding 提取出事件内的参数 Parameters
  3. TriggerTemplate 利用传递过来的参数 Parameters,创建流水线 pipeline-2/2 。

3.2 方案二,开发一个审批 Task

开发 Task 是 Tekton 的主要扩展方式,同时开发 Task 只需要掌握基本的 Shell 和 Yaml 知识即可。这里提供另外一个思路就是开发一个审批 Task。

如上图,在一条流水线中,插入一个用于审批控制的 Task-Approve。

  1. 在使用审批原子时,需要同步创建一个 ConfigMap,用于保存审批的状态 Status=init
  2. 当流水线执行完成 Task-beforeApprove 任务时,启动 Task-Approve 任务,修改状态 Status=notifying。Task-Approve 任务一直处于等待状态。
  3. 发送通知给 Approver,修改状态 Status=notified
  4. 审批者审批流水线,允许执行,修改状态 Status=success
  5. Task-Approve 检测到 Status=success,立即结束等待状态,完成当前 Task
  6. 流水线继续执行审批后的任务 Task-afterApprove,直至结束

下面是一个示例:

首先创建一个 ConfigMap 用于保存审批状态。

1 2 3 4 5 6

apiVersion: v1 kind: ConfigMap metadata: name: approve-cm data: status: init

编写一个审批的 Task,默认等待 24 小时审批,否则超时。如果将状态修改为 success 则审批通过,如果将状态修改为 refused 则表示拒绝。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: approve-task spec: workspaces: - name: data params: - name: timeout description: The max seconds to approve type: string default: "86400" steps: - name: sleep-a-while image: bash:latest script: | #!/usr/bin/env bash end=$((SECONDS+$(params.timeout))) while [ $SECONDS -lt $end ]; do name=$(cat "$(workspaces.data.path)"/status) if [ "$name" = "success" ] then echo "approved!" exit 0 elif [ "$name" = "refused" ] then echo "refused!" exit 1 fi sleep 2 echo "waiting" done echo "too long not to approve" exit 1

然后,创建一个测试用例

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: something annotations: description: | A simple task that do something spec: steps: - name: do-something image: bash:latest script: | #!/usr/bin/env bash uname -a --- apiVersion: tekton.dev/v1beta1 kind: Pipeline metadata: name: approve-pipeline spec: workspaces: - name: workspace tasks: - name: wait-for-approve workspaces: - name: data workspace: workspace taskRef: name: approve-task - name: do-something taskRef: name: something runAfter: - wait-for-approve --- apiVersion: tekton.dev/v1beta1 kind: PipelineRun metadata: name: approve-pipelinerun spec: workspaces: - name: workspace configmap: name: approve-cm pipelineRef: name: approve-pipeline

  • 创建之后查看流水线

日志中会一直输出 waiting。

  • 审批通过

1

kubectl patch ConfigMap approve-cm --type=merge -p '{"data":{"status":"success"}}'

  • 查看流水线状态

4. 总结

在进行 Tekton 二次开发时,审批是很难绕开的功能,但社区并没有提供相关的特性。本文首先介绍了 Tekton 中流程控制方法,然后提供了两种实现审批功能的方案。下面对方案进行简单的对比和总结:

4.1 使用 Trigger 审批

优点

  • 灵活,审批之后的执行,完全由开发者控制,自由度更大。同时也可以使用后台任务替换 Trigger,使用 Tekton Client 创建流水线。
  • 可靠,即使重启也不会影响审批。

缺点

  • 拆分之后可能不止两条流水线。
  • 需要跨流水线传递参数、产物,增加了维护的成本。
  • 架构复杂度增加,引入了新的组件、后台处理逻辑

4.2 开发一个审批 Task

优点

  • 使用简单。一条 Pipeline 只有一个 DAG,容易理解。
  • 更加符合 Tekton 的扩展方式。

缺点

  • 审批 Task 因为节点故障失败时,无法恢复
  • 占用集群资源,审批 Task 常驻集群等待。
  • ConfigMap 状态更新不及时,会有一个延时(默认在秒级),大约值为 kubelet 的同步周期加上 ConfigMap 在 kubelet 中缓存的 TTL 时间。

5. 参考

原文:https://www.chenshaowen.com/blog/how-to-implement-approval-function-in-tekton.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Tekton Pipeline教程
Tekton Pipeline,是一个k8s native的pipeline, 任务跑在pod中,通过自定义CRD去管理任务与工作流等等,我看完tekton之后感觉是功能很强大,但是有点过度设计了,没有drone的简约大方灵活之感
sealyun
2019/08/26
3.5K0
Tekton Pipeline教程
多集群下的 Tekton 流水线
借助于 Kubernetes, Tekton 已经具备很好的弹性, 能够支持大规模构建。同时, 开发 Task 主要使用 Yaml 和 Shell, 这扩大了 Tekton 的各种场景适配范围。
陈少文
2021/06/27
1.1K1
多集群下的 Tekton 流水线
Tekton 与 Argo CD 结合实现 GitOps
前面我们使用 Tekton 完成了应用的 CI/CD 流程,但是 CD 是在 Tekton 的任务中去完成的,现在我们使用 GitOps 的方式来改造我们的流水线,将 CD 部分使用 Argo CD 来完成。
DevOps云学堂
2021/07/15
2.5K0
Tekton 与 Argo CD 结合实现 GitOps
云原生 | 下一代CI/CD工具,Tekton牛刀小试自动化流水线
本文为作者原创文章,为尊重作者劳动成果禁止非授权转载,若需转载请在【全栈工程师修炼指南】公众号留言,或者发送邮件到 [master@weiyigeek.top] 中我将及时回复。
全栈工程师修炼指南
2023/10/31
3830
云原生 | 下一代CI/CD工具,Tekton牛刀小试自动化流水线
使用 Workspaces 加速 Tekton 流水线
在实际工作中,我们经常需要的一个功能是能够在任务之间共享制品,以便缓存构建工具(比如 Maven 和 NPM)的依赖项,在 Tekton 0.10 版本就发布增加了对 Workspaces 的支持,这使得流水线中的任务可以更加轻松地使用 PV 来共享数据了,Workspaces 允许指定一个或多个 pipeline 中 task 运行时需要的 volume。
我是阳明
2021/06/25
2.2K0
使用 Workspaces 加速 Tekton 流水线
使用 Tekton 创建 CI/CD 流水线(1/2)
Tekton 是一款功能非常强大而灵活的 CI/CD 开源的云原生框架。Tekton 的前身是 Knative 项目的 build-pipeline 项目,这个项目是为了给 build 模块增加 pipeline 的功能,但是随着不同的功能加入到 Knative build 模块中,build 模块越来越变得像一个通用的 CI/CD 系统,于是,索性将 build-pipeline 剥离出 Knative,就变成了现在的 Tekton,而 Tekton 也从此致力于提供全功能、标准化的云原生 CI/CD 解决方案。
我是阳明
2020/06/15
1.1K0
Tekton系列之理论篇【二】
上一篇文章我们介绍了Tekton的安装并且做了简单的测试,但是我们并不知其所以然,而这篇文章主要带大家来了解以及学习所以然。
没有故事的陈师傅
2022/04/05
8244
Tekton系列之理论篇【二】
Tekton系列之实践篇-我的第一条Pipeline
前面已经完成了Tekton的安装和理论知识的介绍,如果你认真的看完了文章,相信你会有所收获。
没有故事的陈师傅
2022/04/05
8840
Tekton系列之实践篇-我的第一条Pipeline
Tekton入门介绍
Tekton 是一个强大、灵活的构建 CI/CD 流水线系统的开源框架,允许开发者构建、测试和发布应用。Tekton 是云原生的,通过定义 CRD ,让用户快速灵活定义流水线。
kinnylee
2021/04/19
3K0
tekton入门-pipline
PipelineRun允许您实例化并执行集群上的。A 以所需的执行顺序Pipeline指定一个或多个Tasks。一个PipelineRun 执行Tasks中Pipeline,直到所有的顺序,他们被指定Tasks已成功执行或出现故障。
有点技术
2020/07/13
1.5K0
Tekton 如何接入物理机进行构建
在文章《如何接入远程 macOS 物理机进行 Jenkins 流水线构建》中,我描述了在 Jenkins 中添加物理构建机的方法。这并不是我拍脑袋想的需求,而是当时真的有 ToB 的商业客户在咨询方案。
陈少文
2021/04/29
1.2K0
使用 Tekton 创建 CI/CD 流水线(2/2)
在前面文章中,我们在 Kubernetes 集群中安装了 Tekton,通过 Tekton 克隆 GitHub 代码仓库并执行了应用测试命令。接着前面的内容,本文我们将创建一个新的 Task 来构建一个 Docker 镜像并将其推送到 Docker Hub,最后,我们将这些任务组合成一个流水线。
我是阳明
2020/06/15
9420
Tekton实践篇-Tekton和Argocd的梦幻联动
前面的一系列文章基本已经把Tekton相关的知识介绍完了,如果你认真的看完并且实践过,相信你对Tekton已经有一定的掌握了。
没有故事的陈师傅
2022/05/23
2K0
Tekton实践篇-Tekton和Argocd的梦幻联动
早知道有这么个吊炸天的 CI&CD 工具,我就不用 Jenkins 了!
提到运维自动化,我们就不得不提起 Jenkins 这个工具,它是一个功能强大且灵活的持续集成工具,适用于各种规模的软件项目,并能够通过自动化和集成化的方式提高软件开发和测试的效率。
民工哥
2024/05/14
2.1K0
早知道有这么个吊炸天的 CI&CD 工具,我就不用 Jenkins 了!
如何借助 Tekton 实现微服务的 Pipeline
在微服务架构中,应用程序是由多个相互连接的服务组成的,这些服务协同工作以实现所需的业务功能。所以,一个典型的企业级微服务架构如下所示:
深度学习与Python
2021/11/12
9220
Tekton 概念篇 - 好大一盘棋
我在文档 软件产品是团队能力的输出 中提到,软件产品是解决方案的交付承载物,其优劣取决于团队对核心问题的理解。对领域有深入理解,交付的产品才有好的可能。CICD 是一个应用很广泛的领域,在不同的场景下,总有人在琢磨重复造轮子,难以统一。
陈少文
2020/12/14
2K0
Tekton 概念篇 - 好大一盘棋
创建 Tekton 流水线
前面我们创建的两个任务 test 和 build-and-push 都已经完成了,我们还可以创建一个流水线来将这两个任务组织起来,形成一个流水线,这里就是我们要使用的 Pipeline 这个 CRD 对象。
我是阳明
2021/06/25
6870
创建 Tekton 流水线
开源 Kubernetes 原生 CI/CD 框架 Tekton 探秘及使用
tektoncd/pipeline(以下简称pipeline) 是一套适用于k8s的开源的CI/CD框架。它依赖k8s的一些特性,实现了CI/CD 中的流程的控制。但其中绝大部分的流程控制逻辑的实现是在它自身的Base Image。
灵雀云
2020/01/02
1.4K0
Tekton实现java项目部署到k8s的完整CICD流程
上一篇文件 Tekton介绍 介绍了Tekton、Tekton的安装教程、以及使用Tekton实现简单的HelloWorld,这篇文章通过复杂的项目实现完整的CI/CD流程来了解Tekton的使用。
kinnylee
2021/04/19
5.3K3
Tekton实现java项目部署到k8s的完整CICD流程
Tekton系列之实践篇-使用Tekton Trigger让Tekton使用更简单
在《Tekton实践篇-如何用Jenkins来管理Tekton》我们介绍了如何使用Jenkins来管理Tekton,这种方式是运维主动式管理,也就是需要运维去触发发布,那有没有可能让自动触发Tekton PipelineRun的运行呢?
没有故事的陈师傅
2022/05/23
1.1K0
Tekton系列之实践篇-使用Tekton Trigger让Tekton使用更简单
相关推荐
Tekton Pipeline教程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文