前提:

你有一个可以访问的 kubernetes 集群;

你已经部署起来了 tekton pipeline, 以及 tekton dashboard;(可以参考:如何部署起来 Tekton)

目标:

在 Tekton 环境中创建一个简单的 Task, 并且运行 Task;

在 Tekton 环境中创建一个 Pipeline, 调用 2个 Task;

在 Tekton 环境中创建一个 Pipeline, 从 gitee 获取代码,并且打印代码中的 README.md 文件内容(同样地,你也可以使用代码库来构建 Docker 镜像,部署到 kubernetes 集群);

一、创建一个简单的 Task, 以及一个 TaskRun 来执行任务

创建一个最简单的 task, 名称为 hello, 这个 task 使用 alpine 的镜像启动一个容器,执行指定脚本。

#hello-world.yaml 文件内容, 定义名称为 hello 的 task
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:name: hello
spec:steps:- name: echoimage: alpinescript: |#!/bin/shecho "Hello World"

部署 Task:
    kubectl apply --filename hello-world.yaml

创建一个 TaskRun 来执行 hello 这个 Task

#hello-world-run.yaml
apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:name: hello-task-run
spec:taskRef:name: hello

在集群中运行 task:
    kubectl apply --filename hello-world-run.yaml

二、创建一个调用2个 Task 的 Pipeline, 以及一个 TaskRun 来执行任务

再创建一个名称 goodbye 的 task, 内容如下

#goodbye-world.yaml
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:name: goodbye
spec:steps:- name: goodbyeimage: ubuntuscript: |#!/bin/shecho "Goodbye World!"

部署 Task:
    kubectl apply --filename goodbye-world.yaml

创建并运行一个包含2个 task 的 pipeline:

#hello-goodbye-pipeline.yaml
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:name: hello-goodbye
spec:tasks:- name: hellotaskRef:name: hello- name: goodbyerunAfter:- hellotaskRef:name: goodbye

部署 Pipeline:
    kubectl apply --filename hello-goodbye-pipeline.yaml

使用 PipelineRun 对象来实例化一个 Pipeline, 即运行这个 Pipeline:

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

运行 Pipeline(创建和执行 PipelineRun):
kubectl apply --filename hello-goodbye-pipeline-run.yaml

你也可以在 tekton dashbaord 中运行一个 pipeline。具体的截图参考后面步骤三的例子。

前面的 Pipeline 和 Task 可以合并到一起

# multi-task-pipeline.yaml
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:name: hello
spec:steps:- name: echoimage: alpinescript: |#!/usr/bin/env shecho "Hello World"
---
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:name: goodbye
spec:steps:- name: goodbyeimage: ubuntuscript: |#!/usr/bin/env shecho "Goodbye World!"
---
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:name: multiple-task-pipeline
spec:tasks:- name: hellotaskRef:name: hello- name: goodbyerunAfter:- hellotaskRef:name: goodbye

然后一次性部署:

kubectl apply -f multi-task-pipeline.yaml

三、最简化调用2个 Task 的 Pipeline 的配置

上面的定义里面, 两个 task 的定义看起来很累赘, 可以在 pipeline 里面内嵌定义 task:

# simple-multi-task-pipeline.yaml
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:name: simple-multi-task-pipeline
spec:tasks:- name: hellotaskSpec:steps:- image: alpinescript: |#!/bin/shecho "Hello world!"- name: goodbyerunAfter:- hellotaskSpec:steps:- image: alpinescript: |#!/bin/shecho "Goodbye world!"

部署 Pipeline,

kubectl apply -f simple-multi-task-pipeline.yaml

接下来如何执行这个 Pipeline , 可以定义一个 PipelineRun 通过 kubectl 来执行,也可以在 tekton dashboard 的管理页面上触发这个Pipeline 的执行,以 dashboard 为例:

在 Dashboard 的 PipelineRuns 列表页, 点进去看执行的详情,可以看到执行结果如下:

上面截图是 Tekton Dashboard 的端口 forward 到本地之后访问的页面。

Tekton Dashboard 的部署可以参考:如何部署起来 Tekton

四、创建一个 Pipeline, 包含 git-clone, 并且显示出代码库的 README.md 文件内容

可以使用 tekton hub 中的 git-clone 这个 task 来获取 git 仓库的代码。 参考:

Tekton Hub

为了使用 git-clone 这个 task, 需要部署这个 task 到 tekton 中。

Step 1. 安装 git-clone 这个 task

kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/main/task/git-clone/0.6/git-clone.yaml

或者使用 tekton cli 来安装:

tkn hub install task git-clone

tkn 是 tekton cli 的命令行,如果选择用 tkn 命令,需要安装 tekton cli (可选,如果使用 kubectl 来 从 tekton hub 仓库安装 git-clone 到 k8s 环境中,则不需要安装 tekton cli ):

