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>项目名称&nbsp;&nbsp;${PROJECT_NAME}</li> <li>构建编号&nbsp;&nbsp;第${BUILD_NUMBER}次构建</li> <li>触发原因:&nbsp;${CAUSE}</li> <li>构建日志:&nbsp;<a href="${BUILD_URL}console">${BUILD_URL}console</a></li> <li>构建&nbsp;&nbsp;Url&nbsp;&nbsp;<a href="${BUILD_URL}">${BUILD_URL}</a></li> <li>工作目录&nbsp;&nbsp;<a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li> <li>项目&nbsp;&nbsp;Url&nbsp;&nbsp;<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="&nbsp;&nbsp;&nbsp;&nbsp;%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)

下载SonarQuber安装包

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代码审查的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins——Jenkins构建Maven项目(三种风格)+Jenkins项目构建细节

jenkins常用构建触发器,SonarQube代码审查

jenkins常用构建触发器,SonarQube代码审查

Jenkins构建触发器

Jenkins构建触发器(定时构建项目)

jenkins的触发远程构建时403或需要登录问题