当前位置:首页 > 问答 > 正文

带你一步步搞定Tekton流水线,边学边做不怕复杂的那种

【来源:Cloudbees官方博客、Tekton官方文档、个人实践总结】

好,咱们就直接开干,用最实在的方式把Tekton这个流水线工具给整明白,你别看它名字听起来挺专业的,其实拆开来看,就是一堆按你规矩办事的“小机器人”,我们一步一步把它们组装起来,让它们帮我们自动打包代码、跑测试、部署应用,下面我就带你亲手搭一个最简单的流水线,目标是:当我把代码推到Git仓库时,流水线能自动把代码拉过来,然后打个“Hello World”的包。

第一步:先得有个地方让“小机器人”干活——安装Tekton

Tekton是跑在Kubernetes(K8s)里的,所以你首先得有一个K8s集群,如果你本地有Minikube或者Docker Desktop(开启了Kubernetes功能),那就足够了,安装Tekton本身超级简单,就用K8s的命令行工具kubectl就行。【来源:Tekton官方安装指南】

打开你的终端,输入下面这条命令:

kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml

这条命令就像是去应用商店下载并安装一个大型软件,你需要稍微等一会儿,让K8s把Tekton需要的各种组件(比如控制器、Webhook什么的)都创建好,你可以用 kubectl get pods --namespace tekton-pipelines 命令瞅一眼,等到所有Pod的状态都变成“Running”了,就说明安装成功了。

第二步:认识最基础的“乐高积木”——Task(任务)

Tekton流水线是由一个个Task组成的,Task就是一个个独立的任务单元,克隆代码”、“编译项目”、“构建镜像”,每个Task里又可以包含一个或多个Step(步骤),每个Step就是一个具体的操作,跑在一个独立的容器里。

我们来定义第一个Task,它的活儿很简单:就是在屏幕上打印一句“Hello World”,我们用一个YAML文件来定义它,比如叫 hello-task.yaml:【来源:Tekton概念文档】

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: hello-task
spec:
  steps:
    - name: say-hello
      image: alpine
      command: ["echo"]
      args: ["Hello, World! This is my first Tekton Task!"]

我来解释一下这个“说明书”:

  • apiVersionkind:告诉K8s“我要创建一个Tekton的Task资源”。
  • metadata.name:给这个Task起个名字,叫hello-task,方便后面找它。
  • spec.steps:定义这个Task具体要干的步骤列表。
  • steps[0].name:给这个步骤起个名,say-hello
  • steps[0].image:指定这个步骤在什么样的环境里运行,这里我们用最轻量的alpineLinux镜像。
  • commandargs:就是在这个alpine容器里要执行的命令,相当于在终端里输入 echo "Hello, ..."

写好这个文件后,用 kubectl apply -f hello-task.yaml 命令把它提交给K8s集群,这样我们就有了一个可用的Task。

第三步:让“小机器人”开始执行任务——创建TaskRun

Task定义好了,但它只是个模板,不会自己动,我们需要创建一个TaskRun来真正触发它执行,TaskRun就是Task的一次实际运行实例,再创建一个文件 hello-taskrun.yaml:【来源:Tekton TaskRun文档】

apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
  name: hello-taskrun
spec:
  taskRef:
    name: hello-task

这个文件更简单:

  • kind: 说明这是个TaskRun。
  • spec.taskRef.name: 告诉Tekton“请去运行那个名叫hello-task的Task”。

同样用 kubectl apply -f hello-taskrun.yaml 命令提交,提交之后,Tekton就会立刻开始执行这个任务。

带你一步步搞定Tekton流水线,边学边做不怕复杂的那种

第四步:看看“小机器人”干得咋样——查看日志

任务提交了,我们怎么知道它成功了呢?得看日志,先用 kubectl get taskruns 命令看看这个TaskRun的状态,如果STATUS显示Succeeded,就说明成功了。

我们可以查看这个TaskRun的详细日志:

kubectl logs --all-containers=true -f taskrun/hello-taskrun

注意,这里用的是 taskrun/hello-taskrun,而不是常见的Pod名字,执行后,你应该就能在终端上看到输出的“Hello, World! This is my first Tekton Task!”了,看到这行字,恭喜你!你的第一个Tekton任务已经成功跑起来了!

第五步:把积木拼起来——创建Pipeline(流水线)

单个Task没啥意思,Tekton的强大在于能把多个Task串成一个Pipeline(流水线),我们可以创建一个包含两个Task的Pipeline:第一个Task还是打印Hello,第二个Task打印Goodbye。

先定义第二个Task,goodbye-task.yaml

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: goodbye-task
spec:
  steps:
    - name: say-goodbye
      image: alpine
      command: ["echo"]
      args: ["Goodbye, see you next time!"]

创建Pipeline,把它俩按顺序串起来,文件叫 hello-goodbye-pipeline.yaml:【来源:Tekton Pipeline文档】

带你一步步搞定Tekton流水线,边学边做不怕复杂的那种

apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: hello-goodbye-pipeline
spec:
  tasks:
    - name: hello
      taskRef:
        name: hello-task
    - name: goodbye
      taskRef:
        name: goodbye-task
      runAfter: ["hello"]

这个Pipeline的spec.tasks里定义了两个任务:

  • 第一个任务hello,引用我们之前创建的hello-task
  • 第二个任务goodbye,引用goodbye-task,并且通过runAfter: ["hello"]明确指定它必须在hello任务完成之后才能运行。

kubectl apply 命令把这两个新的YAML文件提交上去。

第六步:运行整个流水线——创建PipelineRun

和Task需要TaskRun来触发一样,Pipeline需要PipelineRun来触发,创建 pipeline-run.yaml

apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
  name: hello-goodbye-pipeline-run
spec:
  pipelineRef:
    name: hello-goodbye-pipeline

提交这个文件:kubectl apply -f pipeline-run.yaml

第七步:验收成果

同样,用 kubectl get pipelineruns 查看状态,等它变成Succeeded,然后你可以分别查看每个Task的日志来验证顺序:

# 查看hello任务的日志
kubectl logs --all-containers=true -f taskrun/hello-goodbye-pipeline-run-hello-xxxxx
# 查看goodbye任务的日志
kubectl logs --all-containers=true -f taskrun/hello-goodbye-pipeline-run-goodbye-xxxxx

(注意:这里的TaskRun名字是自动生成的,格式是<pipelinerun名字>-<task名字>-<随机后缀>,你可以用 kubectl get taskruns 命令看到具体的名字)。

你会发现,Goodbye的信息一定是在Hello之后打印出来的,这说明流水线按照我们设定的顺序执行了。

好了,到这里,你已经亲手完成了Tekton最核心的几个概念和实践:安装环境、定义Task、运行TaskRun、组合Pipeline、运行PipelineRun,这就是最基础的“骨架”,虽然这个例子没做实际CI/CD的工作,但你已经知道了怎么让Tekton动起来,你只需要把echo命令换成git clone, npm install, docker build这些真实的命令,一个真正的自动化流水线就诞生了,别怕复杂,就是换汤不换药,本质都是让“小机器人”在容器里帮你执行命令而已。