Author: Devon

-Email: [email protected]

jenkins+Sonarqube+Gitlab+pipeline

一、什么是Devops?

DevOps 是开发和运维的缩写

DevOps 是一组最佳实践操作(研发,运维,测试)在应用和服务生命周期中的协作和沟通,强调整个组织的合作,以及交付和基础设施变更的自动化,从而实现持续集成,持续部署和持续交付

二、Jenkins安装

[root@devlop ~]# cat /etc/redhat-release

CentOS Linux release 7.6.1810 (Core)

[root@devlop ~]# uname -r

3.10.0-957.21.3.el7.x86_64

[root@devlop ~]# systemctl status firewalld

● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

安装Jenkins的源码包和java所需的环境

http://pkg.jenkins.io/redhat-stable/ 官网,我这里使用的是yum的方式这是快速安装方法,也可以使用官网war包放入tomcat或者docker安装都可以。

[root@devlop ~]# yum -y install java-1.8.0 java-devel

[root@devlop ~]# sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo

[root@devlop ~]# sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

[root@devlop ~]# yum -y install jenkins

[root@devlop ~]# systemctl start jenkins
[root@devlop ~]# yum -y install git sv

[root@devlop ~]# netstat -lntup|grep 8080

tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      4137/java

[root@devlop ~]# rpm -ql jenkins

/etc/init.d/jenkins         # 启动文件
/etc/logrotate.d/jenkins    # 日志分割配置文件
/etc/sysconfig/jenkins      # jenkins主配置文件
/usr/lib/jenkins            # 存放war包目录
/usr/lib/jenkins/jenkins.war   # war 包 
/usr/sbin/rcjenkins         # 命令
/var/cache/jenkins          # war包解压目录 jenkins网页代码目录
/var/lib/jenkins            # jenkins 工作目录
/var/log/jenkins            # 日志

[root@devlop ~]# grep "^[a-Z]" /etc/sysconfig/jenkins

JENKINS_HOME="/var/lib/jenkins"    #jenkins工作目录
JENKINS_JAVA_CMD=""
JENKINS_USER="jenkins"       # jenkinx启动用户
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"
JENKINS_PORT="8080"          # 端口
JENKINS_LISTEN_ADDRESS=""
JENKINS_HTTPS_PORT=""
JENKINS_HTTPS_KEYSTORE=""
JENKINS_HTTPS_KEYSTORE_PASSWORD=""
JENKINS_HTTPS_LISTEN_ADDRESS=""
JENKINS_DEBUG_LEVEL="5"
JENKINS_ENABLE_ACCESS_LOG="no"
JENKINS_HANDLER_MAX="100"     # 最大连接
JENKINS_HANDLER_IDLE="20"
JENKINS_ARGS=""

进入Web页面安装Jenkins

浏览器访问IP+端口(8080)

Devops持续化集成_第1张图片

复制Web页面提示的路径,并在服务器上展现出来,然后把展现出来的密码复制到页面的对话框

[root@devlop ~]# cat /var/lib/jenkins/secrets/initialAdminPassword

3c9cb6a2b37b457baac6370af43cd15a

输入后点击继续进入到安装插件页面。一般推荐的就OK啦。就算推荐的不可以或者安装失败我们可以进入jenkin后再进行安装。

Devops持续化集成_第2张图片

安装的时间稍微长一点,先喝杯茶,休息下哈。
Devops持续化集成_第3张图片

创建管理员用户

Devops持续化集成_第4张图片

如果有插件安装失败可以去这里选择安装对的的依赖

Devops持续化集成_第5张图片

全局工具配置

系统管理>>全局工具设置

这里面设置的是系统工具的路径等,比如jdk,maven,git等,如果你不设置,jenkins会自动去环境变量中找这些工具,所以要确保这些工具已经安装并存在环境变量中,如果是手动安装jdk等方式,则需要指定jdk的安装路径,或者这是环境变量等都是可以的

Devops持续化集成_第6张图片
Devops持续化集成_第7张图片

Jenkins的初始化配置

配置jenkins并发执行数量,提高执行效率
Devops持续化集成_第8张图片

Devops持续化集成_第9张图片
设置管理员邮箱 我是为了方便使用了QQ邮箱
Devops持续化集成
在QQ邮箱中开启POP3
Devops持续化集成_第10张图片
Devops持续化集成_第11张图片