https://tekton.dev/docs/cli/

Step 2. 部署一个包含 git clone 代码库,并且 cat README.md 来显示 readme 的 Pipeline

文件 git-clone-and-cat-readme.yaml 的内容:

apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:name: cat-branch-readme
spec:description: |cat-branch-readme takes a git repository and a branch name andprints the README.md file from that branch. This is an examplePipeline demonstrating the following:- Using the git-clone catalog Task to clone a branch- Passing a cloned repo to subsequent Tasks using a Workspace.- Ordering Tasks in a Pipeline using "runAfter" so thatgit-clone completes before we try to read from the Workspace.- Using a volumeClaimTemplate Volume as a Workspace.- Avoiding hard-coded paths by using a Workspace's pathvariable instead.params:- name: repo-urltype: stringdescription: The git repository URL to clone from.- name: branch-nametype: stringdescription: The git branch to clone.workspaces:- name: shared-datadescription: |This workspace will receive the cloned git repo and be passedto the next Task for the repo's README.md file to be read.tasks:- name: fetch-repotaskRef:name: git-cloneworkspaces:- name: outputworkspace: shared-dataparams:- name: urlvalue: $(params.repo-url)- name: revisionvalue: $(params.branch-name)- name: cat-readmerunAfter: ["fetch-repo"]  # Wait until the clone is done before reading the readme.workspaces:- name: sourceworkspace: shared-datataskSpec:workspaces:- name: sourcesteps:- image: zshusers/zsh:4.3.15script: |#!/usr/bin/env zshcat $(workspaces.source.path)/README.md
---
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:name: git-clone-checking-out-a-branch
spec:pipelineRef:name: cat-branch-readmeworkspaces:- name: shared-datavolumeClaimTemplate:spec:accessModes:- ReadWriteOnceresources:requests:storage: 20Giparams:- name: repo-urlvalue: https://gitee.com/geektime-geekbang/django.git- name: branch-namevalue: master

这里几个地方要注意,

1). 这个 Pipeline 里面定义了一个 fetch-repo 任务,这个任务使用前面安装的 git-clone task,

2). 这个 git-clone 任务里面,git url 是通过 Pipeline 里面定义的参数来引用的。这个动态的参数,可以在 PipelineRun 里面指定, 意味着在 PipelineRun 的定义, 或者 Tekton Dashboard 的界面上运行一个 Pipeline 时可以指定。 参数也可以设置默认值。

3). 除了 fetch-repo 这个任务,还定义了一个名称为 cat-readme 的任务,这个任务使用了自定义的镜像 zshusers/zsh:4.3.15 来启动一个容器,运行脚本。

部署这个 Pipeline (由于里面也定义了一个 PipelineRun,因此同时会执行这个 Pipeline) :

kubectl apply -f git-clone-and-cat-readme.yaml

部署完,在 dashboard 上面检查 PipelineRun, 能看到执行的结果, http://localhost:9097

后面也可以继续通过 tekton dashboard 来执行一个 Pipeline。

你可以选择在 Pipelines 页面 或者 PipelineRuns 页面触发执行,如果 Pipeline 有参数,界面上面可以指定参数,比如在Pipelines 列表页, pipeline 右侧点击执行图标,来手工创建一个 PipelineRun:

创建 PipelineRun 的时候,可以设定动态的参数,如下:

这是运行成功和失败的 PipelineRun 记录:

这是运行成功的日志:

五、执行前面任务的常见问题

问题一, 在控制台,能看到  Back-off pulling image 的错误:

container:   step-clone name:   clone waiting: message:   'Back-off pulling image "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.29.0"' reason:   ImagePullBackOff

这是因为在 git-clone.yaml 里面有用到 gcr.io 的镜像。 
重新下载 git-clone.yaml, 然后更改里面的镜像文件的仓库路径,然后再部署 git-clone 的 task :
kubetcl delete -f https://raw.githubusercontent.com/tektoncd/catalog/main/task/git-clone/0.6/git-clone.yaml
wget https://raw.githubusercontent.com/tektoncd/catalog/main/task/git-clone/0.6/git-clone.yaml
vim git-clone.yaml

编辑里面的 gcr.io,比如做如下的替换 (你可以直接用 下面这个 docker.io 里面的镜像):
gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.29.0
→ ihopeit/tekton-git-init:v0.29.0

如果要自己通过代理把镜像 pull 下来,push 到自己的仓库,可以这么干(先要在本地启动 docker 服务,或者你可以使用 podman ):
docker pull gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.29.0
docker tag  gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.29.0 xxxx/tekton-git-init:v0.29.0
docker push xxxx/tekton-git-init:v0.29.0

kubectl delete -f git-clone-and-cat-readme.yaml
kubectl apply -f git-clone-and-cat-readme.yaml

问题二,it contains Tasks that don't exist

