说来惭愧:jenkins+动态slave没整出来,因为 本打算使用kaniko做容器化构建的,所有的配置都是按照k8s集群中部署来配置的,但是搞了很长时间,就是不行.不是驴不走就是磨不转.治好退而求其次.如果哪位大神整出来了,使用kaniko动态slave的部署方式,还望不吝指点一二.
感谢感谢.
|-----------------|-------------------------------|-----------------------|
| 服务名称 | 版本号 | 部署位置 |
| jenkins-version | 2.486 | k8s |
| k8s-version | 1.24.14 | k8s |
| maven-version | 3.9.9 | jenkins-agent |
| sonar-version | 4.8.0.2856 | jenkins-agent |
| java-version | jdk-17 | jenkins,jenkins-agent |
| jenkins插件 | sonarqube scanner for jenkins | jenkins |
| | git plugins | jenkins |
| | | |
[#### 先决条件]
说明一下,我这里安装的maven,sonar-scanner都是使用二进制安装的.参考个人的构建环境自己到github上下载对应版本的二进制包即可.
jenkins页面配置的信息
dashboard -->系统管理--> system -->jenkins Location

jenkins Url: http://test-jenkins.com:30112/ 这里因为我使用的是kubesphere作为k8s管理,所以jenkins部署好之后创建了个ingress.具体咋创建自己研究下.
同级设置sonarqube全局环境变量:

说明下:设置这些配置信息主要是为了生成环境变量.可以供全局使用.
serverurl 这里配置ide是sonar页面的url,jenkins-agent可以访问的地址.
token,是在凭据管理中创建的,从sonarqube页面中创建的用于jenkins与sonarqube连接认证用.
配置共享库
这里就不做过多解释了.之前文档有相关介绍,



凭据配置

说明下:这里有三个配置是本次使用的.
gitlab-admin:gitlab的用户名密码,
token1:sonarqube的认证信息token.
节点配置
dashboard--> 系统管理-->节点列表
这里说明下:
参数说明:
Number of executors,最大构件数量
远程工作目录:其实就是agent服务器拉取代码的目录.我这里设置的根jenkins本身一致.
标签:用于选择构建节点用.
配置agent节点的时候我这里用的是javaweb启动代理,个人可以根据自己情况,使用 overssh也可以.目的是能通就行.
流水线项目配置
创建流水线:

配置信息
为了少走弯路,这里提前说明下:
下面截图中的配置在Jenkinsfile中都有体现,在Jenkinsfile中写完只有会在这里显示,所以不用手动配置这些参数,唯一要配置的是最后的git拉取代码的位置




下面两张图的配置比较重要


Jenkinsfile以及共享库调用
目录结构如下:如图.这里分成了三个目录层级.

其中resources目录是存放一些配置信息的.这里其实没用到.可以忽略.在使用动态slave的时候会用得上.
然后就是src/org/deploy目录.用来存放groovy的代码包.后面会有具体代码.
Jenkinsfile文件代码:
Groovy
@Library('mylib') _
//函数调用
def Mybuild = new org.devops.Build()
env.serviceName = "${env.JOB_NAME}".split('_')[0]
def jdks = ['jdk17':'/usr/local/jdk-17.0.11+9/']
if ("${env.serviceName}" == 'pig-ui') {
env.projectType = 'web'
env.repoName = 'pig-ui'
env.srcUrl = 'http://192.168.59.30:28080/devops8/pig-ui.git'
}else {
env.projectType = 'backend'
env.repoName = 'pig'
env.srcUrl = 'http://192.168.59.30:28080/devops8/pig.git'}
currentBuild.displayName = "${env.serviceName}"
currentBuild.description = "serviceName: ${env.serviceName}"
SONAR_TOKEN = credentials('token1')
pipeline {
agent { label 'node1' }
parameters {
choice(name: 'srcUrl', choices :["${env.srcUrl}"], description:'代码仓库地址-srcUrl')
choice(name: 'javaVersion', choices: ['jdk17'], description: 'jdk版本-根据java版本来选择')
choice(name: 'branchName', choices: ['jdk17'], description: '分支名称')
string(name: 'VERSION', defaultValue:'RELEASE-1.1.1', description:'构建版本')
}
//这里用于初始化环境变量
stages {
stage('init') {
steps {
script {
sh """
export JAVA_HOMES=${jdks["${params.javaVersion}"]}
echo \$JAVA_HOMES
"""
}
}
}
//这里拉取代码
stage('run') {
steps {
script {
Mybuild.GetCode()
print 'build--------------'
}
}
}
//这里构建jar包
stage('Build') {
steps {
script {
Mybuild.Build()
print 'build--------------'
}
}
}
stage('sonar-quality') {
steps {
script {
Mybuild.Sonar_quality()
print 'Sonar_quality--------------'
}
}
}
stage('BUildAndPushImage') {
steps {
script {
Mybuild.BUild_dockerImage()
}
}
}
}
}
Build文件代码:
Groovy
package org.devops
def GetCode(){
//script
//拉取仓库代码
checkout scmGit(branches: [[name: "${env.branchName}"]],
extensions: [],
userRemoteConfigs: [[credentialsId: 'gitlab-admin', //添加凭据
url: "${env.srcUrl}"]])
sh 'ls -l '
echo "${env.VERSION}"+'版本号码'
echo "${env.serviceName}"+'服务名称'
}
def Build(){
sh "mvn clean package -pl ${env.serviceName} -am"
sh "ls ./pig-register/target"
}
def Sonar_quality(){
withSonarQubeEnv(credentialsId: 'token1') {
sh """
echo $PATH && which sonar-scanner || true
sonar-scanner -Dsonar.host.url=http://sonar-ingress.com:32433 \
-Dsonar.projectKey=${env.serviceName} \
-Dsonar.projectName=${env.serviceName} \
-Dsonar.projectVersion=${env.branchName} \
-Dsonar.projectDescription="my first project!" \
-Dsonar.links.homepage=http://192.168.59.30:28080/devops8/pig/-/tree/jdk17 \
-Dsonar.links.ci=\${JOB_URL} \
-Dsonar.sources=${env.serviceName}/src \
-Dsonar.sourceEncoding=UTF-8 \
-Dsonar.java.binaries=${env.serviceName}/target/classes \
-Dsonar.java.test.binaries=${env.serviceName}/target/test-classes \
-Dsonar.java.surefire.report=${env.serviceName}/target/surefire-reports
"""
}
}
def BUild_dockerImage(){
//Build Docker images
env.dockerImageName = "registry.cn-beijing.aliyuncs.com/scorpio/${env.serviceName}:${env.BUILD_ID}"
env.dockerImageNameLts = "registry.cn-beijing.aliyuncs.com/scorpio/${env.serviceName}:latest"
sh """
docker build -t ${env.dockerImageName} ${env.serviceName}
docker build -t ${env.dockerImageNameLts} ${env.serviceName}
docker push ${env.dockerImageName}
docker push ${env.dockerImageNameLts}
"""
}
这里说一下在构建过程中遇到的问题:
1.jenkins无法找到sonar-scanner服务问题.
在将sonar-scanner的二进制文件解压到linux服务器的/usr/local/目录下之后,默认的socar-scanner文件存放在./sonar-scanner-4.8.0.2856-linux/目录中,我在jenkins-agent环境中添加了环境变量,并且验证环境变量生效后,发现jenkins流水线在构建过程中一直报错 sonar-scanner not found 相关的错误.这个问题让我尝试了很多解决方式.最终在jenkins的构建日志集中发现,jenkins 默认找的路径是/usr/local/bin 目录下的sonar-scanner.这个目录下没有这个命令.所以才报这个错误的.然后我就直接将可执行文件移入/usr/local/bin中/.....然后迎来了第二个报错.
2.重新构建后发现报错变量,变成
#jar_file=/usr/local//lib/sonar-scanner-cli-4.8.0.2856.jar not exits 这个文件找不到.
后来才发现,在可执行程序中(就是/usr/local/bin下的sonar-scanner文件)中有一个配置,使用变量的形式指向了上面的目标地址.所以导致这个文件找不到.
解决方式:
vim /usr/local/bin/sonar-scanner 修改如下配置即可.(这里jar文件在解压后文件的lib目录下)
Groovy[root@jenkins-node1 /usr/local/sonar-scanner-4.8.0.2856-linux/lib]$ls sonar-scanner-cli-4.8.0.2856.jar
Groovyjar_file=/usr/local/sonar-scanner-4.8.0.2856-linux/lib/sonar-scanner-cli-4.8.0.2856.jar #jar_file=$sonar_scanner_home/lib/sonar-scanner-cli-4.8.0.2856.jar
3.docker打包推送失败
最后再次执行流水线发现docker无法将构建的包推送到远程的镜像仓库
因为agent服务器上没有登陆容器镜像仓库.这里有两种方式
1.直接docker login xxxxx
输入密码:xxxxx
登陆成功.即可.
2.从其他机器上将docker的登陆认证文件拷贝到本机的/root/.docker/目录下.
文件位置/root/.docker/config.json(前提是其他机器已经登陆过了.)
再次尝试,问题解决.
验证结果:
在阿里云容器镜像仓库中找一下刚刚打包的镜像是不是推送成功了.

其他流水线,的配置,需要修改Jenkinsfile文件,下期在做.