Jenkins结合Gitlab+SonarQube+Maven进行代码管理、编译构建以及代码质量检测全流程

Jenkins结合Gitlab+SonarQube+Maven进行代码管理、编译构建以及代码质量检测全流程

第0章 环境准备

主机名外网IP内网IP内存/磁盘
gitlab10.0.1.200172.16.1.2001C2G/20G
jenkins10.0.1.201172.16.1.2011C1G/20G
nexus10.0.1.202172.16.1.2021C2G/20G
sonar10.0.1.203172.16.1.2031C4G/20G
web10.0.1.7172.16.1.71C1G/20G

第一章 安装部署Jenkins

0.Gitlab部署过程及使用参考

https://www.pingface.com/2020/04/19/git.html
https://www.pingface.com/2020/04/17/gitlab.html
https://www.pingface.com/2020/04/19/gitlabusage.html

1.安装Jenkins

# 安装 jdk
$ rpm -ivh jdk-8u181-linux-x64.rpm 
# 安装 jenkins
$ rpm -ivh jenkins-2.176.1-1.1.noarch.rpm 
这里的 jenkins 也可从清华镜像源下载指定版本:https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/。

2.安装完成后jenkins生成的主要目录如下

/usr/lib/jenkins/:jenkins 安装目录,war 包也在这里;
/etc/sysconfig/jenkins:jenkins 配置文件,端口、JENKINS_HOME 可在此处配置;
/var/lib/jenkins/:默认的 JENKINS_HOME;
/var/log/jenkins/jenkins.log:Jenkins 日志文件;

3.配置jenkins使用root用户身份运行

$ vim /etc/sysconfig/jenkins
JENKINS_USER="root"

4.解压离线插件到到/var/lib/jenkins/plugins 目录

$ tar xf jenkins_plugins.tar.gz -C /var/lib/jenkins

5.启动Jenkins

$ systemctl start jenkins
启动完成后会监听 8080 端口。

6.切换插件国内源

编辑/var/lib/jenkins/hudson.model.UpdateCenter.xml 文件,将 https://updates.jenkins.io/update-center.json 修改为 https://mirrors.huaweicloud.com/jenkins/updates/update-center.json。
上面使用的是华为源,还有清华源地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json。

7.使用浏览器访问

image.png
image.png

8.修改密码

image.png

第二章 简单构建一个小项目

要求构建完成后,输出Jenkins的工作目录。

1.新建任务并保存

image.png
image.png
image.png

2.添加构建步骤并保存

image.png
image.png

3.点击立即构建

image.png

4.查看控制台输出

image.png
image.png

第三章 发布Gitlab中的静态代码

由于 jenkins 主机要通过 git 从 gitlab 拉取代码,所以要保证 jenkins 主机能正常免密从gitlab拉取到代码,需要安装好git,还需要将jenkins主机的ssh公钥添加到gitlab.

1.下载测试用的html工程

https://gitee.com/kangjie1209/monitor」手动提交到 gitlab,或直接按如下操作将其导入 gitlab
image.png

2.在jenkins中关联gitlab中的monitor项目

这一步成功的前提是 jenkins 主机的公钥要配置到gitlab中,否则会因权限不足拉取不到gitlab中的代码

image.png

3.点击立即构建,检查jenkins主机的工作目录是否拉取到了gitlab中的代码

image.png

$ ll /var/lib/jenkins/workspace/My_FreeStyle_Job/|wc -l

4.编写部署脚本

$ cat /scripts/jenkins/deploy_monitor.sh 
#!/bin/bash
#
webserver_ip='10.0.1.7'
code_dir="${WORK_SPACE}"
web_code_dir="/code/monitor-${BUILD_ID}/"