测试成功后,点击 “ 保存 ”。

安装gitlab,Blue ocean插件(相当于jenkins的一个新主题界面)
Devops持续化集成_第12张图片
Devops持续化集成_第13张图片

然后等待安装重启。
Devops持续化集成_第14张图片
Devops持续化集成_第15张图片

Jenkins基于角色的权限管理RBAC

安装插件Role-based Authorization Strategy

Devops持续化集成_第16张图片

安装重启后生效。后设置全局安全配置

Devops持续化集成_第17张图片

保存退出!

创建用户devlops,打开系统管理—管理用户

Devops持续化集成_第18张图片

Devops持续化集成_第19张图片

返回系统管理

Devops持续化集成_第20张图片

管理角色

Devops持续化集成_第21张图片

Devops持续化集成_第22张图片

添加对devlop角色的权限控制

Devops持续化集成_第23张图片

点击Sava保存!!!

分配角色

Devops持续化集成_第24张图片
Devops持续化集成_第25张图片

点击Save,注销admin账户,测试devlop账户是否登录成功。

Devops持续化集成_第26张图片

登录成功,好了。我们就切回初始的管理员账户,让我们继续往下面操作吧!!!

Jenkins Pipeline实战

我们就先来构建一个自由风格的软件项目

Devops持续化集成_第27张图片
Devops持续化集成_第28张图片

Devops持续化集成_第29张图片

Devops持续化集成_第30张图片

Devops持续化集成_第31张图片

Devops持续化集成_第32张图片

Devops持续化集成_第33张图片

Devops持续化集成_第34张图片

输出成功

什么是Pipeline?

Jenkins Pipeline是一套插件,支持将连续输送Pipeline实施和整合到Jenkins。Pipeline提供了一组可扩展的工具,用于通过PipelineDSL为代码创建简单到复杂的传送Pipeline。

通常,此“Pipeline代码”将被写入 Jenkinsfile项目的源代码控制存储库,例如:

Devops持续化集成_第35张图片

 agent 表示Jenkins应该为Pipeline的这一部分分配一个执行者和工作区。
 stage 描述了这条Pipeline的一个阶段。
 steps 描述了要在其中运行的步骤 stage
 sh 执行给定的shell命令
 junit是由JUnit插件提供的 用于聚合测试报告的Pipeline步骤。

为什么是Pipeline?

Jenkins从根本上讲是一种支持多种自动化模式的自动化引擎。Pipeline在Jenkins上添加了一套强大的自动化工具,支持从简单的连续集成到全面的连续输送Pipeline的用例。通过建模一系列相关任务,用户可以利用Pipeline 的许多功能:

· 代码:Pipeline以代码的形式实现,通常被检入源代码控制,使团队能够编辑,审查和迭代其传送流程。

· 耐用:Pipeline可以在计划和计划外重新启动Jenkins管理时同时存在。

· Pausable:Pipeline可以选择停止并等待人工输入或批准,然后再继续Pipeline运行。

· 多功能:Pipeline支持复杂的现实世界连续交付要求,包括并行分叉/连接,循环和执行工作的能力。

· 可扩展:Pipeline插件支持其DSL的自定义扩展 以及与其他插件集成的多个选项。

虽然Jenkins一直允许基本形式的自由式工作联合起来执行顺序任务,Pipeline使这个概念成为Jenkins的最好的一个部分。

基于Jenkins的核心可扩展性,Pipeline也可以由Pipeline共享库用户和插件开发人员扩展。

下面的流程图是在Jenkins Pipeline中容易建模的一个连续发货方案的示例:

Devops持续化集成_第36张图片

Pipeline 条件

Step

单一任务,从基础中告诉了Jenkins应该怎么做。例如,要执行shell命令,请make使用以下sh步骤:sh 'make'。当插件扩展Pipeline DSL时,通常意味着插件已经实现了一个新的步骤

Node

Pipeline执行中的大部分工作都是在一个或多个声明node步骤的上下文中完成的。将工作限制在Node步骤中有两件事情:

1.通过将项目添加到Jenkins队列来调度要运行的块中包含的步骤。一旦执行器在节点上空闲,步骤就会运行。

2.创建工作区(特定于该特定Pipeline的目录),可以从源代码控制中检出的文件完成工作。

