1. 整体流程
上传代码到git仓库—>触发Jenkins构建代码—>编译、打包、测试—>代码扫描—>发布
代码扫描—>提交—>…
2. sonarqube的配置
1)设置账户强制登陆
设置之后访问首页不再直接出现首页,登录后才可以看到首页
未设置之前如下图:
设置完成后,登陆9000端口,页面如下
2)项目的私有性
3)权限管理
先创建用户
创建群组:
向组内加入成员test01:
以上的意思是说 test1组内有test01用户,这个组对于test1开头的项目有权限
创建新的项目来测试一下
加入群组
我们退出admin用户,用test01用户登陆,可以看到如下页面,cloud可以看到是因为它是之前的
4)与Jenkins协同合作的准备
把原来的权限模板改一下,把管理员也加进去,然后对所有的项目应用权限模板
3. jenkins端操作
1)Jenkins上配置scanner和groovy
[root@localhost ~]# unzip sonar-scanner-cli-4.0.0.1744-linux.zip
[root@localhost ~]# mv sonar-scanner-4.0.0.1744-linux/ /usr/local/sonar-scanner
[root@localhost ~]# ln -s /usr/local/sonar-scanner/bin/sonar-scanner /usr/bin
[root@localhost ~]# unzip apache-groovy-sdk-3.0.0-beta-1.zip
[root@localhost ~]# mv groovy-3.0.0-beta-1/ /usr/local/groovy
[root@localhost ~]# ln -s /usr/local/groovy/bin/groovy /usr/bin
[root@localhost ~]# vim /etc/profile #尾部添加
export SONAR_HOME=/usr/local/sonar-scanner
export GROOVY_HOME=/usr/local/groovy
export PATH=$PATH:$SONAR_HOME/bin:$GROOVY_HOME/bin
[root@localhost ~]# source /etc/profile
防止找不到mvn命令,做一个软链接
[root@localhost ~]# ln -s /usr/local/maven/bin/mvn /usr/bin/
2) gitlab上创建两个项目,一个放Jenkinsfile 另一个放项目
先少写一点,提交一下,之后再慢慢完善
2)新建Jenkins流水线任务
选择参数化构建
仓库地址是刚才创建的Jenkinsfile项目的网址
账号和密码是gitlab的root用户的账号和密码
这个文件名字是刚才gitlab项目中jenkinsfile文件的名字
点击项目主页的“参数化构建” 可以看到右侧的红色框框的参数
3)编写jenkinsfile文件
#!/usr/bin/groovy
node("master"){
//checkout
checkout([$class: 'GitSCM',
branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false,
extensions: [], submoduleCfg: [],
userRemoteConfigs: [[credentialsId: 'dc85759a-1cc0-461e-8ba9-383e3169e5f3',
url: 'http://gitlab.kgc.cn/kgc/kgcweb.git']]])
//Build
sh "mvn ${buildShell}"
//Sonar
sh """
sonar-scanner -Dsonar.projectKey=${serviceName} \
-Dsonar.projectName=${serviceName} \
-Dsonar.login=765062f69357d1b970e7dfb1b87da77ef2aa7407 \
-Dsonar.sources=src \
-Dsonar.host.url=${sonarServer}
"""
}
简单说明
checkout从流水线语法页面产生
-Dsonar.login从sonarqube的web页面产生
-Dsonar.sources=src 说的是项目的源码放在项目根目录下的src目录
sonarqube产生的秘钥765062f69357d1b970e7dfb1b87da77ef2aa7407
4)进行参数化构建
构建成功,我们可以去sonarqube平台查看代码的检测结果
5)流水线里归档文件
只需要修改一下jenkinsfile就行了,加入归档文件的语句
#!/usr/bin/groovy
node("master"){
//checkout
checkout([$class: 'GitSCM',
branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false,
extensions: [], submoduleCfg: [],
userRemoteConfigs: [[credentialsId: 'dc85759a-1cc0-461e-8ba9-383e3169e5f3',
url: 'http://gitlab.kgc.cn/kgc/kgcweb.git']]])
//Build
sh "mvn ${buildShell}"
//Archive artifacts
archiveArtifacts 'target/kgcweb.war'
//Sonar
sh """
sonar-scanner -Dsonar.projectKey=${serviceName} \
-Dsonar.projectName=${serviceName} \
-Dsonar.login=765062f69357d1b970e7dfb1b87da77ef2aa7407 \
-Dsonar.sources=src \
-Dsonar.host.url=${sonarServer}
"""
}
归档之后可以看到web页面直接就有归档的war包
归档的语句可以通过流水线语法生成器生成
6)加入对是否跳过某个步骤的选择
false写在前边,表示默认情况下,如果不选择参数,参数就是false
#!/usr/bin/groovy
String skipSonar = "${env.skipSonar}"
String skipTest = "${env.skipTest}"
node("master"){
//checkout
checkout([$class: 'GitSCM',
branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false,
extensions: [], submoduleCfg: [],
userRemoteConfigs: [[credentialsId: 'dc85759a-1cc0-461e-8ba9-383e3169e5f3',
url: 'http://gitlab.kgc.cn/kgc/kgcweb.git']]])
//Build
if ("${skipTest}" == "true"){
sh "mvn ${buildShell} -Dmaven.test.skip"
} else {
sh "mvn ${buildShell}"
}
//Archive artifacts
archiveArtifacts 'target/kgcweb.war'
//Sonar
if ("${skipSonar}" == "true"){
echo "skip scanner step"
} else {
sh """
sonar-scanner -Dsonar.projectKey=${serviceName} \
-Dsonar.projectName=${serviceName} \
-Dsonar.login=765062f69357d1b970e7dfb1b87da77ef2aa7407 \
-Dsonar.sources=src \
-Dsonar.host.url=${sonarServer}
"""
}
}
7)Maven中-DskipTests和-Dmaven.test.skip=true的区别
在使用mvn package进行编译、打包时,Maven会执行src/test/java中的测试用例,有时为了跳过测试,会使用参数-DskipTests和-Dmaven.test.skip=true,这两个参数的主要区别是:
-DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下
-Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类