1、Tekton

Tekton 是用于构建 CI/CD 管道的云原生解决方案。它由提供构建块的 Tekton Pipelines 和支持组件(如 Tekton CLI 和 Tekton Catalog)组成,这些组件使 Tekton 成为一个完整的生态系统。Tekton 是 Linux 基金会项目 CD Foundation 的一部分。Tekton 通过定义 CRD 的方式,让用户以灵活的自定义流水线以满足自身 CI/CD 需求。

Tekton 最主要的四个概念为:Task、TaskRun、Pipeline 以及 PipelineRun。

  • Task: Task 为构建任务,是 Tekton 中不可分割的最小单位,正如同 Pod 在 Kubernetes 中的概念一样。在 Task 中,可以有多个 Step,每个 Step 由一个 Container 来执行。

  • Pipeline: Pipeline 由一个或多个 Task 组成。在 Pipeline 中,用户可以定义这些 Task 的执行顺序以及依赖关系来组成 DAG(有向无环图)。

  • PipelineRun: PipelineRun 是 Pipeline 的实际执行产物,当用户定义好 Pipeline 后,可以通过创建 PipelineRun 的方式来执行流水线,并生成一条流水线记录。

  • TaskRun: PipelineRun 被创建出来后,会对应 Pipeline 里面的 Task 创建各自的 TaskRun。一个 TaskRun 控制一个 Pod,Task 中的 Step 对应 Pod 中的 Container。当然,TaskRun 也可以单独被创建。

综上可知:Pipeline 由多个 Task 组成,每次执行对应生成一条 PipelineRun,其控制的 TaskRun 将创建实际运行的 Pod。下面以一个简单例子来展示这些概念。首先,创建一个最简单的 Task,里面仅有一个 Step。在一个 ubuntu 镜像中执行 ls 命令。

接着创建一个 Pipeline,里面引用第一步中创建的 Task。

在 Pipeline 存在的前提下,就可以通过创建 PipelineRun 来运行 Pipeline。

这样就完成了一个最简单的 Tekton 流水线案例。每一个 PipelineRun 的创建,都会遵循 Pipeline 中的顺序规则去启动 Task 的 Pod。

2、Jenkins X

Jenkins X 的无服务器风格,或者有些人称之为 Jenkins X Next Generation,试图重新定义我们在 Kubernetes 集群内进行持续交付和 GitOps 的方式。它通过将相当多的工具组合到一个易于使用的包中来实现这一点。因此,大多数人不需要了解各个部分如何独立工作或如何集成的复杂性。相反,许多人只会将更改推送到 Git,然后让系统完成剩下的工作。但是,总有人想知道幕后发生了什么。为了满足那些对洞察力的渴望,我们将探索无服务器 Jenkins X 平台中涉及的流程和组件。了解 Git Webhook 发起的事件流程将使我们深入了解该解决方案的工作原理,并在以后深入了解每个新组件时为我们提供帮助。

一切都从推送到 Git 存储库开始,然后 Git 存储库将 Webhook 请求发送到集群。与传统 Jenkins 设置的不同之处在于,没有 Jenkins 来接受这些请求。相反,我们有 Prow 它可以做很多事情,但是,在 webhooks 的上下文中,它的工作是接收请求并决定下一步做什么。这些请求不仅限于推送事件,还包括我们可以通过拉取请求注释指定的斜杠命令(例如/approve)。

Prow 由几个不同的组件组成(deck、hook、crier、tide 等)。但是,我们不会详细介绍他们每个人的角色。目前,需要注意的重要一点是 Prow 是集群的入口点。它接收由 Git 操作(例如推送)或通过注释中的斜杠命令生成的 Git 请求。

Prow 在收到请求后可能会做很多事情。如果请求来自 Git 注释的命令,它可能会重新运行测试、合并拉取请求、分配人员或许多其他与 Git 相关的操作之一。如果 Webhook 通知它进行了新的推送,它将向 Jenkins X pipeline operator 发送请求,这将确保运行与定义的管道相对应的构建。最后,Prow 还将构建的状态报告回 Git。

Prow 负责 Git 和集群内进程之间的通信。

当 Prow hook 收到来自 Git webhook 的请求时,它会将其转发给 Jenkins X pipeline operator。

operator 的作用是从启动流程的存储库中获取 jenkins-x.yml 文件,并将其转换为 Tekton tasks 和 pipelines。

pipeline operator 简化了我们 CD 流程的定义,而 Tekton 则负责为每个项目/存储库定义管道的繁重工作。

Tekton 是一个非常低级的解决方案,不适合直接使用。编写 Tekton 定义可能非常痛苦且复杂。pipeline operator 通过易于学习和使用的 YAML 格式来定义管道,从而简化了这一过程。

Tekton 为每次推送到关联分支(主分支、PR)时启动的每个构建创建一个 PipelineRun。它执行我们验证推送所需的所有步骤。它运行测试,在注册表(Docker 注册表、Nexus 和 ChartMuseum)中存储二进制文件,并将版本部署到临时 (PR) 或永久 Stage 或 Prod 环境。