根据您的Jenkins配置,某些工作空间在一段时间不活动后可能无法自动清除。

Stage

stage是定义整个Pipeline的概念上不同子集的一个步骤,例如:“Build”,“Test”和“Deploy”,许多插件用于可视化或呈现Jenkins Pipeline状态/进度。

Devops持续化集成_第37张图片

测试pipeline,点击保存

Devops持续化集成_第38张图片

立即构建

Devops持续化集成_第39张图片

鼠标放在上面可以查看构建日志

Devops持续化集成_第40张图片

Jenkins Pipeline测试

创建测试代码项目组

Devops持续化集成_第41张图片

Devops持续化集成_第42张图片

新建项目

Devops持续化集成_第43张图片
Devops持续化集成_第44张图片

添加Readme文件,里面随便写点内容,模仿代码

Devops持续化集成_第45张图片

Devops持续化集成_第46张图片

Devops持续化集成_第47张图片

Jenkins生成证书拉取gitlab代码

[root@devlop ~]# ssh-keygen

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:GyU/XcAADlievbP0alHbDuAAZ6D6/Tvcse2SOtLlrWk root@devlop
The key's randomart image is:
+---[RSA 2048]----+
|    .+o ...o.    |
|   .o.o=    ..   |
|  .  +o + .   .  |
| .    . .=.. .   |
|.      oSooo.    |
| . .   .=*o..    |
|  . .o +oB.o     |
|    ..= Eoo .    |
|     .+B++.      |
+----[SHA256]-----+

Gitlab放置公钥

Devops持续化集成_第48张图片

Devops持续化集成_第49张图片

复制jenkins公钥用来拉代码

[root@devlop ~]# cat .ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJP+CagFYsc51nMU+JnXgcOBmAhee5GndsJqQ1Ay4Yyibg2gQd/3q8/BhRFw3kiHkL0jIIpmqos+e9Wx8CKSPMVeOn6Qel/qJcqElyBNPQlCu59DmKTxtmOzpWR1si+GC2+stgNEjcP/c0AmUjuhhZtHduMYo0pjSaEh2UT3nWiE8POhkWuLyT/nLEpePQx3Vt2zlwq+XA2bYSJEgYE5NlDT5GCUy5WmV/n73/3Ioc3AI0WqD5aPzneWyPeCD1CqjCwonu68NYPl/B+pRQiQQ9s/fAeRRl2KQZvYtD+6n/tr6rjUlLRrIaotVjmcKiS827EK1eEVmCD7cOq+ZSDDat root@devlop

Devops持续化集成_第50张图片

Devops持续化集成_第51张图片

Devops持续化集成_第52张图片

Devops持续化集成_第53张图片

Devops持续化集成_第54张图片

[root@devlop ~]# cat /root/.ssh/id_rsa

将gitlab的公钥加入到demo项目当中

Devops持续化集成_第55张图片

Devops持续化集成_第56张图片

再来看下就没有报错信息了

Devops持续化集成_第57张图片

Hostname解析错误

[root@devlop ~]# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.16   gitlab.example.com

Devops持续化集成_第58张图片

复制生成的脚本到项目中

Devops持续化集成_第59张图片

测试构建已经成功拉取代码

Devops持续化集成_第60张图片

查看拉取到的代码

[root@devlop pipeline-demo]# pwd

/var/lib/jenkins/workspace/pipeline-demo

[root@devlop pipeline-demo]# ll

total 4
-rw-r--r--. 1 jenkins jenkins 4 Oct 31 17:25 README.md

如果要执行脚本等命令如下加sh后面可接任何命令

Devops持续化集成_第61张图片

可以看到成功执行了刚刚的cat命令

Devops持续化集成_第62张图片

交互

比如说单元测试完毕,要部署到测试环境,jenkins会有一个交互,让你确认是否部署到测试环境

Devops持续化集成_第63张图片

构建(确认就往下部署,中断就不会执行)

Devops持续化集成_第64张图片

查看日志部署成功

Devops持续化集成_第65张图片

Jenkins分布式构建

节点管理

Slave统一目录和安装好jdk

系统设置>节点管理

Slave节点组好统一目录

$ mkdir /data/jenkins-slave -p          这是slave的数据目录 
$ yum install -y java-1.8.0             必须安装jdk否则slave节点的jenkins起不来

