jenkins+固定agent节点+maven+sonarqube+docker

说来惭愧:jenkins+动态slave没整出来,因为 本打算使用kaniko做容器化构建的,所有的配置都是按照k8s集群中部署来配置的,但是搞了很长时间,就是不行.不是驴不走就是磨不转.治好退而求其次.如果哪位大神整出来了,使用kaniko动态slave的部署方式,还望不吝指点一二.

感谢感谢.

先决条件

服务名称版本号部署位置
jenkins-version2.486k8s
k8s-version1.24.14k8s
maven-version3.9.9jenkins-agent
sonar-version4.8.0.2856jenkins-agent
java-versionjdk-17jenkins,jenkins-agent
jenkins插件sonarqube scanner for jenkinsjenkins
git pluginsjenkins

说明一下,我这里安装的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文件代码:
@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文件代码:
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目录下)

[root@jenkins-node1 /usr/local/sonar-scanner-4.8.0.2856-linux/lib]$ls
sonar-scanner-cli-4.8.0.2856.jar
jar_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文件,下期在做.

### 配置 Docker Swarm 中的 Jenkins 使用 JaCoCo 实现自动化构建和代码覆盖报告 #### 安装并配置 Jenkins 和 JaCoCo 插件 为了使 Jenkins 能够处理 Java 项目的静态分析以及生成 JaCoCo 测试覆盖率报告,在启动 Jenkins 前需确保已安装了必要的插件。这可以通过在容器初始化脚本中指定 `install-plugin` 参数来完成。 ```bash docker run --name jenkins \ --restart always \ -p 8080:8080 \ -p 50000:5000 \ -v /var/jenkins_home:/var/jenkins_home \ -d jenkins/jenkins:2.387.1-lts \ java -jar /usr/share/jenkins/ref/plugins-manager-cli.jar install jacoco coverage-reporter-api[^3] ``` 上述命令不仅会拉取特定版本的 Jenkins 映像,还会自动安装 JaCoCo 及其依赖项之一——Coverage Reporter API 插件。 #### 创建多阶段管道定义文件 (Jenkinsfile) 对于 Spring Cloud 应用程序而言,推荐采用声明式的 Pipeline-as-code 方法编写 Jenkinsfile 来描述 CI/CD 工作流。下面是一个简单的例子: ```groovy pipeline { agent { label 'swarm-node' } stages { stage('Checkout') { steps { git branch: 'main', url: 'https://github.com/example/spring-cloud-app.git' } } stage('Build & Test with Maven') { environment { MAVEN_HOME = tool name: 'Maven_3.6.3', type: 'hudson.tasks.Maven$MavenInstallation' } steps { sh "${MAVEN_HOME}/bin/mvn clean verify" } post { always { junit '**/target/surefire-reports/*.xml' archiveArtifacts artifacts: '**/target/**/*.war,**/build/libs/*.jar', allowEmptyArchive: true } } } stage('Generate Code Coverage Report') { steps { step([$class: 'JacocoPublisher']) } } // 更多部署到 Docker Swarm 的逻辑... } } ``` 此 Groovy 脚本定义了一个完整的持续交付流程,其中包括检出源码仓库、编译打包应用程序、运行单元测试并将结果上传给 Jenkins,最后通过调用内置步骤生成 JaCoCo 报告。 #### 设置 Docker Swarm Service for Jenkins Master and Agents 为了让 Jenkins master 和 slave nodes 形成一个高可用的服务网格,可以按照如下方式设置服务: ```yaml version: "3" services: jenkins-master: image: jenkins/jenkins:2.387.1-lts ports: - "8080:8080" - "50000:50000" volumes: - ./jenkins-data:/var/jenkins_home deploy: replicas: 1 restart_policy: condition: on-failure jnlp-slave: image: jenkins/inbound-agent:latest depends_on: - jenkins-master command: ['jnlp'] deploy: mode: global labels: com.example.role: build-worker ``` 这段 YAML 文件用于创建两个独立但相互关联的服务实例:一个是作为主节点负责调度任务;另一个则是工作节点执行实际的任务操作。注意这里设置了全局模式下的 JNLP Slave 数量不受限于副本数目的约束[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值