Tekton系列之实践篇-如何用Jenkins来管理Tekton

简介: Tekton系列之实践篇-如何用Jenkins来管理Tekton

《Tekton系列之实践篇-由Jenkins改成Tekton》中,我们可以将Jenkinsfile改成Tekton Pipeline,但是Tekton有一个很大的问题是不能很好的划分权限,特别是在Dashboard上根本就做权限控制,那如果在实际中使用的话权限不明会带来很多问题,比如谁删了什么,谁执行了什么都不知道。


如果你公司有自动化运维平台,可以接入Tekton,如果没有就需要在Github上找是否有相关的Dashboard或者平台,可惜我什么都没有.....


目前我使用的Kubesphere来管理K8s集群以及流水线,所以我就在想怎么使用kubesphere管理。不过截止目前版本,Kubesphere的流水线引擎还是Jenkins,除非二开,不然没办法直接继承Tekton,期待Kubesphere把Tekton也加入(https://github.com/kubesphere/community/blob/master/sig-advocacy-and-outreach/summer-ospp/kubeSphere-tekton-integration_zh-CN.md)。


那应该怎么做呢?我想到一个很牛逼(SB)的办法,如下:


640.png


看懂了么?


其实就是继续使用Jenkins做Kubesphere的流水线引擎,然后将Jenkins和Tekton进行打通,这样是不是间接使用了Tekton?这是不是一个很牛逼(SB)的idea?


但是悲剧来了,Jenkins的Tekton插件要求Jenkins最低的版本是2.263,而Kubesphere的Jenkins版本是2.49,而且升级非常麻烦,麻烦到官方都不建议升级的地步。所以这里只能退而求其次,使用Jenkins来进行实验了。


部署Jenkins


Jenkins的部署方式有很多,这里采用Helm的方式来部署,简单快捷。


首先需要安装Helm命令,见文档(https://helm.sh/docs/intro/install/)。


接着安装Jenkins,如下:


helm repo add jenkinsci https://charts.jenkins.io
helm repo update
# 我习惯把CHART下载到本地,方便管理
helm pull jenkinsci/jenkins
# 这里有一步解压的过程,然后进入Jenkins目录进行部署
# 部署
kubectl create ns devops
helm install jenkins -n devops .


部署完成后即可进行登录了。


访问地址要么使用NodePort,要么使用ingress,这里没有展示配置过程。


安装Jenkins插件


为了实现上面的需求,我找到一个Jenkins插件可以用来管理Tekton,插件名叫tekton-client-plugin tekton-client-plugin(https://github.com/jenkinsci/tekton-client-plugin)。


tekton-client-plugin用来打通Jenkins和Tekton,功能也不复杂,可以到文档(https://plugins.jenkins.io/tekton-client/#documentation)进行学习。


如果Jenkins版本大于2.263,可以直接在插件中心下载,如下:


640.png


配置权限


这里是权限是Jenkins操作Tekton的权限,如下:


kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: tekton-role
  namespace: tekton-devops-pipeline
rules:
  - apiGroups:
      - ""
    resources:
      - pods
      - pods/log
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - tekton.dev
    resources:
      - tasks
      - taskruns
      - pipelines
      - pipelineruns
    verbs:
      - create
      - delete
      - deletecollection
      - get
      - list
      - patch
      - update
      - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: tekton-role-binding
  namespace: tekton-devops-pipeline
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: tekton-role
subjects:
  - kind: ServiceAccount
    name: jenkins
    namespace: devops


注意授权的serviceaccount和namespace。


编写Jenkinsfile


要使用的Jenkinsfile其实很简单。但是由于我们是多分支发布,所以Jenkinsfile如下:


pipeline {
  agent any
  parameters {
        choice(description: '选择分支',  name: 'BRANCH_NAME', choices: ['dev', 'test', 'uat', 'pre', 'prod'])
    }
  stages {
    stage('deploy to dev'){
        when{
          expression {
            return "$BRANCH_NAME".contains('dev')
          }
        }
        steps{
            tektonCreateRaw input: 'deploy/dev/pipeline.yaml', inputType: 'FILE', namespace: 'tekton-devops-pipeline'
        }
    }
    stage('deploy to test'){
        when{
          expression {
            return "$BRANCH_NAME".contains('test')
          }
        }
        steps{
            tektonCreateRaw input: 'deploy/test/pipeline.yaml', inputType: 'FILE', namespace: 'tekton-devops-pipeline'
        }
    }
    stage('deploy to uat'){
        when{
          expression {
            return "$BRANCH_NAME".contains('uat')
          }
        }
        steps{
            tektonCreateRaw input: 'deploy/uat/pipeline.yaml', inputType: 'FILE', namespace: 'tekton-devops-pipeline'
        }
    }
    stage('deploy to pre'){
        when{
          expression {
            return "$BRANCH_NAME".contains('pre')
          }
        }
        steps{
            tektonCreateRaw input: 'deploy/pre/pipeline.yaml', inputType: 'FILE', namespace: 'tekton-devops-pipeline'
        }
    }
    stage('deploy to prod'){
        when{
          expression {
            return "$BRANCH_NAME".contains('prod')
          }
        }
        steps{
            tektonCreateRaw input: 'deploy/prod/pipeline.yaml', inputType: 'FILE', namespace: 'tekton-devops-pipeline'
        }
    }
  }
}


Tekton的PipelineRun按目录分级,如下(这里只是为了方便,其实可以只用一个PipelineRun):


640.png


弄完过后,就可以创建流水线了,如下创建一个hello-world-test的流水线。


640.png


然后选择对应的分支进行部署。可以看到触发了Tekton的PipelineRun,如下:


640.png


不过Jenkins这边还有如下问题:


[Checks API] No suitable checks publisher found.
Failed: null
java.lang.NullPointerException
 at org.waveywaves.jenkins.plugins.tekton.client.build.create.CreateRaw.createPipelineRun(CreateRaw.java:278)
 at org.waveywaves.jenkins.plugins.tekton.client.build.create.CreateRaw.createWithResourceSpecificClient(CreateRaw.java:168)
 at org.waveywaves.jenkins.plugins.tekton.client.build.create.CreateRaw.runCreate(CreateRaw.java:429)
 at org.waveywaves.jenkins.plugins.tekton.client.build.create.CreateRaw.perform(CreateRaw.java:393)
 at org.jenkinsci.plugins.workflow.steps.CoreStep$Execution.run(CoreStep.java:101)
 at org.jenkinsci.plugins.workflow.steps.CoreStep$Execution.run(CoreStep.java:71)
 at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
 at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
 at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
 at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
 at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
 at java.base/java.lang.Thread.run(Thread.java:829)
[Checks API] No suitable checks publisher found.


虽然报这个错,但是Tekton PipelineRun触发没问题,具体原因还待排查,这就非常尴尬了。看到下面这一串串的红色,心凉了一半(Tekton实际是可以允许成功)。


640.png


最后


其实这篇实践不算完成,Jenkins的问题还没有解决,在网上查了半天资料也没什么效果,很多说是Jenkins Check-API 插件的原因,但是没有去测试。


不过,从理论上用Jenkins来管理Tekton是可行的,而且对于Jenkins重度用户来说,也算是比较不错的事情。当然我更想使用类似于Kubesphere这类来管理,期待Kubesphere把Tekton集成进去。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
jenkins 持续交付 数据安全/隐私保护
企业实战(23)基于Docker平台的Jenkins凭据管理与应用(4)
企业实战(23)基于Docker平台的Jenkins凭据管理与应用(4)
|
1月前
|
jenkins Devops Java
DevOps实践:Jenkins在持续集成与持续部署中的价值
【10月更文挑战第27天】在快速发展的软件开发领域,DevOps实践日益重要。Jenkins作为一款流行的开源自动化服务器,在持续集成(CI)和持续部署(CD)中扮演关键角色。本文通过案例分析,探讨Jenkins在Java项目中的应用,展示其自动化构建、测试和部署的能力,提高开发效率和软件质量。
59 2
|
1月前
|
jenkins Devops 测试技术
DevOps实践:Jenkins在持续集成与持续部署中的价值
【10月更文挑战第26天】随着DevOps理念的普及,Jenkins作为一款开源自动化服务器,在持续集成(CI)与持续部署(CD)中发挥重要作用。本文通过某中型互联网企业的实际案例,展示了Jenkins如何通过自动化构建、持续集成和持续部署,显著提升开发效率、代码质量和软件交付速度,帮助企业解决传统手工操作带来的低效和错误问题。
73 4
|
2月前
|
运维 监控 jenkins
运维自动化实践:利用Jenkins实现高效CI/CD流程
【10月更文挑战第18天】运维自动化实践:利用Jenkins实现高效CI/CD流程
|
4月前
|
jenkins Java API
jenkins API实践
jenkins API实践
|
7月前
|
JavaScript jenkins 持续交付
Jenkins自动化构建Vue项目的实践
在现代的Web开发中,Vue.js已经成为一种非常流行的JavaScript框架。为了更高效地管理和部署Vue.js项目,使用自动化构建工具是至关重要的。Jenkins作为一款强大的持续集成和持续部署(CI/CD)工具,为我们提供了一种便捷的方式来自动化构建Vue.js项目。本文将介绍如何在Jenkins中配置和使用自动化构建Vue.js项目的步骤。
179 1
Jenkins自动化构建Vue项目的实践
|
7月前
|
jenkins 持续交付 开发工具
Jenkins 插件管理指南
常用插件 Docker Plugin: 这个插件让Jenkins能够与Docker容器平台进行集成。它允许在Jenkins构建过程中创建、管理和销毁Docker容器,为需要Docker化的项目提供了极大的便利性。对于需要在容器中构建或部署应用程序的项目,这个插件可以帮助简化流程,提高效率。 Git Plugin: Git插件是Jenkins中最基本和最常用的插件之一。它允许Jenkins与Git版本控制系统集成,通过拉取代码并触发构建来实现持续集成。对于几乎所有需要版本控制的项目,这个插件是不可或缺的,为构建和部署流程提供了必要的代码管理支持。 Email Extension Plugin:
202 2
|
jenkins 持续交付 网络安全
jenkins凭证管理
jenkins凭证管理
105 0
|
存储 前端开发 jenkins
实践:部署Jenkins服务并开发MERN应用的CI/CD构建管道
为了解决这个问题,我们可以创建一个 CI/CD流水线。因此,每当您添加功能或修复错误时,都会触发此管道。这会自动执行从测试到部署的所有步骤。
289 0
|
jenkins 持续交付
Jenkins 利用Dashboard View插件管理任务视图
Jenkins 利用Dashboard View插件管理任务视图
420 0
下一篇
DataWorks