新建节点

Devops持续化集成_第66张图片

Devops持续化集成_第67张图片

Devops持续化集成_第68张图片

Devops持续化集成_第69张图片

Devops持续化集成_第70张图片

时间同步 ntpdate

需要注意两台机器的时间是否一致

Devops持续化集成_第71张图片

大规模使用时,master是不进行构建工作的,都是由slave节点进行工作,执行者置为0

系统管理>节点管理>master

Devops持续化集成_第72张图片

如果现在执行构建的话就会在slave节点上面进行构建了

可以在节点目录/data/jenkins-slave/workspace/pipeline-demo下查看是否有拉取的代码

Devops持续化集成_第73张图片

如果有多个节点都会显示在构建执行状态下面,我们现在只有一台slave

Devops持续化集成_第74张图片

如果没有公网的情况下安装Jenkins

如何在没有外网的环境下安装jenkins

1.事先在有网的地方将jenkins安装好,将所有插件安装好,将/var/lib/jenkins打一个包

2.在新机器上设置环境变量/etc/profile中添加JAVA_HOME=/var/lib/jenkins即可

3.tomcat放入jenkins的war包启动即可

质量扫描SonarQube

代码质量七宗罪

https://www.sonarqube.org/ 官方网站

  1. 编码规范:是否遵守了编码规范,遵循了最佳实践。

  2. 潜在的BUG:可能在最坏情况下出现问题的代码,以及存在安全漏洞的代 码。

  3. 文档和注释:过少(缺少必要信息)、过多(没有信息量)、过时的文档 或注释。

  4. 重复代码:违反了Don’tRepeat Yourself原则。

  5. 复杂度:代码结构太复杂(如圈复杂度高),难以理解、测试和维护。

  6. 测试覆盖率:编写单元测试,特别是针对复杂代码的测试覆盖是否足够。

  7. 设计与架构:是否高内聚、低耦合,依赖最少。

Devops持续化集成_第75张图片

安装SonarQube

所在机器必须要安装有Jdk

下载长期支持版

[root@devlop ~]# mkdir /server/tools -p

[root@devlop ~]# cd /server/tools

[root@devlop tools]# wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-6.7.5.zip

[root@devlop tools]# unzip sonarqube-6.7.5.zip

[root@devlop tools]# mv sonarqube-6.7.5 /usr/local

[root@devlop tools]# ln -s /usr/local/sonarqube-6.7.5/ /usr/local/sonarqube

快速安装MySQL

你可以使用源码安装,或者yum,我是之前的编译安装的脚本,跑下脚本,喝杯茶休息下哈!

#!/bin/bash
yum -y update
#Definition originally
pass='Admin@123'
#install download
yum -y install ncurses ncurses-devel openssl-devel bison gcc gcc-c++ make cmake

#官网下载
wget_boost=http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
wget_mysql=https://downloads.mysql.com/archives/get/file/mysql-5.7.19.tar.gz

#下载地方
wget $wget_boost
wget $wget_mysql

#install MySQL
groupadd mysql
useradd -r -g mysql -s /bin/flase mysql
tar xf mysql-5.7.19.tar.gz

#install boost
mv boost_1_59_0.tar.gz mysql-5.7.19
cd mysql-5.7.19/
tar xf boost_1_59_0.tar.gz

#To configure (配置)
cmake . \
-DWITH_BOOST=boost_1_59_0/ \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DSYSCONFDIR=/etc \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DINSTALL_MANDIR=/usr/share/man \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1
EOF
#compile(编译)
make

#install
make install

#-DCMAKE_INSTALL_PREFIX:安装路径
#-DMYSQL_DATADIR:数据存放目录
#-DWITH_BOOST:boost源码路径
#-DSYSCONFDIR:my.cnf配置文件目录
#-DEFAULT_CHARSET:数据库默认字符编码
#-DDEFAULT_COLLATION:默认排序规则
#-DENABLED_LOCAL_INFILE:允许从本文件导入数据
#-DEXTRA_CHARSETS:安装所有字符集

#Initialization(初始化)
cd /usr/local/mysql/
mkdir mysql-files
chown -R mysql.mysql  /usr/local/mysql
#注意目录名称,此处为自己自建的目录

