使用 Tekton 在 Kubernetes 中编写你的第一个 CI/CD 流水线

Tekton 是一个 Kubernetes 原生的开源框架,用于创建持续集成和持续交付 (CI/CD) 系统。
48 位读者喜欢这篇文章。
Plumbing tubes in many directions

Tekton 是一个 Kubernetes 原生的开源框架,用于创建持续集成和持续交付 (CI/CD) 系统。它还通过抽象化底层实现细节,帮助在多个云提供商或本地系统上进行端到端(构建、测试、部署)应用程序开发。

Tekton 简介

Tekton 最初被称为 Knative Build,后来被重组为独立的开源项目,拥有自己的 治理组织 ,现在是 Linux 基金会 的一个项目。Tekton 提供集群内部的容器镜像构建和部署工作流程——换句话说,它是一个持续集成 (CI) 和持续交付 (CD) 服务。它由 Tekton Pipelines 和几个支持组件组成,例如 Tekton CLI、Triggers 和 Catalog。

Tekton 是一个 Kubernetes 原生应用程序。它作为 Kubernetes 集群上的扩展安装和运行,并包含一组 Kubernetes 自定义资源,这些资源定义了你可以创建和重用于你的流水线的构建块。由于它是一种 K-native 技术,Tekton 非常容易扩展。当你需要增加工作负载时,你只需向集群添加节点即可。由于其可扩展的设计以及社区贡献组件的存储库,它也很容易定制。

Tekton 非常适合需要 CI/CD 系统来完成工作的开发人员,以及为其组织中的开发人员构建 CI/CD 系统的平台工程师。

Tekton 组件

构建 CI/CD 流水线是一项影响深远的工作,因此 Tekton 为每一步都提供了工具。以下是 Tekton 提供的主要组件

  • Pipeline: Pipeline 定义了一组 Kubernetes 自定义资源 ,这些资源充当你用来组装 CI/CD 流水线的构建块。
  • Triggers: Triggers 是一种 Kubernetes 自定义资源 ,允许你基于从事件负载中提取的信息创建流水线。例如,你可以每次在 Git 仓库中打开合并请求时触发流水线的实例化和执行。
  • CLI: CLI 提供了一个名为 tkn 的命令行界面,允许你从终端与 Tekton 交互。
  • Dashboard: Dashboard 是 Tekton 流水线的基于 Web 的图形界面,显示有关流水线执行的信息。
  • Catalog: Catalog 是一个高质量的、社区贡献的 Tekton 构建块(任务、流水线等)的存储库,随时可在你自己的流水线中使用。
  • Hub: Hub 是一个基于 Web 的图形界面,用于访问 Tekton catalog。
  • Operator: Operator 是一种 Kubernetes Operator 模式 ,允许你在 Kubernetes 集群上安装、更新、升级和删除 Tekton 项目。
  • Chains: Chains 是一个 Kubernetes 自定义资源定义 (CRD) 控制器,允许你在 Tekton 中管理你的供应链安全。它目前仍在开发中。
  • Results: Results 旨在帮助用户逻辑地分组 CI/CD 工作负载历史记录,并将长期结果存储与流水线控制器分离。

Tekton 术语

  • Step: Step 是 CI/CD 工作流程中最基本的实体,例如为 Python Web 应用程序运行一些单元测试或编译 Java 程序。Tekton 使用提供的容器镜像执行每个步骤。
  • Task: Task 是特定顺序的步骤集合。Tekton 以 Kubernetes pod 的形式运行任务,其中每个步骤都成为 pod 中运行的容器。
  • Pipelines: Pipeline 是特定顺序的任务集合。Tekton 收集所有任务,将它们连接成有向无环图 (DAG),并按顺序执行该图。换句话说,它创建多个 Kubernetes pod,并确保每个 pod 按照预期成功完成运行。
  • PipelineRun: PipelineRun,顾名思义,是流水线的特定执行。
  • TaskRun: TaskRun 是任务的特定执行。当你选择在流水线之外运行任务时,TaskRun 也可用,你可以使用它来查看任务中每个步骤执行的详细信息。

