Author: Devon

-Email: devon@gotobus.com

jenkins+Sonarqube+Gitlab+pipeline

一、什么是Devops?

DevOps 是开发和运维的缩写

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

二、Jenkins安装

[root@devlop ~]# cat /etc/redhat-release <!--我的Centos环境-->

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 daemonLoaded: 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 <!--启动Jenkins-->
[root@devlop ~]# yum -y install git sv<!--jenkins默认会在环境变量中找这些工具,所以要有-->

[root@devlop ~]# netstat -lntup|grep 8080 <!--默认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持续化集成

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

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

3c9cb6a2b37b457baac6370af43cd15a

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

Devops持续化集成

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

创建管理员用户

Devops持续化集成

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

Devops持续化集成

全局工具配置

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

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

Devops持续化集成
Devops持续化集成

Jenkins的初始化配置

配置jenkins并发执行数量,提高执行效率
Devops持续化集成

Devops持续化集成
设置管理员邮箱 我是为了方便使用了QQ邮箱
Devops持续化集成
在QQ邮箱中开启POP3
Devops持续化集成
Devops持续化集成

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

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

然后等待安装重启。
Devops持续化集成
Devops持续化集成

Jenkins基于角色的权限管理RBAC

安装插件Role-based Authorization Strategy

Devops持续化集成

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

Devops持续化集成

保存退出!

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

Devops持续化集成

Devops持续化集成

返回系统管理

Devops持续化集成

管理角色

Devops持续化集成

Devops持续化集成

添加对devlop角色的权限控制

Devops持续化集成

点击Sava保存!!!

分配角色

Devops持续化集成
Devops持续化集成

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

Devops持续化集成

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

Jenkins Pipeline实战

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

Devops持续化集成
Devops持续化集成

Devops持续化集成

Devops持续化集成

Devops持续化集成

Devops持续化集成

Devops持续化集成

Devops持续化集成

输出成功

什么是Pipeline?

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

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

Devops持续化集成

 agent 表示Jenkins应该为Pipeline的这一部分分配一个执行者和工作区。stage 描述了这条Pipeline的一个阶段。steps 描述了要在其中运行的步骤 stagesh 执行给定的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持续化集成

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持续化集成

测试pipeline,点击保存

Devops持续化集成

立即构建

Devops持续化集成

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

Devops持续化集成

Jenkins Pipeline测试

创建测试代码项目组

Devops持续化集成

Devops持续化集成

新建项目

Devops持续化集成
Devops持续化集成

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

Devops持续化集成

Devops持续化集成

Devops持续化集成

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持续化集成

Devops持续化集成

复制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持续化集成

Devops持续化集成

Devops持续化集成

Devops持续化集成

Devops持续化集成

[root@devlop ~]# cat /root/.ssh/id_rsa <!--私钥位置信息,要全部复制-->

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

Devops持续化集成

Devops持续化集成

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

Devops持续化集成

Hostname解析错误

[root@devlop ~]# vim /etc/hosts <!--设置一下git的解析就可以了-->

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持续化集成

复制生成的脚本到项目中

Devops持续化集成

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

Devops持续化集成

查看拉取到的代码

