Jenkins——Jenkins项目构建细节(触发构建和)和SonarQube代码审查
Posted stan Z
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jenkins——Jenkins项目构建细节(触发构建和)和SonarQube代码审查相关的知识,希望对你有一定的参考价值。
这里写目录标题
Jenkins项目构建细节
常用的构建触发器
紧接着上一篇博客继续jenkins的学习
jenkins的学习
Jenkins内置4种构建触发器:
- 触发远程构建
- 其他工程构建后触发(Build after other projects are build)
- 定时构建(Build periodically
- 轮询SCM(Poll SCM)
触发远程构建
在任务的配置中
我们将这个url复制到浏览器地址栏,更改其中的jenkins地址和最后的token,回车之后,就触发了远程构建
控制台也显示由远程ip地址触发构建
其他工程构建后触发
我们需要先创建一个前置工程
写一个简单的echo就行了
构建前置工程之后,pipeline就会自动构建
定时构建
定时字符串从左往右分别为: 分 时 日 月 周
一些定时表达式的例子:
- 每30分钟构建一次:H代表形参 H/30 * * * * 10:02 10:32
- 每2个小时构建一次: H H/2 * * *
- 每天的8点,12点,22点,一天构建3次: (多个时间点中间用逗号隔开) 0 8,12,22 * * *
- 每天中午12点定时构建一次 H 12 * * *
- 每天下午18点定时构建一次 H 18 * * *
- 在每个小时的前半个小时内的每10分钟 H(0-29)/10 * * * *
- 每两小时一次,每个工作日上午9点到下午5点(也许是上午10:38,下午12:38,下午2:38,下午4:38) H H(9-16)/2 * * 1-5
等待两分钟之后 开始构建
轮询SCM
轮询SCM,指定时扫描本地代码仓库的代码是否有变更,如果代码有变更就触发项目构建。
每两分钟检测一次,如果代码发生变化,则会构建新的工程,如果代码没有发生变化,则不构建
缺点:会定时扫描整个项目的源码,如果项目很大,会增加jenkins的cpu开销
Git hook自动触发构建
- 刚才我们看到在Jenkins的内置构建触发器中,轮询SCM可以实现Gitlab代码更新,项目自动构建,但是该方案的性能不佳。
- 那有没有更好的方案呢?就是利用Gitlab的webhook实现代码push到仓库,立即触发项目自动构建。
安装Gitlab Hook插件
Gitlab Hook和GitLab
接下来我们去gitlab上开启webhook功能
使用root账号
接下来去项目里面选择Integrations
移动到下面进行添加保存
进行测试
但是显示没有权限
因此还需要去jenkins配置权限
在系统配置中找到 Gitlab
将这个默认打勾 取消打勾 保存
接着去测试,发现webhook成功发出
项目进行了构建
再去修改代码 进行提交
返回jenkins,发现项目开始构建
Jenkins的参数化构建
- 有时在项目构建的过程中,我们需要根据用户的输入动态传入一些参数,从而影响整个构建结果,这时我们可以使用参数化构建
- Jenkins支持非常丰富的参数类型
打开流水线项目配置
找到参数化构建过程(This project is parameterized)
点击之后可以选择不同的参数进行添加
选择字符参数
当我们再次点击构建项目时候,会出现叫我们写一个参数
这时候需要更改脚本里面分支变量,之前在脚本里是写死了这个值,现在改成${branch} 表示去读取参数的值
上传代码到仓库
push完之后,项目自动创建
创建分支
仓库已经有了分支
我们通过分支v1构建项目
构建成功
在tomcat里面查看
配置邮箱服务器发送构建结果
需要安装Email Extension
插件
在Jenkins 进入系统配置设置邮箱相关参数
系统管理员邮件地址改成自己的邮箱
这里密码是需要自己邮箱去授权
准备邮件内容
在项目根目录编写email.html,并把文件推送到Gitlab,内容如下
创建一个email.html
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"> <title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title> </head> <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0"> <table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans- serif"> <tr><td>(本邮件是程序自动下发的,请勿回复!)</td> </tr> <tr><td><h2> <font color="#0000FF">构建结果 - ${BUILD_STATUS}</font> </h2></td> </tr> <tr><td><br /> <b><font color="#0B610B">构建信息</font></b> <hr size="2" width="100%" align="center" /></td> </tr> <tr><td><ul><li>项目名称 : ${PROJECT_NAME}</li> <li>构建编号 : 第${BUILD_NUMBER}次构建</li> <li>触发原因: ${CAUSE}</li> <li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li> <li>构建 Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li> <li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li> <li>项目 Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li> </ul> </td> </tr> <tr><td><b><font color="#0B610B">Changes Since Last Successful Build:</font></b> <hr size="2" width="100%" align="center" /></td> </tr>
编写Jenkinsfile添加构建后发送邮件
<tr><td><ul><li>历史变更记录 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li> </ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:<br />%c<br />",showPaths=true,changesFormat="<pre>[%a]<br />%m</pre>",pathFormat=" %p"} </td> </tr> <tr><td><b>Failed Test Results</b> <hr size="2" width="100%" align="center" /></td> </tr> <tr><td><prestyle="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">$FAILED_TESTS</pre> <br /></td> </tr> <tr><td><b><font color="#0B610B">构建日志 (最后 100行):</font></b> <hr size="2" width="100%" align="center" /></td> </tr> <tr><td><textarea cols="80" rows="30" readonly="readonly" style="font-family: Courier New">${BUILD_LOG, maxLines=100}</textarea> </td> </tr> </table> </body> </html>
更新Jenkinsfile
pipeline {
agent any
stages {
stage('pull code') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: '41580d48-d4c3-4116-9a71-4d4d777c5753', url: 'git@192.168.188.97:maomao_group/java_demo.git']]])
}
}
stage('build project') {
steps {
sh 'mvn clean package -Dmaven.test.skip=true'
}
}
stage('publish project') {
steps {
deploy adapters: [tomcat8(credentialsId: '2d2bfcb9-0d59-4415-b482-f624db6ce982', path: '', url: 'http://47.109.17.14:8080/')], contextPath: null, war: 'target/*.war'
}
}
}
post {
always {
emailext(
subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!',
body: '${FILE,path="email.html"}',
to: 'xxx@qq.com'
)
}
}
}
上传仓库之后 自己构建项目
查看邮箱 就有了邮件
Jenkins+SonarQuber代码审查
SonarQube是一个用于管理代码质量的开放平台,可以快速的定位代码中潜在的或者明显的错误。目前支持java,C#,C/C++,Python,PL/SQL,Cobol,JavaScrip,Groovy等二十几种编程语言的代码质量管理与检测
官网
安装SonarQube
在jenkins服务器上安装
安装mysql
我们通过二进制包安装
tar xf mysql-5.7.25-el7-x86_64.tar.gz -C /usr/local/
mv mysql-5.7.25-el7-x86_64 mysql
groupadd mysql
useradd -M -s /sbin/nologin mysql -g mysql
chown -R mysql.mysql /usr/local/mysql
vim /etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
server_id=1
port=3306
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
prompt=mysql [\\\\d]>
添加环境变量
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile
初始化
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
如果报错可以
yum install -y libaio
使用systemd管理mysql
vim /etc/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
systemctl daemon-reload
systemctl start mysqld
netstat -lnt
设置密码
mysqladmin -uroot password '123'
登陆验证
mysql -uroot -p123
在mysql里面创建一个sonar数据库
mysql [(none)]>create database sonar;
Query OK, 1 row affected (0.00 sec)
mysql [(none)]>show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sonar |
| sys |
+--------------------+
5 rows in set (0.00 sec)
yum install -y unzip
unzip sonarqube-6.7.7.zip
mkdir /usr/local/sonar
mv sonarqube-6.7.7/* /usr/local/sonar/
创建sonar用户,必须sonar用于启动,否则报错
useradd sonar
更改sonar目录及文件权限
chown -R sonar.sonar /usr/local/sonar/
在conf目录里修改sonar配置文件
vim sonar.properties
填写数据库账户密码
sonar.jdbc.username=root
sonar.jdbc.password=123
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
注意:sonar默认监听9000端口,如果9000端口被占用,需要更改
启动sonar
cd /usr/local/
su sonar /usr/local/sonar/bin/linux-x86-64/sonar.sh start
浏览器打开9000端口
登录 admin admin
生成密钥
实现代码审查
在jenkins上 安装SonarQube Scanner
插件
在全局工具配置里让jenkins安装sonarqube
在系统配置里找到SonarQube servers
添加SonarQube凭证
就是这个密钥
添加凭据之后 就可以使用这个凭据了
在项目添加SonaQube代码审查(非流水线项目)
我们进入之前的java_demo_freestyle项目里
- scan是进行代码扫描命令
# must be unique in a given SonarQube instance
sonar.projectKey=java_demo_freestyle // 项目标记
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=java_demo_freestyle // 项目名字
sonar.projectVersion=1.0 // 版本号
# Path is relative to the sonar-project.properties file. Replace "\\" by "/" on Windows.
# This property is optional if sonar.modules is set.
sonar.sources=. // 指定扫描的路径 .代表当前目录全部
sonar.exclusions=**/test/**,**/target/** // 排除一些不扫描的元素
sonar.java.source=1.8 // jdk版本 1.8
sonar.java.target=1.8
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8 // 编码格式 UTF8
构建项目成功
进入sonarqube,可以看到审查结果
在项目添加SonaQube代码审查(流水线项目)
在项目根目录创建一个sonar-project.properties文件
# must be unique in a given SonarQube instance
sonar.projectKey=java_demo_pipline
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=java_demo_pipline
sonar.projectVersion=以上是关于Jenkins——Jenkins项目构建细节(触发构建和)和SonarQube代码审查的主要内容,如果未能解决你的问题,请参考以下文章