创建你自己的 CI/CD 流水线

开始使用 Tekton 最简单的方法是编写你自己的简单流水线。如果你每天都使用 Kubernetes,你可能对 YAML 很熟悉,而这正是 Tekton 流水线的定义方式。这是一个克隆代码仓库的简单流水线示例。

首先,创建一个名为 task.yamll 的文件,并在你喜欢的文本编辑器中打开它。此文件定义你要执行的步骤。在本例中,它是克隆仓库,所以我将步骤命名为 clone。该文件设置了一些环境变量,然后提供了一个简单的 shell 脚本来执行克隆。

接下来是任务。你可以将步骤视为由任务调用的函数,而任务设置步骤所需的参数和工作区。

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
 name: git-clone
spec:
 workspaces:
   - name: output
     description: The git repo will be cloned onto the volume backing this Workspace.
 params:
   - name: url
     description: Repository URL to clone from.
     type: string
   - name: revision
     description: Revision to checkout. (branch, tag, sha, ref, etc...)
     type: string
     default: ""
 steps:
   - name: clone
     image: "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.21.0"
     env:
       - name: PARAM_URL
         value: $(params.url)
       - name: PARAM_REVISION
         value: $(params.revision)
       - name: WORKSPACE_OUTPUT_PATH
         value: $(workspaces.output.path)
     script: |
       #!/usr/bin/env sh
       set -eu

       CHECKOUT_DIR="${WORKSPACE_OUTPUT_PATH}"

       /ko-app/git-init \
         -url="${PARAM_URL}" \
         -revision="${PARAM_REVISION}" \
         -path="${CHECKOUT_DIR}"
       cd "${CHECKOUT_DIR}"
       EXIT_CODE="$?"
       if [ "${EXIT_CODE}" != 0 ] ; then
         exit "${EXIT_CODE}"
       fi
       # Verify clone is success by reading readme file.
       cat ${CHECKOUT_DIR}/README.md

创建第二个名为 pipeline.yaml 的文件,并在你喜欢的文本编辑器中打开它。此文件通过设置重要的参数(例如可以运行和处理任务的工作区)来定义流水线。

apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
 name: cat-branch-readme
spec:
 params:
   - name: repo-url
     type: string
     description: The git repository URL to clone from.
   - name: branch-name
     type: string
     description: The git branch to clone.
 workspaces:
   - name: shared-data
     description: |
       This workspace will receive the cloned git repo and be passed
       to the next Task for the repo's README.md file to be read.
 tasks:
   - name: fetch-repo
     taskRef:
       name: git-clone
     workspaces:
       - name: output
         workspace: shared-data
     params:
       - name: url
         value: $(params.repo-url)
       - name: revision
         value: $(params.branch-name)

最后,创建一个名为 pipelinerun.yaml 的文件,并在你喜欢的文本编辑器中打开它。此文件实际运行流水线。它调用流水线中定义的参数(这些参数又调用任务文件定义的任务)。

apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
 name: git-clone-checking-out-a-branch
spec:
 pipelineRef:
   name: cat-branch-readme
 workspaces:
   - name: shared-data
     volumeClaimTemplate:
       spec:
         accessModes:
           - ReadWriteOnce
         resources:
           requests:
             storage: 1Gi
 params:
   - name: repo-url
     value: https://github.com/tektoncd/pipeline.git
   - name: branch-name
     value: release-v0.12.x

将你的工作结构化为单独文件的优点是 git-clone 任务可以重用于多个流水线。

例如,假设你想为流水线项目进行端到端测试。你可以使用 git-clone 任务来确保你拥有需要测试的最新代码副本。

总结

只要你熟悉 Kubernetes,开始使用 Tekton 就和采用任何其他 K-native 应用程序一样容易。它有很多工具可以帮助你创建流水线并与你的流水线交互。如果你热爱自动化,请尝试 Tekton!

接下来阅读
Open Enthusiast, Open Source Evangelist
印度,班加罗尔

评论已关闭。

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.