#将获得的临时密码追加到passwd.txt中(出错)
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
read -p "请输入你的初始密码: " passwd
echo "$passwd" >>/root/startpass.txt
bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data

#备份原配置文件
mv /etc/my.cnf /etc/cpmy.cnf
cat >/etc/my.cnf <<-EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
EOF

#启动mysql
cp support-files/mysql.server /etc/init.d/mysqld
#添加mysql服务
chkconfig --add mysqld
#开机自启动服务
chkconfig mysqld on
#service mysqld start
systemctl start mysqld
systemctl enable mysqld

#将mysql命令加入profile文件
echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile

mysqladmin -uroot -p''`cat /root/startpass.txt`'' password ''$pass'' >>/dev/null
if [ $? -eq 0 ]
then
echo "------------------------------------------"
echo -e "\033[34m 新的密码为: $pass \033[0m "
echo -e "\033[35m 数据库创建成功!! \033[0m"
else
echo -e "\033[36m 修改密码失败 \033[0m"
fi

[root@devlop ~]# /usr/local/mysql/bin/mysql -uroot -p'Admin@123'

mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;

mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';

mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';

mysql> FLUSH PRIVILEGES;

SonarQube配置

配置连接数据库

root@devlop ~]# cd /usr/local/sonarqube/conf/

[root@devlop conf]# ls

sonar.properties  wrapper.conf

[root@devlop conf]# vim sonar.properties

sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://192.168.0.16:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatc
hedStatements=true&useConfigs=maxPerformance

配置日志搜集的初始化内存(我这里是虚拟机设置成500M,默认是2个g)

[root@devlop ~]# cd /usr/local/sonarqube/elasticsearch/config/

[root@devlop config]# vim jvm.options

-Xms500m
-Xmx500m

使用普通用户启动,不能使用root启动,要不然会报错

[root@devlop sonarqube]# useradd sonar

[root@devlop sonarqube]# id sonar

uid=1000(sonar) gid=1001(sonar) groups=1001(sonar)

[root@devlop sonarqube]# chown -R sonar:sonar /usr/local/sonarqube

[root@devlop sonarqube]# chown -R sonar:sonar /usr/local/sonarqube-6.7.5/

启动完可以检查logs下的日志是否有报错(启动可能有点慢,因为正在数据库创建表)

[root@devlop ~]# su - sonar

Last login: Sat Nov 10 00:27:05 CST 2018 on pts/0

[sonar@devlop ~]$ /usr/local/sonarqube/bin/linux-x86-64/sonar.sh start

浏览器访问192.168.0.16:9000

登陆账号:admin 密码:admin

Devops持续化集成_第76张图片

Devops持续化集成_第77张图片

Devops持续化集成_第78张图片

SonarQube扫描器

下载扫描器

https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner

Linux直接下载: wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.2.0.1227-linux.zip

Devops持续化集成_第79张图片

解压扫描器

[root@devlop tools]# unzip sonar-scanner-cli-3.2.0.1227-linux.zip

[root@devloptools]# mv sonar-scanner-3.2.0.1227-linux/ /usr/local/

[root@devloptools]# ln -s /usr/local/sonar-scanner-3.2.0.1227-linux/ /usr/local/sonar-scanner

配置

[root@devlop ~]# cd /usr/local/sonar-scanner/conf

[root@devlop conf]# vim sonar-scanner.properties

sonar.host.url=http://10.0.0.11:9000
sonar.sourceEncoding=UTF-8

测试代码分析,下载测试代码

https://github.com/SonarSource

Devops持续化集成_第80张图片

上传解压配置

[root@devlop local]# unzip sonar-scanning-examples-master.zip

[root@devlop local]# cd sonar-scanning-examples-master/sonarqube-scanner-maven

[root@devlop sonarqube-scanner-maven]# vim sonar-project.properties

sonar.projectKey=devops-demo
sonar.projectName=devops-demo
sonar.projectVersion=1.0  
sonar.sources=. 
sonar.java.binaries=.
sonar.sourceEncoding=UTF-8

执行扫描(是在代码目录进行执行扫描)

[root@devlop sonarqube-scanner-maven]# /usr/local/sonar-scanner/bin/sonar-scanner

扫描完毕就可以在浏览器查看了

Devops持续化集成_第81张图片

Devops持续化集成_第82张图片

