1. 创建第一个Tekton Pipeline

任务目标

本案例将使用 Tekton 定义并运行一个包含 clone、build、push 三个 Task 的简单 Pipeline,验证 Tekton 的基本流程。你将创建必要的 Tekton 资源(Task、Pipeline、PipelineRun),并通过 tkn 命令行工具触发运行,最终确认 Pipeline 的三个步骤依次成功执行。

环境准备

开始前请确认以下环境已就绪:

  • 一个可用的 Kubernetes 集群(v1.21+)
  • Tekton Pipelines 已安装(v0.40+),可通过 kubectl get pods -n tekton-pipelines 验证
  • Tekton CLI(tkn)已安装
  • 一个可访问的容器镜像仓库(本案例以 Docker Hub 为例,请替换为自己的仓库地址)

实现代码

以下 YAML 定义了一个完整的 Tekton Pipeline 资源,包含三个 Task 及对应的 PipelineRun。将全部内容保存为 pipeline.yaml:

---
apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: clone
spec:
  params:
    - name: repo-url
      type: string
  steps:
    - name: git-clone
      image: alpine/git:latest
      script: |
        git clone $(params.repo-url) /workspace/source
---
apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: build
spec:
  params:
    - name: image-name
      type: string
  workspaces:
    - name: source
  steps:
    - name: docker-build
      image: docker:stable
      script: |
        cd /workspace/source
        docker build -t $(params.image-name) .
      volumeMounts:
        - name: docker-socket
          mountPath: /var/run/docker.sock
  volumes:
    - name: docker-socket
      hostPath:
        path: /var/run/docker.sock
---
apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: push
spec:
  params:
    - name: image-name
      type: string
  steps:
    - name: docker-push
      image: docker:stable
      script: |
        docker push $(params.image-name)
      volumeMounts:
        - name: docker-socket
          mountPath: /var/run/docker.sock
  volumes:
    - name: docker-socket
      hostPath:
        path: /var/run/docker.sock
---
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
  name: simple-pipeline
spec:
  params:
    - name: repo-url
      type: string
    - name: image-name
      type: string
  workspaces:
    - name: shared-workspace
  tasks:
    - name: clone
      taskRef:
        name: clone
      params:
        - name: repo-url
          value: $(params.repo-url)
    - name: build
      taskRef:
        name: build
      runAfter: [clone]
      params:
        - name: image-name
          value: $(params.image-name)
      workspaces:
        - name: source
          workspace: shared-workspace
    - name: push
      taskRef:
        name: push
      runAfter: [build]
      params:
        - name: image-name
          value: $(params.image-name)
---
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
  name: simple-pipeline-run
spec:
  pipelineRef:
    name: simple-pipeline
  params:
    - name: repo-url
      value: "https://github.com/your-username/your-repo.git"
    - name: image-name
      value: "your-dockerhub-username/your-image:latest"
  workspaces:
    - name: shared-workspace
      volumeClaimTemplate:
        spec:
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 1Gi

注意:上述代码中的 repo-url 和 image-name 参数值需要替换为你实际使用的 Git 仓库地址和镜像仓库地址。示例仓库中需包含 Dockerfile 才能完成 build 步骤。

运行与验证

按照以下步骤执行并验证 Pipeline:

  1. 应用资源定义:
kubectl apply -f pipeline.yaml
  1. 启动 PipelineRun(如果上一步已自动创建,可跳过):
tkn pipeline start simple-pipeline \
  --param repo-url=https://github.com/your-username/your-repo.git \
  --param image-name=your-dockerhub-username/your-image:latest \
  --workspace name=shared-workspace,claimName=tekton-pvc \
  --showlog

若使用 kubectl apply 已创建 PipelineRun,则直接观察日志:

tkn pipelinerun logs simple-pipeline-run -f
  1. 验证结果:
tkn pipelinerun list

通过条件:

  • tkn pipelinerun list 中 simple-pipeline-run 的 STATUS 显示为 Succeeded。
  • 日志中依次出现 git-clone、docker-build、docker-push 三个步骤,且均以 COMMAND SUCCEEDED 结束。
  • 登录你的镜像仓库,确认 your-image:latest 已被成功推送。

常见问题

  • clone 步骤失败:确认 Git 仓库地址可公开访问,或已配置对应的 Secret 用于认证。
  • build 步骤无法连接 Docker 守护进程:当前实现使用 hostPath 挂载宿主机 Docker socket,仅适用于单节点测试环境。生产环境建议使用 Kaniko 或 Buildah 替代。
  • push 步骤认证失败:执行 docker login 登录仓库,或在集群中为 Docker 配置 config.json 类型的 Secret 并挂载到步骤中。