Devops持续化集成

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)

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

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

3c9cb6a2b37b457baac6370af43cd15a

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

安装的时间稍微长一点,先喝杯茶,休息下哈。

创建管理员用户

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

全局工具配置

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

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


Jenkins的初始化配置

配置jenkins并发执行数量,提高执行效率


设置管理员邮箱 我是为了方便使用了QQ邮箱

在QQ邮箱中开启POP3

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

安装gitlab,Blue ocean插件(相当于jenkins的一个新主题界面)

然后等待安装重启。

Jenkins基于角色的权限管理RBAC

安装插件Role-based Authorization Strategy

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

保存退出!

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

返回系统管理

管理角色

添加对devlop角色的权限控制

点击Sava保存!!!

分配角色


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

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

Jenkins Pipeline实战

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


输出成功

什么是Pipeline?

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

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

 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中容易建模的一个连续发货方案的示例:

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状态/进度。

测试pipeline,点击保存

立即构建

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

Jenkins Pipeline测试

创建测试代码项目组

新建项目


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

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放置公钥

复制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

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

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

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

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

复制生成的脚本到项目中

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

查看拉取到的代码

[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后面可接任何命令

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

交互

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

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

查看日志部署成功

Jenkins分布式构建

节点管理

Slave统一目录和安装好jdk

系统设置>节点管理

Slave节点组好统一目录

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

新建节点

时间同步 ntpdate

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

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

系统管理>节点管理>master

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

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

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

如果没有公网的情况下安装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. 设计与架构:是否高内聚、低耦合,依赖最少。

安装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

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

解压扫描器

[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

上传解压配置

[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

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

SonarQube设置中文

如果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包放入到这个目录即可

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

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

SonarQube和jenkins集成

安装sonar插件

设置SonarQube-server

SonarQube生成token

复制到jenkins 的token选项中

Pipeline集成SonarQube

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

本地将代码克隆下来

$ 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

网页查看已经成功提交

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

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

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

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

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

设置钩子webhook

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

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

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

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

解决方法

测试钩子是否成功


Jenkins已经自动触发构建,因为我test push了两次

DevOps之部署流水线

软件交付(部署)流水线

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

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

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

部署流水线的环境

部署流水线的阶段和环境

流水线反馈过程

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

部署流水线分阶段实施

部署流水线设计和规划

流水线案例

可靠可重复的流水线

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

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

部署流水线实践

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

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

对部署进行冒烟测试

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

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

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

部署流水线Git分支设计

创建开发分支

创建gitlab用户

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

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

将用户加入项目组

进入项目

开发拉取项目

Linux客户端操作

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

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

持续集成-提交阶段

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

统一的代码库

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

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

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

模拟生产环境的自动测试

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

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

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

提交阶段要做的事情

创建流水线

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

我这里是已经创建过了

配置触发器

设置钩子脚本

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

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

安装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

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

这是代码:

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插件)

mvn编译报错

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

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

邮箱语法生成

直接粘贴过来,保存构建

这是系统发送给我的邮箱

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

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

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

集成测试阶段实现

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

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

使用张三用户登录gitlab

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

退出gitlab使用lisi登录

开发经理合并分支

创建集成测试项目

设置webhook

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

在gitlab就可以测试是否成功

点击push events

查看是否200 OK

再查看jenkins任务已经触发

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

添加在邮件通知的后面

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

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

异常检测发送邮件

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

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

测试将代码修改错误

构建报错

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

你可能感兴趣的:(Devops持续化集成)