[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持续化集成

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

Devops持续化集成

交互

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

Devops持续化集成

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

Devops持续化集成

查看日志部署成功

Devops持续化集成

Jenkins分布式构建

节点管理

Slave统一目录和安装好jdk

系统设置>节点管理

Slave节点组好统一目录

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

新建节点

Devops持续化集成

Devops持续化集成

Devops持续化集成

Devops持续化集成

Devops持续化集成

时间同步 ntpdate

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

Devops持续化集成

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

系统管理>节点管理>master

Devops持续化集成

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

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

Devops持续化集成

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

Devops持续化集成

如果没有公网的情况下安装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持续化集成

安装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/profilemysqladmin -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 <!--IP+9000(端口)-->

登陆账号:admin 密码:admin

Devops持续化集成

Devops持续化集成

Devops持续化集成

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持续化集成

解压扫描器

[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持续化集成

上传解压配置

[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持续化集成

Devops持续化集成

SonarQube设置中文

Devops持续化集成

如果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持续化集成

SonarQube和jenkins集成

安装sonar插件

Devops持续化集成

Devops持续化集成

设置SonarQube-server

Devops持续化集成

Devops持续化集成

SonarQube生成token

Devops持续化集成

复制到jenkins 的token选项中

Pipeline集成SonarQube

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

Devops持续化集成

本地将代码克隆下来

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

Cloning into 'demo'...
Username for 'http://gitlab.example.com': root   #gitlab用户名
Password for 'http://root@gitlab.example.com':   #密码
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 admin@163.com

$ git push

<!--输入用户名和密码即可push到gitlab成功-->

网页查看已经成功提交

Devops持续化集成

Devops持续化集成

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

Devops持续化集成

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

Devops持续化集成

Devops持续化集成

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持续化集成

Devops持续化集成

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

Devops持续化集成

Devops持续化集成

Devops持续化集成

Devops持续化集成

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

Devops持续化集成

Devops持续化集成

Devops持续化集成

设置钩子webhook

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

Devops持续化集成

Devops持续化集成

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

Devops持续化集成

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

Devops持续化集成

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

解决方法

Devops持续化集成

测试钩子是否成功

Devops持续化集成
Devops持续化集成

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

DevOps之部署流水线

软件交付(部署)流水线

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

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

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

部署流水线的环境

Devops持续化集成

部署流水线的阶段和环境

Devops持续化集成

流水线反馈过程

Devops持续化集成

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

部署流水线分阶段实施

Devops持续化集成

部署流水线设计和规划

流水线案例

可靠可重复的流水线

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

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

Devops持续化集成

部署流水线实践

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

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

对部署进行冒烟测试

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

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

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

部署流水线Git分支设计

Devops持续化集成

创建开发分支

Devops持续化集成

Devops持续化集成

Devops持续化集成

创建gitlab用户

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

Devops持续化集成

Devops持续化集成

Devops持续化集成

Devops持续化集成

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

将用户加入项目组

进入项目

Devops持续化集成

Devops持续化集成

Devops持续化集成

Devops持续化集成

Devops持续化集成

Devops持续化集成

开发拉取项目

Devops持续化集成

Linux客户端操作

Devops持续化集成

Devops持续化集成

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

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

持续集成-提交阶段

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

统一的代码库

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

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

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

模拟生产环境的自动测试

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

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

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

提交阶段要做的事情

创建流水线

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

Devops持续化集成

Devops持续化集成

我这里是已经创建过了

配置触发器

Devops持续化集成

设置钩子脚本

Devops持续化集成

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

Devops持续化集成

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

Devops持续化集成

安装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持续化集成

Devops持续化集成

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持续化集成

这是代码:

node {stage('拉取代码'){echo "Code pull"git credentialsId: 'a3b87131-a21b-4042-a537-06bb088a0ca4', url: 'git@192.168.20.8: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: '548521545@qq.com'}
}
#邮件我这里已经写好了,邮箱配置请参考jenkins安装时的初始化即可,下面会介绍怎么生成语法

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

Devops持续化集成

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持续化集成

Devops持续化集成

直接粘贴过来,保存构建

Devops持续化集成

这是系统发送给我的邮箱

Devops持续化集成

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

添加gitlabCommitStatus字段

node {gitlabCommitStatus(name:"Commit BUild"){stage('拉取代码'){echo "Code pull"git credentialsId: 'a3b87131-a21b-4042-a537-06bb088a0ca4', url: 'git@192.168.20.8: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: '921390093@qq.com'}
}

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

Devops持续化集成

Devops持续化集成

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

Devops持续化集成

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

Devops持续化集成

Devops持续化集成

集成测试阶段实现

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

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

Devops持续化集成

使用张三用户登录gitlab

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

Devops持续化集成

Devops持续化集成

Devops持续化集成

退出gitlab使用lisi登录

Devops持续化集成

开发经理合并分支

Devops持续化集成

Devops持续化集成

创建集成测试项目

Devops持续化集成

Devops持续化集成

Devops持续化集成

设置webhook

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

Devops持续化集成

在gitlab就可以测试是否成功

点击push events

Devops持续化集成

Devops持续化集成

查看是否200 OK

Devops持续化集成

再查看jenkins任务已经触发

Devops持续化集成

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

添加在邮件通知的后面

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

Devops持续化集成

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

Devops持续化集成

异常检测发送邮件

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

Devops持续化集成

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

测试将代码修改错误

Devops持续化集成

构建报错

Devops持续化集成

Devops持续化集成

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

Devops持续化集成相关推荐

  1. 第七章 移动自动化持续化集成(下)

    --------手机自动化之Appium (4)增加构建步骤,这是如何执行我们项目工程的命令,如:python src/TestSuites/OnlineTestSuite.py.构建的时候就会执行这 ...

  2. 如何搭建安卓开发持续化集成环境(Ubuntu + Jenkins + SonarQube)

    本文讲的是如何搭建安卓开发持续化集成环境(Ubuntu + Jenkins + SonarQube), 我最近换了一台新的 MacBook Pro 作为我的 Android 开发机.旧的 Mac Bo ...

  3. 撸一套持续化集成-实现RN的差分更新

    目录 一.搭建Jenkins环境 1. 下载Jenkins镜像 2. 开启Jenkins服务 3. Docker填坑 4. Jenkins填坑 二.RN的Jenkins打包脚本 1. Jenkinsf ...

  4. [原创]如何用CruiseControl.Net来进行持续化集成

    注:本文属jillzhang  原创,转载请注明出处 ,欢迎访问http://jillzhang.cnblogs.com/来获取最新更新 本文的目的: 本文总结了过去一年中使用CruiseContro ...

  5. Docker+Jenkins+GIT+Tomcat实战持续化集成

    Docker基础教程可参考:容器Docker详解 Jenkins基础知识可参考:jenkins笔记(1) Git基础知识可参考:GIT笔记 文件脚本内容参考:junsansi,可以根据实际项目具体修改 ...

  6. RobotFramework+jenkins持续化集成及高级操作API

    一:RobotFramework高级操作API 1.窗口跳转 案例:58租房:http://bj.58.com 登录58同城>>点击租房>>选择区域>>选择租金&g ...

  7. android多版本打包,Android的持续化集成及多版本打包

    文档概述 关于Android开发,除了技术方面需要掌握,还有发布流程需要了解.本文档就包括以上两个方面,主要介绍: 使用配置文件配置不同功能的apk 使用gradle为Android构建签名包 Jen ...

  8. docker 中安装Jenkins-Jenkins持续化集成(GIT/maven/钉钉机器人)详细步骤

    Dokcker 中jenkins容器配置发布连接应用服务器 docker安装jenkins 如:192.168.86.129服务器中docker 部署jenkins >> 1. 拉取镜像 ...

  9. Jenkins+git+docker构建持续化集成环境

    CI/CD介绍 发布流程设计 Jenkins服务器 192.168.100.109 Git/Harbor 192.168.100.110 Docker 192.168.100.111 工具 版本 Ce ...

最新文章

  1. nagios配置监控的一些思路和工作流程
  2. 数字图像基础(二进制图像、灰度图像、RGB图像、索引图像和多帧图像)
  3. python无法启动此程序因为计算机中丢失_python报错:无法启动此程序,因为计算机中丢失...
  4. JQuery-Table斑马线
  5. 计算机无法用u盘重装系统,没有u盘电脑开不了机重装系统的方法步骤详细教程 - 系统家园...
  6. 修改oracle默认日期,Oracle 修改默认日期格式
  7. XML解析技术简介——(一)
  8. 创业人永远不要让工作成为自己的负担
  9. ROS入门 SLAM
  10. modbus_tk与Modubs Slave结合使用
  11. 去年写的测试GDAL用法的一些函数
  12. 动态字符串的存储结构的实现
  13. 我不是领导,如何让别人听我的话?
  14. mysql实例备份和单库备份_史上最简单的MySQL数据备份与还原教程(上)(三十五)...
  15. 分享8年开发经验,浅谈程序员职业规划
  16. 网易视频云:搜索意图识别浅析
  17. java手机验证码注册_Java手机验证码注册
  18. 怎么清理C盘释放空间 ?
  19. vue 登录注册模板
  20. [todo] 如何高效工作

热门文章

  1. Labview | VDM与VAS2018下载
  2. two-pointer双指针法
  3. 区块链技术的安全价值与局限性解析
  4. C++继承继承知识点
  5. phpadmin 导出csv格式的数据处理
  6. Firefox(火狐浏览器)加速技巧 - 如何设置火狐
  7. css 溢出隐藏省略号代替
  8. 新年第一帖——元旦这天骑车迷路了
  9. 全国信息化和软件服务业工作座谈会召开
  10. SpringMVC 2.HelloWorld