当前位置: 首页 > 科技观察

Tekton系列实践——如何使用Jenkins管理Tekton

时间:2023-03-14 08:22:43 科技观察

在《??Tekton系列之实践篇-由Jenkins改成Tekton??》中,我们可以将Jenkinsfile改成TektonPipeline,但是Tekton有个很大的问题,就是不能很好的划分权限,尤其是在Dashboard中,基本上权限控制都做了atall,而且如果在实践中使用,权限不明确会造成很多问题,比如谁删除了什么,谁执行了什么都不知道。如果你的公司有自动化运维平台,可以对接Tekton。如果没有,你需要在Github上找找有没有相关的Dashboard或者platform。遗憾的是,我没有……目前,我使用Kubesphere来管理K8s集群和Pipeline,所以我就在思考如何使用kubesphere进行管理。但是,截至目前的版本,Kubesphere的流水线引擎仍然是Jenkins。除非二次开启,否则没办法直接继承泰克顿。我期待Kubesphere添加Tekton(https://github.com/kubesphere/community/blob/master/sig-advocacy-and-outreach/summer-ospp/kubeSphere-tekton-integration_zh-CN.md)。所以我该怎么做?我想到了一个很厉害(SB)的方法,如下:明白了吗?其实就是继续使用Jenkins作为Kubesphere的流水线引擎,然后把Jenkins和Tekton连接起来。这是间接使用的吗?泰克顿?这是一个非常棒的(SB)想法吗?但是悲剧来了。Jenkins的Tekton插件要求Jenkins的最低版本为2.263,而Kubesphere的Jenkins版本为2.49,升级非常麻烦。升级点推荐。所以这里只能退而求其次,使用Jenkins进行实验。部署Jenkins部署Jenkins的方法有很多种。这里使用Helm进行部署,简单快捷。首先,您需要安装Helm命令,请参阅文档(https://helm.sh/docs/intro/install/)。然后安装Jenkins,如下:helmrepoaddjenkinscihttps://charts.jenkins.iohelmrepoupdate#我习惯把CHART下载到本地,方便管理。Helmpulljenkinsci/jenkins#有一步解压过程,然后进入Jenkins目录Deployment#deploykubectlcreatensdevopshelminstalljenkins-ndevops。部署完成后,就可以登录了,访问地址要么使用NodePort,要么使用ingress,这里不再展示配置过程。安装Jenkins插件为了实现上面的需求,找了一个Jenkins插件可以用来管理Tekton。插件名称为tekton-client-plugintekton-client-plugin(https://github.com/jenkinsci/tekton-client-plugin)。tekton-client-plugin是用来连接Jenkins和Tekton的,功能并不复杂,可以去文档(https://plugins.jenkins.io/tekton-client/#documentation)学习。如果Jenkins版本大于2.263,可以直接在插件中心下载,如下:配置权限这里是Jenkins运行Tekton的权限,如下:kind:RoleapiVersion:rbac.authorization.k8s.io/v1metadata:name:tekton-role命名空间:tekton-devops-pipelinerules:-apiGroups:-""resources:-pods-pods/logverbs:-get-list-watch-apiGroups:-tekton.dev资源:-tasks-任务运行-管道-管道运行动词:-创建-删除-删除集合-获取-列表-补丁-更新-观看---apiVersion:rbac.authorization.k8s.io/v1kind:RoleBindingmetadata:名称:tekton-role-binding命名空间:tekton-devops-pipelineroleRef:apiGroup:rbac.authorization.k8s.iokind:Rolename:tekton-rolesubjects:-kind:ServiceAccountname:jenkinsnamespace:devops注意授权的serviceaccount和namespace。编写供Jenkinsfile使用的Jenkinsfile实际上非常简单。但是由于我们使用多个分支发布,Jenkinsfile如下:pipeline{agentanyparameters{choice(description:'selectbranch',name:'BRANCH_NAME',choices:['dev','test','uat','pre','prod'])}stages{stage('deploytodev'){when{expression{return"$BRANCH_NAME".contains('dev')}}steps{tektonCreateRawinput:'deploy/dev/pipeline.yaml',inputType:'FILE',namespace:'tekton-devops-pipeline'}}stage('deploytotest'){when{expression{return"$BRANCH_NAME".contains('test')}}步骤{tektonCreateRawinput:'deploy/test/pipeline.yaml',inputType:'FILE',namespace:'tekton-devops-pipeline'}}stage('deploytouat'){when{expression{return"$BRANCH_NAME".包含('uat')}}步骤{tektonCreateRaw输入:'deploy/uat/pipeline.yaml',inputType:'FILE',命名空间:'tekton-devops-pipeline'}}stage('deploytopre'){when{expression{return"$BRANCH_NAME".contains('pre')}}steps{tektonCreateRawinput:'deploy/pre'/pipeline.yaml',inputType:'FILE',namespace:'tekton-devops-pipeline'}}stage('deploytoprod'){when{expression{return"$BRANCH_NAME".contains('prod')}}steps{tektonCreateRawinput:'deploy/prod/pipeline.yaml',inputType:'FILE',namespace:'tekton-devops-pipeline'}}}}Tekton的PipelineRun按目录分类,如下(这里只是为了方便,但可以OnlyuseonePipelineRun):完成后,就可以创建管道了。如下创建hello-world-test流水线,并选择对应的分支进行部署。可以看到触发了Tekton的PipelineRun,如下:不过Jenkins这边还有如下问题:[ChecksAPI]Nosuitablecheckspublisherfound.Failed:nulljava.lang.NullPointerExceptionatorg.waveywaves.jenkins.plugins.tekton.client.build.create.CreateRaw.createPipelineRun(CreateRaw.java:278)在org.waveywaves.jenkins.plugins.tekton.client.build.create.CreateRaw.createWithResourceSpecificClient(CreateRaw.java:168)在org.waveywaves.jenkins.plugins。tekton.client.build.create.CreateRaw.runCreate(CreateRaw.java:429)在org.waveywaves.jenkins.plugins.tekton.client.build.create.CreateRaw.perform(CreateRaw.java:393)在org.jenkinsci。plugins.workflow.steps.CoreStep$Execution.run(CoreStep.java:101)在org.jenkinsci.plugins.workflow.steps.CoreStep$Execution.run(CoreStep.java:71)在org.jenkinsci.plugins.workflow。steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)在java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)在java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)在java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)在java.base/java.util。concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)atjava.base/java.lang.Thread.run(Thread.java:829)[ChecksAPI]找不到合适的检查发布者。虽然报这个错,TektonPipelineRun的触发没有问题,具体原因还有待调查,看到下面那串红色的就很尴尬了,半颗心都凉了(Tekton居然可以让成功).最后,这种做法是不完整的。Jenkins的问题还没有解决。网上查资料查了半天,没有用。很多人说是JenkinsCheck-API插件的原因,但是没有测试。不过使用Jenkins来管理Tekton在理论上是可行的,对于Jenkins的重度用户来说是一件好事。当然我更喜欢用类似Kubesphere的东西来管理,期待Kubesphere把Tekton集成进去。