SonarQube设置中文

Devops持续化集成_第83张图片

如果web界面安装失败就手动下载安装

这是对应我6.7.5的中文语言包

https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases/tag/sonar-l10n-zh-plugin-1.19

/usr/local/sonarqube/extensions/plugins #可以手动下载下来jar包放入到这个目录即可

#版本不一样的要对照一下相应的中文包,要不然服务启动会报错,注意看日志

安装完重启服务,可以看到已经是中文语言了

Devops持续化集成_第84张图片

SonarQube和jenkins集成

安装sonar插件

Devops持续化集成_第85张图片

Devops持续化集成_第86张图片

设置SonarQube-server

Devops持续化集成_第87张图片

Devops持续化集成_第88张图片

SonarQube生成token

Devops持续化集成_第89张图片

复制到jenkins 的token选项中

Pipeline集成SonarQube

点击项目的配置添加扫描,如果slave进行扫描也要安装扫描器才可以

Devops持续化集成_第90张图片

本地将代码克隆下来

$ git clone http://gitlab.example.com/devops/demo.git

Cloning into 'demo'...
Username for 'http://gitlab.example.com': root   #gitlab用户名
Password for 'http://[email protected]':   #密码
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.

$ cd demo

$ cp -a /usr/local/sonar-scanning-examples-master/sonarqube-scanner-maven/* ./

$ git add *

$ git commit –m "first commit"

$ git config --global user.name "Yang Shi Yi"

$ git config --global user.email [email protected]

$ git push

网页查看已经成功提交

Devops持续化集成_第91张图片

Devops持续化集成_第92张图片

Jenkins执行构建测试查看是否进行质量扫描

Devops持续化集成_第93张图片

结果扫描成功,但是没有看到sonarqube的小图标呢,下一步添加sonarqube的图标

Devops持续化集成_第94张图片

Devops持续化集成_第95张图片

Sonarcanner扫描报错

INFO: Analysis report generated in 9263ms, dir size=11 MB
INFO: Analysis reports compressed in 5699ms, zip size=4 MB
INFO: ------------------------------------------------------------------------
INFO: EXECUTION FAILURE
INFO: ------------------------------------------------------------------------
INFO: Total time: 6:28.455s
INFO: Final Memory: 29M/1274M
INFO: ------------------------------------------------------------------------
ERROR: Error during SonarQube Scanner execution
ERROR: Failed to upload report - 500: An error has occurred. Please contact your administrator
ERROR:
ERROR: Re-run SonarQube Scanner using the -X switch to enable full debug logging.

结果是“EXECUTION FAILURE” 失败了。

失败原因是啥呢? 注意我加粗的文字。 分析的报告大小是 11MB,压缩之后4MB。还是很大的。上传失败的原因是 MYSQL配置问题。

在mysql的终端窗口输入如下命令:

mysql> show VARIABLES like '%max_allowed_packet

修改/etc/my.cnf文件:

max_allowed_packet = 50M

重启数据库即可,有时候还需要重启下Sonarqube.

Gitlab和jenkins集成

设置gitlab token

Devops持续化集成_第96张图片

Devops持续化集成_第97张图片

系统管理>系统设置>gitlab #需要安装gitlab查看才有看到,如没有看到请安装gitlab插件

Devops持续化集成_第98张图片

Devops持续化集成_第99张图片

Devops持续化集成_第100张图片

Devops持续化集成_第101张图片

设置触发器(开发push就触发构建)

Devops持续化集成_第102张图片

Devops持续化集成_第103张图片

Devops持续化集成_第104张图片

设置钩子webhook

Gitlab设置jenkins生成的token(要先进入项目)

Devops持续化集成_第105张图片

Devops持续化集成_第106张图片

需要注意我这里修改了默认端口,我的是8081,所以填在gitlab的时候要改成8081

Devops持续化集成_第107张图片

如果添加钩子失败报错请看下面解决方法

Devops持续化集成

产生原因,因为jenkins和gitlab在同一台机器上面,默认不允许

解决方法

Devops持续化集成_第108张图片

测试钩子是否成功

Devops持续化集成_第109张图片
Devops持续化集成

Jenkins已经自动触发构建,因为我test push了两次
Devops持续化集成_第110张图片

DevOps之部署流水线

软件交付(部署)流水线

软件交付流水线是指软件变更从提交到版本控制库,到发布给用户 的整个过程

软件的每次变更都会经历一个复杂的流程才能发布

这个流程包括构建软件、一系列不同阶段的测试与部署等,需要多 团队协作完成 • 交付流水线对交付流程进行了建模,并支持查看、控制整个交付流程

部署流水线的环境

Devops持续化集成_第111张图片

部署流水线的阶段和环境

Devops持续化集成_第112张图片

流水线反馈过程

Devops持续化集成_第113张图片

加快代码反馈结果,能都让代码快速部署在生产环境

部署流水线分阶段实施

Devops持续化集成_第114张图片

部署流水线设计和规划

流水线案例

可靠可重复的流水线

通过流水线阶段晋级,平衡测试反馈速度与覆盖度

通过流水线分析瓶颈,识别自动化改造点和协作点

Devops持续化集成_第115张图片

部署流水线实践

只生成一次二进制包(代码只打一次包,不需要多次打包)

对不同环境采用同一部署方式

对部署进行冒烟测试

向生产环境的副本中部署(PAT)

每次变更都要立即在流水线中传递

只有有环节失败,就停止整个流水线

部署流水线Git分支设计

Devops持续化集成_第116张图片

创建开发分支

Devops持续化集成_第117张图片

Devops持续化集成_第118张图片

Devops持续化集成_第119张图片

创建gitlab用户

创建gitlab用户张三开发者和开发经理李四来模仿普通开发和开发经理合并分支并触发流水线

Devops持续化集成_第120张图片

Devops持续化集成_第121张图片

Devops持续化集成_第122张图片

Devops持续化集成_第123张图片

创建lisi用户同上面一样,请自行创建

将用户加入项目组

进入项目

Devops持续化集成_第124张图片

Devops持续化集成_第125张图片

Devops持续化集成_第126张图片

Devops持续化集成_第127张图片

Devops持续化集成_第128张图片

Devops持续化集成_第129张图片

开发拉取项目

Devops持续化集成_第130张图片

Linux客户端操作

Devops持续化集成_第131张图片

Devops持续化集成_第132张图片

张三用户往develop分支提交代码就触发提交阶段的流水线

提交阶段流水线设计与实现

持续集成-提交阶段

持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次, 也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试) 来验证,从而尽早地发现集成错误。

统一的代码库

每个人每天都要向代码库主干提交代码

每次代码递交后都会在持续集成服务器上触发构建

自动构建,快速构建,每次构建都要100%通过

模拟生产环境的自动测试

每个人都可以很容易的获取最新可执行的应用程序

每个人都清楚正在发生的状况

修复失败的构建是优先级最高的事情

提交阶段要做的事情

创建流水线

1.拉取代码 >> 2.代码 >> 3.单元测试 >> 4.构建打包 >> 5.质量扫描 >> 6.邮件通知

Devops持续化集成_第133张图片

Devops持续化集成

我这里是已经创建过了

配置触发器

Devops持续化集成_第134张图片

设置钩子脚本

Devops持续化集成_第135张图片

模仿开发提交代码到develop分支触发提交阶段流水线

Devops持续化集成_第136张图片

发现jenkins已经触发流水线操作

Devops持续化集成_第137张图片

安装maven

在jenkins所在服务器安装maven

打开官网: http://maven.apache.org/

或者直接wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz

Devops持续化集成_第138张图片

Devops持续化集成_第139张图片

Jenkins服务器操作

[root@devlop wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz

[root@devlop tools]# tar xf apache-maven-3.6.0-bin.tar.gz

[root@devlop tools]# mv apache-maven-3.6.0/ /usr/local/maven

测试mvn

Devops持续化集成_第140张图片

这是代码:

node {
   stage('拉取代码'){
       echo "Code pull"
       git credentialsId: 'a3b87131-a21b-4042-a537-06bb088a0ca4', url: '[email protected]:devops/java-demo.git'
   }
   stage('代码编译'){
       echo "Code Build"
       sh "/usr/local/maven/bin/mvn clean compile"
   }
   stage('单元测试'){
       echo "uniunit test"
       sh "/usr/local/maven/bin/mvn test"
   }
   stage('质量扫描 '){
       withSonarQubeEnv('Sonarqube'){
       sh '/usr/local/sonar-scanner/bin/sonar-scanner'
   }
  }
   stage('邮件通知'){
       echo "Mail"
       emailext body: '', subject: 'jenkins邮件通知:提交阶段自动化验证通过', to: '[email protected]'
   }
}
#邮件我这里已经写好了,邮箱配置请参考jenkins安装时的初始化即可,下面会介绍怎么生成语法

构建(第一次构建可能比较慢,会下载很多maven插件)

Devops持续化集成_第141张图片

mvn编译报错

No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

#yum -y install java-devel即可解决

邮箱语法生成

Devops持续化集成_第142张图片

Devops持续化集成_第143张图片

直接粘贴过来,保存构建

Devops持续化集成_第144张图片

这是系统发送给我的邮箱

Devops持续化集成_第145张图片

Gitlab实现对jenkins的构建状态查看

添加gitlabCommitStatus字段

node {
    gitlabCommitStatus(name:"Commit BUild"){
   stage('拉取代码'){
       echo "Code pull"
       git credentialsId: 'a3b87131-a21b-4042-a537-06bb088a0ca4', url: '[email protected]:devops/java-demo.git'
   }
   stage('代码编译'){
       echo "Code Build"
       sh "/usr/local/maven/bin/mvn clean compile"
   }
   stage('单元测试'){
       echo "uniunit test"
       sh "/usr/local/maven/bin/mvn test"
   }
    }
   stage('质量扫描 '){
       withSonarQubeEnv('Sonarqube'){
       sh '/usr/local/sonar-scanner/bin/sonar-scanner'
   }
  }
   stage('邮件通知'){
       echo "Mail"
       emailext body: '', subject: 'jenkins邮件通知:提交阶段自动化验证通过', to: '[email protected]'
   }
}

这里可以修改一下代码提交到develop分支触发构建,然后使用张三用户登录gitlab

Devops持续化集成

Devops持续化集成_第146张图片

最下面就可以看到这个代码是否测试通过,通过就可以安心的创建合并请求到master了

Devops持续化集成_第147张图片

点击还可以进入到BlueOcean(这个就是刚开始安装的插件)

Devops持续化集成_第148张图片

Devops持续化集成_第149张图片

集成测试阶段实现

开发经理合并develop分支到master触发集成测试阶段

使用zhangsan用户修改代码然后push

Devops持续化集成_第150张图片

使用张三用户登录gitlab

第一次登录会让你修改密码,我这里已经修改好了

Devops持续化集成_第151张图片

Devops持续化集成_第152张图片

Devops持续化集成_第153张图片

退出gitlab使用lisi登录

Devops持续化集成_第154张图片

开发经理合并分支

Devops持续化集成

Devops持续化集成_第155张图片

创建集成测试项目

Devops持续化集成_第156张图片

Devops持续化集成_第157张图片

Devops持续化集成_第158张图片

设置webhook

打开gitlab,打开项目,上面有教程,这里不过多演示

Devops持续化集成_第159张图片

在gitlab就可以测试是否成功

点击push events

Devops持续化集成_第160张图片

Devops持续化集成_第161张图片

查看是否200 OK

Devops持续化集成_第162张图片

再查看jenkins任务已经触发

Devops持续化集成_第163张图片

应该由测试人员手动创建环境所以这里要有一个交互

添加在邮件通知的后面

      stage('是否部署测试环境 '){
      input "是否部署" 
   }
    stage('部署测试环镜'){
      echo "部署SIT" 
   }
    stage('自动化测试'){
      echo "auto test" 
   }
    stage('邮件通知'){
      echo "Email" 
   }

Devops持续化集成_第164张图片

点击构建就可以实现交互,需要点击确定才会继续往下走

Devops持续化集成_第165张图片

异常检测发送邮件

如果这流水线中途现了什么问题,就暂停了,就收不到邮件了,所以要有一个异常捕捉并发送邮件

Devops持续化集成_第166张图片

将所有的阶段包在里面,定义函数,捕捉错误信息,下面是捕捉到之后发送邮件

测试将代码修改错误

Devops持续化集成_第167张图片

构建报错

Devops持续化集成_第168张图片

Devops持续化集成_第169张图片

好了,千辛万苦终于可以休息下了。这边文章本属我们公司Alex所贡献,本人感觉挺优秀就给大家分享下。