如果前面第1步没有执行,在 k8s/tekton 中缺少 git-clone 这个 task 的定义。 会执行失败, 从 tekton 的日志或者 dashboard 上能看到报错信息如下:
Pipeline default/cat-branch-readme can't be Run; it contains Tasks that don't exist: Couldn't retrieve Task "git-clone": tasks.tekton.dev "git-clone" not found

Tekton之二:如何使用 Tekton 创建 CICD 流水线相关推荐

  1. Tekton之三:快速理解 Tekton 是如何工作的

    Tekton 是云原生环境下面的非常强大的 CICD 产品. 如果你按照 Tekton 的官方文档来学习,使用 Tekton, 可能会跟遇到很多障碍. Tekton 的技术架构非常优秀,同时Tekto ...

  2. Tekton系列之实践篇-使用Tekton Trigger让Tekton使用更简单

    微信公众号:运维开发故事,作者:乔克 在<Tekton实践篇-如何用Jenkins来管理Tekton>我们介绍了如何使用Jenkins来管理Tekton,这种方式是运维主动式管理,也就是需 ...

  3. arcgis api for flex 开发入门(二)map 的创建

    arcgis api for flex 开发入门(二)map 的创建 在flex 中创建一个esri 的map ,你只需要使用<esri:Map>标签就可以轻松完成. 在<esri: ...

  4. firefox扩展开发(二):用XUL创建窗口控件

    firefox扩展开发(二):用XUL创建窗口控件 2008-06-11 16:57 1.创建一个简单的窗口 <?xml version="1.0"?> <?xm ...

  5. [Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档

    [Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档 楼主  发表于 2013-5-21 22:00:51 | 查看: 475| 回复: 0 使用DOM创建和操作XML文档 版权声明 该 ...

  6. 二维数组 类型_Java第六章 | 二维数组的创建及使用、数组排序算法

    二维数组的创建及使用 1.二维数组的创建 2.二维数组初始化 3.使用二维数组 二维数组的创建 声明二维数组的方法有两种,语法如下所示: 数组元素类型 数组名字[ ][ ]; 数组元素类型[ ][ ] ...

  7. NX二次开发-UFUN创建圆柱UF_MODL_create_cyl1

    NX二次开发-UFUN创建圆柱UF_MODL_create_cyl1 NX9+VS2012#include <uf.h> #include <uf_modl.h> #inclu ...

  8. 区块链DApp从零开始学 (二) | 超详细 DApp创建 | 发行代币token | 宠物领养

    初学记录 · 欢迎交流 区块链DApp从零开始学 (一) | DApp抓包 区块链DApp从零开始学 (二) | 超详细 DApp创建 | 发行代币token |宠物领养 区块链知识 (一) | 实例 ...

  9. NX二次开发-UFUN创建工程图注释UF_DRF_create_note

    NX二次开发-UFUN创建工程图注释UF_DRF_create_note NX9+VS2012#include <uf.h> #include <uf_drf.h> #incl ...

最新文章

  1. iOS 十六进制的颜色值转换为UIColor
  2. 系统下装软件_电力二次设备自动测试系统
  3. postgresql常用数据类型:数值、日期、字符串类型
  4. CSS清除默认样式,经典好文
  5. Toad for Oracle9.7中导入数据库以后,数据有中文乱码:
  6. vue 项目上传到码云 解决push失败
  7. HTTP Error 415: Unsupported Media Type! 这个错误
  8. linux下的C语言开发(进程创建)
  9. jsp常用内置对象---response
  10. 每次开机都要选择Windwos10才能进系统的原因及解决方法-- 【亲测有效】
  11. 完整的元器件选型指南
  12. Java 图形界面开发--图文并茂建立学生管理系统
  13. VMware Workstation 虚拟机下载及安装的详细步骤
  14. 【转】高通平台android 环境配置编译及开发经验总结
  15. 三星s8怎么分屏操作_三星Galaxy Z Fold2帮你应对快节奏生活
  16. 理解exponential weighted || 指数
  17. Apollo配置中心介绍,多环境,分布式等
  18. 阿里点赞立法惩治刷单炒信:坚决拥护、全力支持
  19. cmd:发生系统错误 5。拒绝访问解决方法
  20. 奇安信和深信服哪个好_网络安全头部公司全面比较

热门文章

  1. 素数 android10万以内,10万以内的质数表?
  2. 小程序setData数据量大时,导致卡顿怎么解决
  3. 30个很有效的破冰游戏_20170513210952
  4. 虚继承的概念及其作用,虚继承与一般继承的区别
  5. 鸟哥Linux学习之——数据流重定向
  6. 2023年最新的区块链交易所开发的架构方案
  7. Chia官方:有关Chia官方矿池的重要解读,费率更加透明,爆块更稳定
  8. Python升级到最新版本代码
  9. 25岁以后还适合花钱学编程,当程序员吗?
  10. flask之flash