背景
jenkins集成三方插件经调研一共有两种方式,一种是基于静态的node节点和插件处理cicd的相关插件,一种是基于master-slave 基于k8s的pod节点的动态方式。
版本
jenkins 2.414
kubernetes 1.23.6
docker 2.10.+
maven 3.8.8
不同的优缺点
静态node的方式:配置简单,但是需要配置tools相关参数,需要再jenkins部署的节点安装对应的jdk,maven,docker
动态node的方式:基于云cloud的方式,配置Kubernetes,通过Kubernetes配置jnpl节点,在jnpl的pod节点进行运行。运行后则进行销毁当前pod
本期只调研基于静态node的方式
jenkins安装docker,maven,Kubernetes
jenkins集成 docker
1,安装docker插件
2,在tools配置 docker

jenkins集成Kubernetes
安装Kubernetes cli插件

需要配置kubectl的信任插件
点击 manage jenkins->cerdentials->systemc->global credentials
关于选择的文件需要进入kubernetes的节点中 获取 ./kube/config文件,将文件下载后,放入到选择文件夹中,如图,config.txt是k8s的配置文件,唯一标识是pipline使用的内容id

jenkins集成maven
在tools中配置maven,要记住name很关键,在jenkins脚本中要使用

新建项目运行下面内容
常用Pipeline的项目,更清晰和明确当前问题
pipeline语法,这里要简单说一下agent,这个代理节点里面的"devops"是物理节点,对应的位置在

javascript
pipeline {
agent {
label 'devops'
}
tools {
maven 'maven' // 这里的 'maven' 是您在全局工具配置中定义的 Maven 工具的名称
dockerTool 'docker'
}
stages {
stage('Hello') {
steps {
echo 'Hello World'
}
}
stage("kubectl") {
steps {
// 使用kubectl cli语法
withKubeConfig([credentialsId: 'k8s-secret',serverUrl: 'https://192.168.10.7:6443']) {
sh 'kubectl get nodes'
}
}
}
stage("maven") {
steps {
sh 'mvn -v'
}
}
stage("docker") {
steps {
sh 'docker -v'
}
}
}
}
查看执行结果
可以发现执行成功了。
scss
Running on Jenkins in /var/lib/jenkins/workspace/k8s-cicd-demo
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Declarative: Tool Install)
[Pipeline] tool
[Pipeline] envVarsForTool
[Pipeline] tool
[Pipeline] envVarsForTool
[Pipeline] }
[Pipeline] // stage
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Hello)
[Pipeline] tool
[Pipeline] envVarsForTool
[Pipeline] tool
[Pipeline] envVarsForTool
[Pipeline] withEnv
[Pipeline] {
[Pipeline] echo
Hello World
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (kubectl)
[Pipeline] tool
[Pipeline] envVarsForTool
[Pipeline] tool
[Pipeline] envVarsForTool
[Pipeline] withEnv
[Pipeline] {
[Pipeline] withKubeConfig
[Pipeline] {
[Pipeline] sh
+ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 2d9h v1.23.6
k8s-slave1 Ready <none> 2d9h v1.23.6
k8s-slave2 Ready <none> 2d9h v1.23.6
[Pipeline] }
[kubernetes-cli] kubectl configuration cleaned up
[Pipeline] // withKubeConfig
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (maven)
[Pipeline] tool
[Pipeline] envVarsForTool
[Pipeline] tool
[Pipeline] envVarsForTool
[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh
+ mvn -v
Apache Maven 3.8.8 (4c87b05d9aedce574290d1acc98575ed5eb6cd39)
Maven home: /home/maven/apache-maven-3.8.8
Java version: 17.0.10, vendor: Oracle Corporation, runtime: /home/jdk17/jdk-17.0.10
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1127.el7.x86_64", arch: "amd64", family: "unix"
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (docker)
[Pipeline] tool
[Pipeline] envVarsForTool
[Pipeline] tool
[Pipeline] envVarsForTool
[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh
+ docker -v
Docker version 20.10.12, build e91ed57
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
遇到的问题
1, kubectl not found
当前解决这个问题时间有点久忘了,但是很粗暴,就是在jenkins节点配置了和k8s的master一样的内容,将./kube/config 拷贝过来了,然后好像就可以了,或者说都不用处理,也会远程调用 k8s的master内容
后续
基于静态master的方式,很简单,当时花费很长时间去学习动态node节点的方式创建,我个人觉得虽然基于k8s动态创建比较麻烦,但是后期很省事,并且可以一套配置下来后,可以很好的兼容所有jenkins,不用每台进行配置了,性能上也是很好的一种方案。