美文网首页
又一个CI/CD系统-Tekton

又一个CI/CD系统-Tekton

作者: wu_sphinx | 来源:发表于2020-11-19 10:48 被阅读0次

    Tekton是什么?

    Tekton 是一个强大且灵活的 Kubernetes 原生开源框架,可用于创建持续集成和交付 (CI/CD) 系统。该框架可让您跨多个云服务商或本地系统进行构建、测试和部署,而无需操心基础实现详情。

    从定义可知,Tekton是一种新的CI/CD系统,正如常见的Jenkins、Drone、GitLab CI做的事情一样,特殊之处在于它是生于Kubernetes,长于Kubernetes。

    安装Tekton

    因为Tekton运行环境依赖于k8s,所以我们首先必须得有一个k8s环境,笔者本地使用的是minikube,如下本地启动一个k8s

    minikube start -p k8s -v10 --image-mirror-country cn --iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.6.0.iso  --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --vm-driver=hyperkit --registry-mirror=https://dq4otk2m.mirror.aliyuncs.com --kubernetes-version=1.16.0
    

    集群启动以后就可以安装Tekton,按照官网的描述,可按如下安装

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

    不过,因于Tekton需要依赖众多gcr站点镜像,安装过程需要先预先准备好这些镜像,笔者使用github的action将这些镜像转移到了阿里云的镜像中心,并将Tekton的安装文件重新换成了阿里云的镜像地址,项目地址为:

    https://github.com/wusphinx/tektoncd-cn

    国内码云地址为:

    https://gitee.com/wucentaur/tektoncd-cn

    项目目录如下:

    ├── LICENSE
    ├── README.md
    ├── example
    │   ├── pipelineresource.yaml
    │   ├── task-test.yaml
    │   └── taskrun.yaml
    └── tekton
        ├── tekton-dashboard-release.yaml
        └── tekton.yaml
    

    如此,可以通过kubectl apply -f tekton/完成安装,顺带也把Tekton的dashboard也安装了,检查安装状态

    ➜  ~ kubectl get pods -n tekton-pipelines
    NAME                                          READY   STATUS    RESTARTS   AGE
    tekton-dashboard-5dcb9688bd-pls8b             1/1     Running   1          18h
    tekton-pipelines-controller-6564b64ff-7gwbc   1/1     Running   1          18h
    tekton-pipelines-webhook-5d6b9646b9-mr7jl     1/1     Running   1          18h
    

    使用

    既然是CI/CD系统,那流水线一定是必不可少的,前面说到Tekton生于k8s,所以才有了CRD定义的流水线,我们先定义获取代码仓库的资源

    apiVersion: tekton.dev/v1alpha1
    kind: PipelineResource
    metadata:
      name: tekton-example
    spec:
      type: git
      params:
        - name: url
          value: https://github.com/wusphinx/multistage
        - name: revision
          value: main
    

    简洁明了,如果代码仓库是gitlab,用gitlab ci来做,这一步是隐式的,用Jenkins的话,没有与gitlab集成的情况下,也需要显示配置。
    定义流水线任务(只是为了演示,当然你可以自定义其它任务)

    apiVersion: tekton.dev/v1beta1
    kind: Task
    metadata:
      name: test
    spec:
      resources:
        inputs:
        - name: repo
          type: git
      steps:
      - name: run-test
        image: golang:1.13-alpine
        workingDir: /workspace/repo
        env:
          - name: "GO111MODULE"
            value: "on"
          - name: "GOPROXY"
            value: "https://goproxy.cn,direct"
        command: ["go"]
        args: ["mod", "download"]
    

    任务的核心是对某个golang项目执行go mod download操作,PipelineResourceTask缺少一纽带联系起来,这个纽带就是TaskRun

    apiVersion: tekton.dev/v1beta1
    kind: TaskRun
    metadata:
      name: testrun
    spec:
      taskRef:
        name: test
      resources:
        inputs:
        - name: repo
          resourceRef:
            name: tekton-example
    

    示例都准备好了,可以直接执行

    ➜  ~ kubectl apply -f example/
    pipelineresource.tekton.dev/tekton-example created
    task.tekton.dev/test created
    taskrun.tekton.dev/testrun created
    

    可通过dashboard查看任务执行结果如下所示:


    image.png

    回头来看资源的作用就很容易理解了

    • PipelineResource: 流水线的资源,示例就是指代码仓库了
    • Task: 流水线要执行的任务与步骤定义
    • TaskRun:将资源与任务做关联并执行

    这么看若要完成一个流水线,至少要定义三类资源才行,这样代码跟CI/CD是分离的,需要在Tekton平台上做这些配置。当然因为Tekton本身就在k8s集群中,可以用尽k8s的资源调度优势,不过gitlab runner也可以安装在k8s中,从使用体验上来讲Tekton的优势并不明显,不过,这也是因为gitlab runner与gitlab是一家天然集成的缘故,Tekton的方式就是在做解耦,并无不妥。

    结论

    如此看来,Tekton是另一个CI/CD系统,抽象粒度很细,从实际使用效果来看并未带来明显的好处。最大的优势在于原生支持k8s,不过其它CI/CD平台也在向k8s靠拢,这个优势也并不十分突出。一点浅见,欢迎拍砖。

    参考:

    相关文章

      网友评论

          本文标题:又一个CI/CD系统-Tekton

          本文链接:https://www.haomeiwen.com/subject/pcpkiktx.html