这里写目录标题

  • Jenkins项目构建细节
  • 常用的构建触发器
  • 触发远程构建
  • 其他工程构建后触发
  • 定时构建
  • 轮询SCM
  • Git hook自动触发构建
  • 安装Gitlab Hook插件
  • Jenkins的参数化构建
  • 配置邮箱服务器发送构建结果
  • 准备邮件内容
  • Jenkins+SonarQuber代码审查
  • 安装SonarQube
  • 实现代码审查
  • 在项目添加SonaQube代码审查(非流水线项目)
  • 在项目添加SonaQube代码审查(流水线项目)


Jenkins项目构建细节

常用的构建触发器

紧接着上一篇博客继续jenkins的学习jenkins的学习 Jenkins内置4种构建触发器:

  • 触发远程构建
  • 其他工程构建后触发(Build after other projects are build)
  • 定时构建(Build periodically
  • 轮询SCM(Poll SCM)

触发远程构建

在任务的配置中

jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别


jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别_02

jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别_03


我们将这个url复制到浏览器地址栏,更改其中的jenkins地址和最后的token,回车之后,就触发了远程构建

jenkins与doctor有啥区别 jenkins 对比_git_04


jenkins与doctor有啥区别 jenkins 对比_jenkins_05


控制台也显示由远程ip地址触发构建

jenkins与doctor有啥区别 jenkins 对比_java_06

其他工程构建后触发

jenkins与doctor有啥区别 jenkins 对比_jenkins_07


我们需要先创建一个前置工程

jenkins与doctor有啥区别 jenkins 对比_git_08


写一个简单的echo就行了

jenkins与doctor有啥区别 jenkins 对比_sonarqube_09


jenkins与doctor有啥区别 jenkins 对比_jenkins_10


构建前置工程之后,pipeline就会自动构建

jenkins与doctor有啥区别 jenkins 对比_java_11

定时构建

jenkins与doctor有啥区别 jenkins 对比_sonarqube_12

定时字符串从左往右分别为: 分 时 日 月 周

一些定时表达式的例子:

  • 每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

jenkins与doctor有啥区别 jenkins 对比_java_13


等待两分钟之后 开始构建

jenkins与doctor有啥区别 jenkins 对比_git_14

轮询SCM

轮询SCM,指定时扫描本地代码仓库的代码是否有变更,如果代码有变更就触发项目构建。

jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别_15


每两分钟检测一次,如果代码发生变化,则会构建新的工程,如果代码没有发生变化,则不构建

缺点:会定时扫描整个项目的源码,如果项目很大,会增加jenkins的cpu开销

Git hook自动触发构建

  • 刚才我们看到在Jenkins的内置构建触发器中,轮询SCM可以实现Gitlab代码更新,项目自动构建,但是该方案的性能不佳
  • 那有没有更好的方案呢?就是利用Gitlab的webhook实现代码push到仓库,立即触发项目自动构建。

jenkins与doctor有啥区别 jenkins 对比_sonarqube_16

安装Gitlab Hook插件

Gitlab Hook和GitLab

jenkins与doctor有啥区别 jenkins 对比_jenkins_17


jenkins与doctor有啥区别 jenkins 对比_java_18


jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别_19


接下来我们去gitlab上开启webhook功能

使用root账号

jenkins与doctor有啥区别 jenkins 对比_java_20


jenkins与doctor有啥区别 jenkins 对比_java_21


jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别_22


接下来去项目里面选择Integrations

jenkins与doctor有啥区别 jenkins 对比_jenkins_23


jenkins与doctor有啥区别 jenkins 对比_sonarqube_24


移动到下面进行添加保存

jenkins与doctor有啥区别 jenkins 对比_java_25


进行测试

jenkins与doctor有啥区别 jenkins 对比_jenkins_26


但是显示没有权限

jenkins与doctor有啥区别 jenkins 对比_sonarqube_27


因此还需要去jenkins配置权限

在系统配置中找到 Gitlab

jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别_28


将这个默认打勾 取消打勾 保存接着去测试,发现webhook成功发出

jenkins与doctor有啥区别 jenkins 对比_sonarqube_29


项目进行了构建

jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别_30


再去修改代码 进行提交

jenkins与doctor有啥区别 jenkins 对比_java_31


jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别_32


jenkins与doctor有啥区别 jenkins 对比_java_33


返回jenkins,发现项目开始构建

jenkins与doctor有啥区别 jenkins 对比_sonarqube_34

Jenkins的参数化构建

  • 有时在项目构建的过程中,我们需要根据用户的输入动态传入一些参数,从而影响整个构建结果,这时我们可以使用参数化构建
  • Jenkins支持非常丰富的参数类型

打开流水线项目配置
找到参数化构建过程(This project is parameterized)

jenkins与doctor有啥区别 jenkins 对比_jenkins_35


点击之后可以选择不同的参数进行添加

jenkins与doctor有啥区别 jenkins 对比_jenkins_36


选择字符参数

jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别_37


当我们再次点击构建项目时候,会出现叫我们写一个参数

jenkins与doctor有啥区别 jenkins 对比_java_38


这时候需要更改脚本里面分支变量,之前在脚本里是写死了这个值,现在改成${branch} 表示去读取参数的值

jenkins与doctor有啥区别 jenkins 对比_java_39

jenkins与doctor有啥区别 jenkins 对比_git_40


上传代码到仓库

jenkins与doctor有啥区别 jenkins 对比_git_41


push完之后,项目自动创建

jenkins与doctor有啥区别 jenkins 对比_git_42

创建分支

jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别_43

jenkins与doctor有啥区别 jenkins 对比_sonarqube_44

仓库已经有了分支

jenkins与doctor有啥区别 jenkins 对比_java_45


jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别_46


我们通过分支v1构建项目

jenkins与doctor有啥区别 jenkins 对比_git_47


构建成功

jenkins与doctor有啥区别 jenkins 对比_jenkins_48


在tomcat里面查看

jenkins与doctor有啥区别 jenkins 对比_java_49


jenkins与doctor有啥区别 jenkins 对比_git_50

配置邮箱服务器发送构建结果

需要安装Email Extension插件

jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别_51


在Jenkins 进入系统配置设置邮箱相关参数

系统管理员邮件地址改成自己的邮箱

jenkins与doctor有啥区别 jenkins 对比_java_52

jenkins与doctor有啥区别 jenkins 对比_sonarqube_53


这里密码是需要自己邮箱去授权

jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别_54


jenkins与doctor有啥区别 jenkins 对比_sonarqube_55

准备邮件内容

在项目根目录编写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与doctor有啥区别 jenkins 对比_git_56


jenkins与doctor有啥区别 jenkins 对比_jenkins_57


查看邮箱 就有了邮件

jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别_58

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端口

jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别_59


登录 admin admin

jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别_60


生成密钥

jenkins与doctor有啥区别 jenkins 对比_java_61


jenkins与doctor有啥区别 jenkins 对比_sonarqube_62

实现代码审查

jenkins与doctor有啥区别 jenkins 对比_git_63


在jenkins上 安装SonarQube Scanner插件

jenkins与doctor有啥区别 jenkins 对比_java_64


在全局工具配置里让jenkins安装sonarqube

jenkins与doctor有啥区别 jenkins 对比_jenkins_65


在系统配置里找到SonarQube servers

jenkins与doctor有啥区别 jenkins 对比_sonarqube_66


添加SonarQube凭证

jenkins与doctor有啥区别 jenkins 对比_sonarqube_67


就是这个密钥

jenkins与doctor有啥区别 jenkins 对比_jenkins与doctor有啥区别_68

添加凭据之后 就可以使用这个凭据了

jenkins与doctor有啥区别 jenkins 对比_java_69

在项目添加SonaQube代码审查(非流水线项目)

我们进入之前的java_demo_freestyle项目里

jenkins与doctor有啥区别 jenkins 对比_jenkins_70

jenkins与doctor有啥区别 jenkins 对比_git_71

  • 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

构建项目成功

jenkins与doctor有啥区别 jenkins 对比_git_72


进入sonarqube,可以看到审查结果

jenkins与doctor有啥区别 jenkins 对比_git_73


jenkins与doctor有啥区别 jenkins 对比_jenkins_74

在项目添加SonaQube代码审查(流水线项目)

在项目根目录创建一个sonar-project.properties文件

jenkins与doctor有啥区别 jenkins 对比_jenkins_75

# 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=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
sonar.java.target=1.8

# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8

jenkins与doctor有啥区别 jenkins 对比_git_76

编写Jenkins文件

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('code checking') {
             steps {
                 script {
                     scannerHome = tool 'sonar-scanner'
                 }
                 withSonarQubeEnv('sonarqube') {
                     sh "${scannerHome}/bin/sonar-scanner"
             }
        }
        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'
            }
        }
    }
  • script 代表是一些脚本
  • scannerHome 表示引入SonarQubeScanner tool(工具)需要去jenkins全局工具配置里查看,之前写的
  • withSonarQubeEnv 就是引用SonarQube环境
    在系统配置里查找

jenkins与doctor有啥区别 jenkins 对比_git_77


将两个文件push到仓库里 ,进行新的构建

jenkins与doctor有啥区别 jenkins 对比_jenkins_78