# 打包 jenkins 主机拉取到的代码
cd $code_dir
tar zcf /tmp/monitor_code.tar.gz ./*

# 拷贝打包后的代码包到 web 主机的站点目录
scp /tmp/monitor_code.tar.gz root@${webserver_ip}:/tmp

# 解压 web 主机中的代码包并创建软链接
ssh root@$webserver_ip "mkdir ${web_code_dir} -p && cd /tmp && tar xf monitor_code.tar.gz -C ${web_code_dir} && cd /code/ && rm -rf monitor && ln -s ${web_code_dir} monitor"
上述脚本中的 ${WORK_SPACE} 和 ${BUILD_ID} 是 jenkins 的内置参数:
- ${WORK_SPACE} 是当前构建工程在 jenkins 主机中的工作目录,在上述示例中的值就是 /var/lib/jenkins/workspace/freestyle-prj;
- ${BUILD_ID} 是构建历史的序列号;
jenkins 中可使用的内置变量可通过 http://<jenkins 主机地址>/env-vars.html 查看。

5.修改jenkins构建时执行上述脚本

image.png

6.配置Web主机的Nginx虚拟主机

$ mkdir /code/
$ cat /etc/nginx/conf.d/web.conf 
server {
        listen 80;

        location / {
                root /code/monitor/;
        }
}

7.测试立即构建freestyle-prj,检查web主机的站点目录

$ ll /code
  lrwxrwxrwx 1 root  root    16 Apr 17 11:59 monitor -> /code/monitor-2/

8.测试访问

image.png

第四章 监听Gitlab自动触发构建

1. Jenkins项目中添加构建触发器,生成Secret token

image.png
image.png

2.在gitlab中添加webhook,复制上一步生成的Secret token和webhook URL到 gitlab

image.png

3.测试触发Push事件,如果成功触发jenkins对应的项目则会自动构建,如果成功则页面顶部将会返回HTTP 200状态码

image.png
image.png
此时如果通过git push代码到仓库时,jenkins就会自动构建并发布了。

第五章 参数化构建

1.配置参数化构建

image.png
image.png

2.打两个标签并提交

# 修改代码,打个 V1.0 标签
...
$ git commit -am 'v1.0'
$ git tag -a v1.0 -m 'v1.0 稳定版' 
$ git push -u origin v1.0

# 再次修改代码,打个 v2.0 标签
...
$ git commit -am 'v2.0'
$ git tag -a v2.0 -m 'v2.0 稳定版'        
$ git push -u origin v2.0

3.此时jenkins可以获取到gitlab中对应项目的所有标签

image.png

4.选中一个 tag,点击开始构建,就会拉取选中的tag版本代码进行发布。

5.修改发布脚本防止重复构建

$ cat /scripts/jenkins/deploy_monitor.sh 
#!/bin/bash
#
if [ ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ];then
        echo "monitor-${BUILD_ID} 已部署,不允许重复构建"
        exit
fi

webserver_ip='10.0.1.7'
code_dir="${WORKSPACE}"
web_code_dir="/code/monitor-${BUILD_ID}/"

# 打包 jenkins 主机拉取到的代码
cd $code_dir
tar zcf /tmp/monitor_code.tar.gz ./*

# 拷贝打包后的代码包到 web 主机的站点目录
scp /tmp/monitor_code.tar.gz root@${webserver_ip}:/tmp

# 解压 web 主机中的代码包并创建软链接
ssh root@$webserver_ip "mkdir ${web_code_dir} -p && cd /tmp && tar xf monitor_code.tar.gz -C ${web_code_dir} && cd /code/ && rm -rf monitor && ln -s ${web_code_dir} monitor"

此时如果重复构建相同的tag版本在jenkins控制台会输出不允许重复构建。

第六章 指定参数发布或回滚版本

1.配置添加选项参数

image.png

2.查看参数化构建

image.png

3.打标签

# 修改代码,打个 v3.0 4.0 5.0标签
...
$ git commit -am 'v3.0'
$ git tag -a v3.0 -m 'v3.0 稳定版'       
$ git push -u origin v3.0
# 修改代码,打个 v4.0 标签
...
$ git commit -am 'v4.0'   
$ git tag -a v4.0 -m 'v4.0 稳定版'     
$ git push -u origin v4.0

4.修改脚本

$ cat /scripts/jenkins/deploy_monitor.sh 
#!/bin/bash
#

webserver_ip='10.0.1.7'
code_dir="${WORKSPACE}"
web_code_dir="/code/monitor-${git_version}/"

deploy(){
        # 打包 jenkins 主机拉取到的代码
        cd $code_dir
        tar zcf /tmp/monitor_code.tar.gz ./*

        # 拷贝打包后的代码包到 web 主机的站点目录
        scp /tmp/monitor_code.tar.gz root@${webserver_ip}:/tmp

        # 解压 web 主机中的代码包并创建软链接
        ssh root@$webserver_ip "mkdir ${web_code_dir} -p && cd /tmp && tar xf monitor_code.tar.gz -C ${web_code_dir} && cd /code/ && rm -rf monitor && ln -s ${web_code_dir} monitor"
}
if [ "$deploy_env" == "deploy" ];then
        if [ ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ];then
                echo "monitor-${BUILD_ID} 已部署,不允许重复构建"
                exit
        fi
        deploy
else
        ssh root@$webserver_ip "cd /code/ && rm -rf monitor && ln -s ${web_code_dir} monitor"
fi

5.先构建v3.0,然后构建v4.0 v5.0

6.此时如果要回滚到v3.0,只需要选中v3.0,并在下拉框选中rollback

image.png

7.刷新web页面查看版本信息。

第七章 自动打标签项目

1.创建一个打标签工程

image.png

2.配置工程参数如下

image.png

3.添加构建shell

image.png

4.输入要打的标签名称,点击立即构建即可自动打标签

image.png

第八章 代码质量检测SonarQube

1.安装部署mysql

参考:https://www.pingface.com/archives/mysql57

  1. SonarQube基础java开发,需安装open JDK8版本
  2. SonarQube需要依赖MySQL数据库,至少5.6版本以上
  3. SonarQube的小型实例至少4G内存,如果大型实例需要16G内
# 安装好数据库之后需要创建sonar数据库
create database sonar DEFAULT CHARACTER SET utf8;

2.安装部署sonarqube服务端

  • 安装sonarqube
下载地址:https://www.sonarqube.org/downloads/ 
$ unzip sonarqube‐7.0.zip  
$ mv sonarqube‐7.0 /usr/local/  
$ ln ‐s /usr/local/sonarqube‐7.0/ /usr/local/sonarqube  
$ useradd sonar  
$ chown ‐R sonar.sonar /usr/local/sonarqube‐7.0/ 
  • 配置sonar连接本地数据库
vim /usr/local/sonarqube/conf/sonar.properties
sonar.jdbc.username=root  
sonar.jdbc.password=lizhenya123
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewrieBatchedStatements=true&useConfigs=maxPerformanc e&useSSL=false 
  • 使用普通用户启动sonarqube
$ su ‐ sonar ‐c "/usr/local/sonarqube/bin/linux‐x86‐64/sonar.sh start"
# 等几十秒后查看9000端口是否监听
$ netstat -lntup|grep java
  • 浏览器访问
启动后的端口为9000使用浏览器直接访问http://10.0.0.203:9000/about 
用户名admin 密码admin  
生成一个token,只显示一次,记录好.
jenkins: 7559e4be476a7bc9b52f0682a097381f790b0f3e
  • 配置sonarqube检测html代码
    image.png
    image.png
    image.png
    image.png
  • 配置管理sonar安装插件
1.安装中文汉化插件  
在页面上找到administrator > Marketplace > 搜索框 chinese,出现一个 chinese pack 然后点击install,安装完点击 restart 重启生效  
2.默认已安装C JAVA Python PHP JS 等代码质量分析工具,如果一个项目使用了JAVA CSS JS HTML,默认情况下sonar 只会检测JAVA,JS等代码的漏洞和bug,如果安装了HTML、CSS等插件,则会检测该项目代码中JAVA JS HTML CSS代码的漏洞和bug
2.手动安装插件
$ mv /usr/local/sonarqube/extensions/plugins /usr/local/sonarqube/extensions/plugins_bak 
$ rz ‐bye plugins.tar.gz  
$ tar xf plugins.tar.gz ‐C /usr/local/sonarqube/extensions 
$ chown -R sonar.sonar /usr/local/sonarqube/extensions/plugins  
$ su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart"

3.在Jenkins服务器上部署sonarqube客户端

jenkins服务器测试推送html代码至SonarQube检测
客户端其他版本下载地址搜索对应版本 例如:SonarScanner 4.0
https://docs.sonarqube.org/7.9/analysis/scan/sonarscanner/

$ rz -byte sonar-scanner-cli-4.0.0.1744-linux.zip
$ unzip sonar-scanner-cli-4.0.0.1744-linux.zip
$ mv sonar-scanner-4.0.0.1744-linux sonar-scanner-4.0.0.1744
$ ln -s /opt/src/sonar-scanner-4.0.0.1744 /usr/local/sonar-scanner
$ cd /usr/local/sonar-scanner
$ echo "export PATH=$PATH:/usr/local/sonar-scanner/bin" >> /etc/profile
$ source /etc/profile
$ vim /usr/local/sonar-scanner/conf/sonar-scanner.properties
sonar.host.url=http://10.0.1.203:9000
sonar.login=7559e4be476a7bc9b52f0682a097381f790b0f3e
sonar.sourceEncoding=UTF-8

4.sonarqube客户端推送代码

# 进入代码目录
$ cd /var/lib/jenkins/workspace/My_FreeStyle_Job/
# 推送代码
$ sonar-scanner -Dsonar.projectKey=html -Dsonar.sources=.
# 出现如下提示表示代码推送成功
`INFO: EXECUTION SUCCESS`

4.sonarqube服务端查看代码质量检测结果

image.png
image.png