
目录
(4)Jenkins服务器安装sonar客服端sonar-scanner
8、外网访问vip地址(内网穿透)
一、DevOps简介
Devops是Development(开发)和Operations(运维)的简写。
Devops是集文化理念、实践与工具与一身的,并不是单单的工具,devops是针对企业中的开发人员、运维人员和测试人员的一种工作理念,在应用开发、代码部署和质量测试等整条生命周期中,一起协作与沟通的最佳实践,devops强调整个组织的合作性以及基础设施变更的自动化、从而实现持续集成、持续交付和持续部署。
二、CI/CD简介
持续集成:Continuous Integration
- 持续集成是指频繁的将代码集成到主干,也就是多名开发者在开发不同功能代码的过程当中,可以频繁的将代码合并到一起并且相互不影响工作。
持续交付:Continuous Delivery
- 持续交付是指频繁地将软件的新版本,交付给质量团队或者用户,以供评审。可以看作持续集成的下一步,如果评审通过,代码就进入生产阶段。
持续部署:Continuous Deoloyment
- 持续部署是指基于某种工具或平台实现代码自动化的构建、测试和部署到线上环境以实现高质量产品的交付,持续部署在某种程度上代表了一个开发团队的更新迭代速率,可以看作持续交付的下一步。
1、代码部署的最基本流程
测试环境-->预发布环境-->生产环境
2、软件开发生命周期



3、持续集成整体流程

三、Git简介
一个分布式持续集成工具,设计之初就具备以下优点:
- 可靠性:数据的上传和下载必须是安全的、一致的,所有行为都要进行验证,数据的变更通过不同的版本进行逻辑隔离;
- 分布式:不依赖中央服务器,而是每个开发电脑都是一个本地仓库,可用于代码提交与回滚;
- 高效:git基于分布式的功能实现代码的快速提交与回滚。
1、GitHub与Gitlab区别
- GitHub:基于Git的一个公有代码仓库
- Gitlab:基于Git的一个私有代码仓库
四、Jenkins简介
开源的持续集成工具,基于java编写,用于自动化各种任务, 包括构建、测试和部署软件。
五、部署方式介绍
-
灰度部署
也叫金丝雀发布,在俩个版本之间能够平滑过渡的一种方式,一种增量发布类型。在一小部分用户使用新版本,宁一部分用户继续使用原版本,如果新版本的测试没有什么问题的话,会进一步扩大用户数量的使用,直到全部用户使用新版本。
-
蓝绿环境
在原版本继续的使用的情况下,再离线部署一套新环境用于新版本,新版本测试没有问题的情况下,会把流量拉倒新的环境下。
-
A/B测试
同时运行两套正式在线环境,而蓝绿环境是运行一套,是两码事。
六、基于Jenkins与Gitlab构建持续集成环境系统
1、环境说明
| 主机名 | 操作系统 | IP地址 | 备注 |
| gitlab | CentOS 7 | 192.168.10.128/24 | gitlab服务器 |
| jenkins | CentOS 7 | 192.168.10.129/24 | Jenkins服务器 |
| keepalived-1 | CentOS 7 | 192.168.10.130/24 | 高可用负载均衡集群-主,vip地址为192.168.10.200 |
| keepalived-2 | CentOS 7 | 192.168.10.131/24 | 高可用负载均衡集群-备,vip地址为192.168.10.200 |
| web-1 | CentOS 7 | 192.168.10.132/24 | web服务器-1 |
| web-2 | CentOS 7 | 192.168.10.133/24 | web服务器-2 |
| web-3 | CentOS 7 | 192.168.10.134/24 | web服务器-3 |
| sonarqube | Centos 7 | 192.168.10.135/24 | sonarqube服务器 |
2、gitlab配置
#在IP地址为192.168.10.128的虚拟机上操作
使用的是清华大学镜像源,Gitlab使用的版本是gitlab-ce-11.11.8,下载地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.11.8-ce.0.el7.x86_64.rpm
(1)安装gitlab
[root@gitlab ~]# yum install https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.11.8-ce.0.el7.x86_64.rpm
安装成功后,会显示下面信息
显示的内容说:你需要配置url给你的gitlab实例,在/etc/gitlab/gitlab.rb文件,external_url就是暴露访问gitlab的ip地址,这里也可以用域名,需要做个本地解析,在/etc/host里修改,
- 配置/etc/gitlab/gitlab.rb文件
#找到external_url这一行,后面修改为自己的IP地址,我的就是external_url 'http://192.168.10.128'
[root@gitlab ~]# vim /etc/gitlab/gitlab.rb
(2)配置邮件通知
#创建gitlab用户,更改用户权限等,会自动发送给该用户邮件告知。
1)修改配置文件
#添加以下内容,可以直接搜索,到命令行模式 输入/查找smtp等,去掉前面的#,修改内容即可
[root@gitlab ~]# vim /etc/gitlab/gitlab.rb
#开启smtp
gitlab_rails['smtp_enable'] = true
#smtp服务器地址,如果是163邮箱,则是smtp.163.com
gitlab_rails['smtp_address'] = "smtp.qq.com"
#smtp服务器的端口号,默认为25,ssl协议加密后是465
gitlab_rails['smtp_port'] = 465
#邮箱账号
gitlab_rails['smtp_user_name'] = "142968****@qq.com"
#邮箱密码,如果是客服的邮箱,不支持密码认证的,一般对给个授权码,通过调用客服邮箱发送邮件
#qq邮箱配置授权码步骤:1、登录网页版QQ邮箱;2、设置->账户;3、开启POP3/SMTP服务(发送短信验证开启)
gitlab_rails['smtp_password'] = "授权码"
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
#是否开启ssl协议加密
gitlab_rails['smtp_tls'] = true
#发件人,跟自己的账号一样
gitlab_rails['gitlab_email_from'] = '142968****@qq.com'
user['git_user_name'] = "142968****@qq.com"
2)重置gitlab
[root@gitlab ~]# gitlab-ctl reconfigure
- 查看状态
[root@gitlab ~]# gitlab-ctl status
3)登录控制台发送测试邮件
[root@gitlab ~]# gitlab-rails console
-------------------------------------------------------------------------------------
GitLab: 11.11.8 (1d18d065069)
GitLab Shell: 9.1.0
PostgreSQL: 9.6.11
-------------------------------------------------------------------------------------
Loading production environment (Rails 5.1.7)
irb(main):001:0> Notify.test_email('lxxxxxxxx@163.com',
'Test_001','Hello World').deliver_now
#查看
(3)登录Gitlab
-
防火墙配置
#添加http服务
[root@gitlab ~]# firewall-cmd --add-port=80/tcp --permanent
#添加https服务
[root@gitlab ~]# firewall-cmd --add-port=443/tcp --permanent
#添加ssh服务
[root@gitlab ~]# firewall-cmd --add-port=22/tcp --permanent
#添加gitlab服务
[root@gitlab ~]# firewall-cmd --add-port=2222/tcp --permanent
#重新载入
[root@gitlab ~]# firewall-cmd --reload
[root@gitlab ~]# systemctl enable firewalld
- 浏览器访问

如果你出现了以下错误页面,请关闭该页面,重新访问即可


(4)创建用户



1)登录邮箱修改密码

管理员也可以给用户设置密码

2)登录时,把注册功能关闭
#注意:不要点错了,是Sign-up,不是Sing-in,这个是登录,如果改错了,就无法登录!!!


检查

(5)创建组
#gitlab的超级管理员一般在运维手里


(6) 添加用户到组里,授予权限
#把维运这个开发人员添加到这个组里,授予权限

(7)创建项目
#使用维运用户创建项目


- 在刚刚创建的项目中创建文件


-
设置全局
[root@gitlab ~]# git config --global user.name "weiyun"
[root@gitlab ~]# git config --global user.email "liuxxxxxxxx@163.com"
(8)配置免密克隆
- 安装Git命令
[root@gitlab ~]# yum install git -y
#克隆地址

- 配置
#生成秘钥对,三连回车
[root@gitlab ~]# ssh-keygen -t rsa
#查看公钥,通常在~/.ssh/id_rsa.pub
[root@gitlab ~]# cat .ssh/id_rsa.pub

- 验证(无需输入账号密码)
[root@gitlab ~]# git clone git@192.168.10.128:work_001/devops.git
[root@gitlab ~]# ls
anaconda-ks.cfg devops
[root@gitlab ~]# ls devops
index.html
(9)基于gitlab实现持续集成
[root@gitlab ~]# cd devops/
#修改index.html内容
[root@gitlab devops]# cat index.html
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Devops</title>
</head>
<body>
<h1>devops V1.0.0</h1>
<h1>devops v1.0.1</h1>
</body>
</html>
#开发改了代码后,此时gitlab的代码还是原来的
#把当前目录文件添加到缓存区
[root@gitlab devops]# git add ./
#把缓存区提交到本地仓库,-m参数是注释
[root@gitlab devops]# git commit -m "v1.0.1"
#将本地的分支上传到远程主机合并
[root@gitlab devops]# git push
#输入git push后,会出现下面信息
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:git config --global push.default matching
To squelch this message and adopt the new behavior now, use:
git config --global push.default simple
See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)
#大概意思是git2.0版本的默认参数matching改为simple,你需要等待一会就可以执行成功,如果不行,你需要执行git config --global push.default matching,再git push
#刷新一下,查看index.html是否更改了

#查看操作日志
[root@gitlab devops]# git log
#查看本地工作区和暂缓区的状态
[root@gitlab devops]# git status
1)定义一些文件或目录不上传到gitlab
[root@gitlab devops]# cat mysql.conf
[Mysql]
url=192.168.10.1
port=3306
user=user1
password=123456
#把不需要的文件或目录名写在.gitignore文件里面
[root@gitlab devops]# cat .gitignore
mysql.conf
#验证(是否存在mysql.conf这个文件)
[root@gitlab devops]# git add ./
[root@gitlab devops]# git commit -m "2023_1_26"
[root@gitlab devops]# git push

2)基于克隆代码实现版本回滚
#再来一个v1.0.2的版本
[root@gitlab devops]# cat index.html
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Devops</title>
</head>
<body>
<h1>devops V1.0.0</h1>
<h1>devops v1.0.1</h1>
<h1>devops v1.0.2</h1>
</body>
</html>
[root@gitlab devops]# git add ./
[root@gitlab devops]# git commit -m "v1.0.2"
[root@gitlab devops]# git push
#递归回滚
#git reset --hard HEAD^^ 实现递归回滚,HEAD代表当前版本,^为上一个版本,^^为上两个版本
[root@gitlab devops]# git reset --hard HEAD^
[root@gitlab devops]# cat index.html
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Devops</title>
</head>
<body>
<h1>devops V1.0.0</h1>
<h1>devops v1.0.1</h1>
</body>
</html>
[root@gitlab devops]# git push
#跨版本回滚
#当前版本v1.0.2,跨到v1.0.0版本,用git log查看v1.0.0版本的commit那一行后面的版本号756624f,一般只要前7个就行,也可以使用git reflog命令,查看,这个更简洁
[root@gitlab devops]# git log
commit 756624f4bb8bff8bfefadb591f14adb20969d27b
Author: weiyun <liuyangyi1124@163.com>
Date: Thu Jan 26 20:44:20 2023 +0800
v1.0.0
[root@gitlab devops]# git reset --hard 756624f
HEAD is now at 756624f v1.0.0
[root@gitlab devops]# cat index.html
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Devops</title>
</head>
<body>
<h1>devops V1.0.0</h1>
<h1>devops v1.0.0</h1>
</body>
</html>
[root@gitlab devops]# git push
3)Git分支管理
#查看当前所处的分支
[root@gitlab devops]# git branch
* master
创建分支并转到develop分支:git checkout -b develop
转到develop分支:git checkout develop
我这里使用gitlab创建分支


#对分支到生产的理解

4)分支合并
#master,develop分支上都是v1.0.2,现在更改develop的分支为v1.0.3,然后合并master主分支
#当前分支提交代码
#-b是选择develop的分支,后面是gitlab的clone
[root@gitlab ~]# git clone -b develop http://192.168.10.128/work_001/devops.git
#修改为v1.0.3版本
[root@gitlab ~]# cd devops/
[root@gitlab devops]# cat index.html
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Devops</title>
</head>
<body>
<h1>devops V1.0.0</h1>
<h1>devops v1.0.1</h1>
<h1>devops v1.0.2</h1>
<h1>devops v1.0.3</h1>
</body>
</html>
[root@gitlab devops]# git add ./
[root@gitlab devops]# git commit -m "v1.0.3"
[root@gitlab devops]# git push
#方法一:命令行合并
#切换主分支
[root@gitlab devops]# git checkout master
#拉取最新代码
[root@gitlab devops]# git pull origin master
#merge合并分支代码
[root@gitlab devops]# git merge develop
#上传
[root@gitlab devops]# git push
#切换到原来分支
[root@gitlab devops]# git checkout develop
#方法二:Git页面合并


#通知的人进行审核合并
3、配置web服务器
#192.168.10.132、192.168.10.133、192.168.10.134配置
- 防火墙配置
#http服务
[root@web-1 ~]# firewall-cmd --add-port=80/tcp --permanent
#ssh服务
[root@web-1 ~]# firewall-cmd --add-port=22/tcp --permanent
#https服务
[root@web-3 ~]# firewall-cmd --add-port=443/tcp --permanent
[root@web-1 ~]# firewall-cmd --reload
[root@web-1 ~]# systemctl enable firewalld
[root@web-1 ~]# yum install httpd -y
[root@web-1 ~]# useradd weiyun
[root@web-1 ~]# passwd weiyun
#给用户设置临时提权
[root@web-1 ~]# vim /etc/sudoers
#找到这一行
root ALL=(ALL) ALL
#添加这一行
weiyun ALL=(ALL) NOPASSWD: ALL
[root@web-1 ~]# su - weiyun
[weiyun@web-1 ~]$ cd /var/www/html/
#创建存放压缩包的文件
[weiyun@web-1 html]$ sudo mkdir appdir
#创建存放项目代码的文件
[weiyun@web-1 html]$ sudo mkdir webapps
#创建存放解压的文件
[weiyun@web-1 html]$ sudo mkdir webdir
#给个目录授权其他人的可以写入
[weiyun@web-1 html]$ sudo chmod o+w /var/www/html -R
#宁外两台web服务器web-2和web-3则是'This is web-2 192.168.10.133,Welcome to my word'和'This is web-3 192.168.10.134,Welcome to my word!'
[weiyun@web-1 html]$ echo 'This is web-1 192.168.10.132,Welcome to my word!' > /webapps/index.html
[weiyun@web-1 html]$ cat /etc/httpd/conf.d/vhost.conf
<directory /var/www/html>
allowoverride none
require all granted
</directory>
#这里根据web服务器地址更改为192.168.10.133和192.168.10.34
<virtualhost 192.168.10.132>
documentroot /var/www/html/webapps
#宁外两台web服务器web-2和web-3则是自己的IP地址192.168.10.133和192.168.10.134
servername 192.168.10.132
</virtualhost>
[weiyun@web-1 ~]$ systemctl enable httpd --now
#修改selinux为宽容模式
[weiyun@web-1 ~]$ sudo vim /etc/selinux/config
#修改SELINUX=enforcing为SELINUX=permissive
#重启
#浏览器访问


4、配置高可用负载均衡服务器
(1)安装keepalived
#在192.168.10.130和192.168.10.131的两台虚拟机上都做
[root@keepalived-1 ~]# yum install gcc gcc-c++ make openssl-devel -y
[root@keepalived-1 ~]# wget https://keepalived.org/software/keepalived-2.0.20.tar.gz --no-check-certificate
[root@keepalived-1 ~]# tar -xzvf keepalived-2.0.20.tar.gz -C /usr/local/src
[root@keepalived-1 ~]# rm -rf keepalived-2.0.20.tar.gz
[root@keepalived-1 ~]# cd /usr/local/src/keepalived-2.0.20/
[root@keepalived-1 keepalived-2.0.20]# ./configure --prefix=/usr/local/keepalived --sysconfdir=/etc
[root@keepalived-1 keepalived-2.0.20]# make && make install
注意:此版本已经自动安装好服务脚本,但是脚本stop不成功,需要修改脚本配置文件
[root@keepalived-1 keepalived-2.0.20]# vim /usr/lib/systemd/system/keepalived.service
注释掉KillMode=process,也就是在前面加上#
[root@keepalived-1 keepalived-2.0.20]# systemctl daemon-reload
原因:
KillMode=process的大致意思是当停止keepalived的时候只停掉主进程,而主进程产生的子进程是不会被
干掉的,SSH服务就是这个模式。
killmode的默认值是control-group,意思时所有进程都会被干掉,我这里选择把这项注释掉,使用默认参
数
如果不修改,使用systemctl kill keepalived 可以停止服务
执行./config出现以下错误
1、configure: error:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files. !!!解决方法:yum install openssl-devel -y
2、WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
解决方法:yum install libnl-devel -y
1)修改配置文件
- 主的keepalive-1
#修改vip地址为192.168.10.200,route_id唯一标识符,status主从
[root@keepalived-1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
#唯一标识符
router_id LVS_1
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
#我的网卡是ens33
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
#vip地址
virtual_ipaddress {
192.168.10.200
}
}
[root@keepalived-1 ~]# systemctl start keepalived
[root@keepalived-1 ~]# systemctl enable keepalived
- 备的keepalived-2
[root@keepalived-2 ~]# vim /etc/keepalived/keepalived.conf
[root@keepalived-2 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
#唯一标识符
router_id LVS_2
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
#备改为大写的BLACKUP
state BACKUP
interface ens33
virtual_router_id 51
#优先级改小一点
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.200
}
}
[root@keepalived-2 ~]# systemctl start keepalived
[root@keepalived-2 ~]# systemctl enable keepalived
2)检查vip绑定
可以看到vip绑定在keepalived-1上
#现在停掉keepalived-1上的keepalived服务,查看vip绑定情况
可以看到vip绑定在keepalived-2上了
#现在重启keepalived-1的keepalived服务,查看vip绑定情况
通过以上测试发现,发生故障时 keepalived 瞬间切换,也可以通过客户端一直 ping 的方式观测故障切换 转换。
#ping一下vip地址192.168.10.200

(2)安装haproxy
#在192.168.10.130和192.168.10.131的两台虚拟机上都做,一模一样
#HAProxy2.0支持的Lua小5.3版本以上,系统自带的是5.1版本
#安装lua
[root@keepalived-1 ~]# yum install gcc readline-devel -y
[root@keepalived-1 ~]# wget http://www.lua.org/ftp/lua-5.3.5.tar.gz
[root@keepalived-1 ~]# tar xf lua-5.3.5.tar.gz -C /usr/local/src
[root@keepalived-1 ~]# cd /usr/local/src/lua-5.3.5
[root@keepalived-1 lua-5.3.5]# make linux test
#安装haproxy
[root@keepalived-1 ~]# yum -y install gcc openssl-devel pcre-devel systemd-devel
[root@keepalived-1 ~]# wget https://www.haproxy.org/download/2.2/src/haproxy-2.2.9.tar.gz
[root@keepalived-1 ~]# tar xf haproxy-2.2.9.tar.gz -C /usr/local/src/
[root@keepalived-1 ~]# cd /usr/local/src/haproxy-2.2.9/
[root@keepalived-1 haproxy-2.2.9]# make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/usr/local/src/lua-5.3.5/src/ LUA_LIB=/usr/local/src/lua-5.3.5/src/
[root@keepalived-1 haproxy-2.2.9]# make install PREFIX=/usr/local/haproxy
#配置
[root@keepalived-1 haproxy-2.2.9]# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/
[root@keepalived-1 haproxy-2.2.9]# mkdir /etc/haproxy
[root@keepalived-1 haproxy-2.2.9]# cat /etc/haproxy/haproxy.cfg
global
maxconn 100000
chroot /usr/local/haproxy
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 99
gid 99
user haproxy
group haproxy
daemon
#nbproc 4
#cpu-map 1 0
#cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
pidfile /var/lib/haproxy/haproxy.pid
log 127.0.0.1 local2 info
defaults
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
listen stats
mode http
#这里可以在浏览器上查看状态,根据下面配置访问,如我的是:浏览器输入192.168.10.130:9999/haproxy-status,然后输入账号haadmin,密码是123456,
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth haadmin:123456
listen web_port
#vip的地址
bind 192.168.10.200:80
mode http
log global
#后端web集群服务
server 192.168.10.132 192.168.10.132:80 check inter 3000 fall 2 rise 5
server 192.168.10.133 192.168.10.133:80 check inter 3000 fall 2 rise 5
server 192.168.10.134 192.168.10.134:80 check inter 3000 fall 2 rise 5
[root@keepalived-1 haproxy-2.2.9]# mkdir /var/lib/haproxy
[root@keepalived-1 haproxy-2.2.9]# useradd -r -s /sbin/nologin -d /var/lib/haproxy haproxy
#配置system脚本
[root@keepalived-1 haproxy-2.2.9]# cat /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
#启动
[root@keepalived-1 haproxy-2.2.9]# systemctl daemon-reload
[root@keepalived-1 haproxy-2.2.9]# systemctl enable haproxy --now
#配置sysctl.conf文件,net.ipv4.ip_nonlocal_bind表示绑定一个虚拟ip,使用场景:当一个服务需要vip才能启动,vip不在自己上,vip漂移到才存在,但服务需要提起开启。
[root@keepalived-1 ~]# cat /etc/sysctl.conf
#添加这行
net.ipv4.ip_nonlocal_bind=1
- 防火墙配置
#两台一样操作
#http服务
[root@keepalived-1 ~]# firewall-cmd --add-port=80/tcp --permanent
#https服务
[root@keepalived-1 ~]# firewall-cmd --add-port=443/tcp --permanent
#ssh服务
[root@keepalived-1 ~]# firewall-cmd --add-port=22/tcp --permanent
#haproxy监听vip端口
[root@keepalived-1 ~]# firewall-cmd --add-port=9999/tcp --permanent
#允许主备之间的vrrp组播,默认组播为224.0.0.18,很多网上说改112/tcp,对于centos 7 没用
[root@keepalived-1 ~]# firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
[root@keepalived-1 ~]# firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
#重新载入
[root@keepalived-1 ~]# firewall-cmd --reload
#检查两台的haproxy状态
#查看haproxy的状态页面


(3)验证高可用负载均衡
#测试负载均衡

#测试高可用
#先访问一下vip地址时,然后在主keepalived停掉服务,查看是否可以继续访问vip地址

(4)邮件报警
#当主负载均衡器宕机了,备负载均衡器会变成主,然后就会执行指定的脚本,当
1)编写脚本
[root@keepalived-1 ~]# vim /usr/local/keepalived/check_keepalived.sh
#!/bin/bash
EMAIL='1429xxxxx@qq.com'
DATE=`date +%Y_%m_%d_%H-%M-%S`
TITLE="The load balancer changes!"
CONTENT="${DATE}: `hostname` to be $1 now"
if (( $1 == "master" | "backup" ));then
echo "${CONTENT}" | mail -s "${TITLE}" ${EMAIL}
else
echo "Error:The load balancer changes" | mail -s "${TITLE}" ${EMAIL}
fi
[root@keepalived-1 ~]# chmod a+x /usr/local/keepalived/check_keepalived.sh
#拷贝到备上去
[root@keepalived-1 ~]# scp /usr/local/keepalived/check_keepalived.sh root@192.168.10.131:/usr/local/keepalived/
2)keepalived.conf配置文件修改
#主备都一样操作
[root@keepalived-1 ~]# vim /etc/keepalived/keepalived.conf
#在vrrp_instance VI_1里面添加下面内容
notify_master "/bin/bash /usr/local/keepalived/check_keepalived.sh master"
notify_backup "/bin/bash /usr/local/keepalived/check_keepalived.sh backup"
3)安装sendmail命令
#主备一样操作
[root@keepalived-1 ~]# yum install sendmail* mailx -y
[root@keepalived-1 ~]# vim /etc/mail.rc
set from=142xxxxx@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=142xxxx@qq.com
//qq邮箱ICMP/SMTP授权码
set smtp-auth-password=wcibuqanbiythfjf
set smtp-auth=login
[root@keepalived-1 ~]# systemctl restart sendmail
[root@keepalived-1 ~]# systemctl enable sendmail
[root@keepalived-1 ~]# systemctl restart keepalived
4)验证
[root@keepalived-1 ~]# poweroff

# 然后再开机keepalived-1

#可知主keepalived-1开机后,先是备的身份,会发送此时的身份是备,当抢到主之后,身份会变为主,keepalive-2就会由主变为备,发送邮件,keepalived-1也会发送邮件
5、Jenkins配置
(1)安装Jenkins
#在IP地址为192.168.10.129的虚拟机上操作
官网下载地址Linux (jenkins.io)
[root@jenkins ~]# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate
[root@jenkins ~]# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
[root@jenkins ~]# yum install jenkins -y
[root@jenkins ~]# yum install java-11-openjdk -y
[root@jenkins ~]# systemctl daemon-reload
[root@jenkins ~]# systemctl enable jenkins --now
1)修改配置文件
#修改为以root用户登录Jenkins,方便后面部署
[root@jenkins ~]# vim /etc/sysconfig/jenkins
找到JENKINS_USER这行,修改为JENKINS_USER="root"
#重启Jenkins
[root@jenkins ~]# systemctl restart jenkins
- 防火墙配置
#开启Jenkins服务
[root@jenkins ~]# firewall-cmd --add-port=8080/tcp --permanent
#开启http服务
[root@jenkins ~]# firewall-cmd --add-port=80/tcp --permanent
#开启https服务
[root@jenkins ~]# firewall-cmd --add-port=443/tcp --permanent
#ssh服务开启
[root@jenkins ~]# firewall-cmd --add-port=22/tcp --permanent
#重新载入
[root@jenkins ~]# firewall-cmd --reload
[root@jenkins ~]# systemctl enable firewalld
2)访问Jenkins的web页面




#输入systemctl restart jenkins,重启Jenkins服务,再次访问Jenkins页面

(2)邮箱配置
#jenkins构建有问题的话,会发送邮箱通知



(3) 配置Jenkins免密拉取gitlab代码
#jinkins也需要下载git客户端
[root@jenkins ~]# yum install git -y
[root@jenkins ~]# ssh-keygen -t rsa
[root@jenkins ~]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTa74lBaHzWXJEEcchVBaAc1M/LadM2gqAbyesHtqmOImTzcPxWJfTLYqR8DhXF80dQNefrx136JcneghfUmP4MlTjkJT9AByHaTl6kg1ixzSCqGDJTfUijbnhqa3q0nd4iKpaBTbckEJCh9yGnd01A1J3YkNjqeMFOaznmcsgFdVEsrtshKjCtC+xd0K6LkmF7O7sHDcuJ55Fcb4I3FCoxWfZ5aGzmFynzV9Z7WTz9+6MxQJptDFBTkEbXSKru6chco1sVW5IVNM3dabGw7L+81gp/jZNUe4JdUhjmbS0+zQRs9pra5TNTwvtCI2im891d5OcrmQnjGviJ59bRJVj root@jenkins
#把公钥id_rsa.pub上传到gitlab

(4)创建项目




#添加gitlab的clone地址后出现了key秘钥的错误问题,原因为把root的用户生成的秘钥给了gitlab,但实际用户是以Jenkins去拉取gitlab的代码,所以我们需要把root用户生成的秘钥给Jenkins
#找到Jenkins的家目录
[root@jenkins ~]# cat /etc/passwd | grep jenkins
jenkins:x:998:996:Jenkins Automation Server:/var/lib/jenkins:/bin/false
#copy秘钥
[root@jenkins ~]# cp .ssh/* /var/lib/jenkins/.ssh



#进入工作目录查看

(5)将代码发布到web服务器
1)Jenkins配置ssh免密登录web服务器
[root@jenkins ~]# ssh-copy-id weiyun@192.168.10.132
[root@jenkins ~]# ssh-copy-id weiyun@192.168.10.133
[root@jenkins ~]# ssh-copy-id weiyun@192.168.10.134
#因为Jenkins的实际用户是Jenkins,并不是root,所以把生成的数据发送给Jenkins用户,并把文件所有者和所属组更改为Jenkins
[root@jenkins ~]# cp .ssh/known_hosts /var/lib/jenkins/.ssh/known_hosts
[root@jenkins ~]# chown jenkins:jenkins /var/lib/jenkins/.ssh/id_rsa
[root@jenkins ~]# chown jenkins:jenkins /var/lib/jenkins/.ssh/id_rsa.pub
[root@jenkins ~]# chown jenkins:jenkins /var/lib/jenkins/.ssh/known_hosts
#在web服务器创建一个专门存放这个devops项目文件
[weiyun@web-1 ~]$ sudo mkdir /var/www/html/webapps/devops
[weiyun@web-1 ~]$ sudo chmod o+w /var/www/html/webapps/devops
#这里就发布到一个192.168.10.132web服务器用作测试代码发布功能,如果需要其他的web服务器也是这样写,添加后面就行



2)验证

#浏览器查看

6、Sonarqube配置
(1)安装postgresql
#创建普通用户
[root@sonarqube ~]# useradd postgres
[root@sonarqube ~]# passwd postgres
[root@sonarqube ~]# vim /etc/sudoers
#添加这一行
postgres ALL=(ALL) NOPASSWD: ALL
[postgres@sonarqube ~]$ wget https://ftp.postgresql.org/pub/source/v13.10/postgresql-13.10.tar.gz --no-check-certificate
[postgres@sonarqube ~]$ sudo tar -xzvf postgresql-13.10.tar.gz -C /usr/local/
[postgres@sonarqube ~]$ cd /usr/local/postgresql-13.10/
[postgres@sonarqube postgresql-13.10]$ sudo yum install gcc gcc-c++ readline-devel readline-devel zlib-devel -y
[postgres@sonarqube postgresql-13.10]$ ./configure
[postgres@sonarqube postgresql-13.10]$ sudo make
[postgres@sonarqube postgresql-13.10]$ sudo make install
#postgresql的安装目录
[postgres@sonarqube postgresql-13.10]$ ll ../pgsql/
#创建数据目录
[postgres@sonarqube postgresql-13.10]$ sudo mkdir ../pgsql/data
[postgres@sonarqube postgresql-13.10]$ sudo chown postgres:postgres /usr/local/pgsql/data
#添加环境变量
[postgres@sonarqube postgresql-13.10]$ cd
[postgres@sonarqube ~]$ vim .bash_profile
#在下面添加
export PGHOME=/usr/local/pgsql
export PGDATA=/usr/local/pgsql/data
PATH=$PATH:$HOME/bin:$PGHOME/bin
[postgres@sonarqube ~]$ source .bash_profile
#初始化数据库
[postgres@sonarqube postgresql-13.10]$ initdb
[postgres@sonarqube postgresql-13.10]$ cd /usr/local/pgsql/data/
[postgres@sonarqube data]$ vim postgresql.conf
#添加允许访问ip的地址,*代表所有
listen_addresses = '*'
#添加端口
port = 5432
#修改网桥配置信息
[postgres@sonarqube data]$ vim pg_hba.conf
#添加下面这行,表示所有局域网的人都可以访问
host all all 0.0.0.0/0 trust
#设置postgresql开机自启
[postgres@sonarqube data]$ cd /usr/local/postgresql-13.10/contrib/start-scripts/
[postgres@sonarqube start-scripts]$ sudo chmod a+x linux
[postgres@sonarqube start-scripts]$ sudo cp linux /etc/init.d/postgresql
#修改prefix和PGDATA的地址,之前的编译按照默认的,我这并不需要修改
[postgres@sonarqube start-scripts]$ vim /etc/init.d/postgresql
prefix=/usr/local/pgsql
PGDATA="/usr/local/pgsql/data"
[postgres@sonarqube start-scripts]$ sudo chkconfig --add postgresql
#测试
#新建账号sonar,密码为123456,授予用户权限,新建数据库pg
[postgres@sonarqube ~]$ psql
psql (13.10)
Type "help" for help.
postgres=# create user sonar password '123456';
CREATE ROLE
postgres=# ALTER ROLE sonar SUPERUSER;
ALTER ROLE
postgres=# create database pg;
CREATE DATABASE
postgres=#
#用新建的用户重新登录
[postgres@sonarqube ~]$ psql -U sonar -d pg
psql (13.10)
Type "help" for help.
pg=#
(2)安装sonarqube
1)安装java环境
#安装openjdk 11版本,这个需要到官网查看sonarqube支持jdk什么版本
[root@sonarqube ~]# yum install java-11-openjdk -y
#检查安装成功没有
[root@sonarqube ~]# java -version
2)安装sonarqube
[postgres@sonarqube ~]$ sudo wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.9.10.61524.zip
[postgres@sonarqube ~]$ sudo unzip sonarqube-8.9.10.61524.zip -d /usr/local/
[postgres@sonarqube ~]$ sudo vim /usr/local/sonarqube-8.9.10.61524/conf/wrapper.conf
#修改wrapper.java.command=java为wrapper.java.command=/bin/java
[postgres@sonarqube ~]$ cd /usr/local/sonarqube-8.9.10.61524/bin/linux-x86-64/
[postgres@sonarqube linux-x86-64]$ sudo ./sonar.sh start
#查看sonarqube的状态
[postgres@sonarqube linux-x86-64]$ ./sonar.sh status
SonarQube is running (21599).
#修改配置文件
[postgres@sonarqube linux-x86-64]$ sudo vim /usr/local/sonarqube-8.9.10.61524/conf/sonar.properties
#添加连接数据库的账号密码,数据库的地址/库名,开启端口
sonar.jdbc.username=sonar
sonar.jdbc.password=123456
sonar.jdbc.url=jdbc:postgresql://localhost/pg
sonar.web.port=9002
[postgres@sonarqube linux-x86-64]$ sudo vim /etc/sysctl.conf
#添加以下内容,根据版本所需要的
vm.max_map_count=524288
fs.file-max=131072
[postgres@sonarqube linux-x86-64]$ sudo vim /etc/security/limits.conf
#添加下面内容,根据版本所需要的
* soft nofile 131072
* hard nofile 131072
* soft nproc 8192
* hard nproc 8192
[postgres@sonarqube linux-x86-64]$ sudo chown postgres:postgres /usr/local/sonarqube-8.9.10.61524/ -R
#我这里面temp是root,所以更改一下
[postgres@sonarqube linux-x86-64]$ sudo chown postgres:postgres /usr/local/sonarqube-8.9.10.61524/temp -R
[postgres@sonarqube linux-x86-64]$ sudo chmod 770 /usr/local/sonarqube-8.9.10.61524
#我出现了data的目录不能写入的错误在,删除重新自动生成
[postgres@sonarqube linux-x86-64]$ rm -rf /usr/local/sonarqube-8.9.10.61524/data/*
[postgres@sonarqube linux-x86-64]$ ./sonar.sh start
3)设置开机自启
[postgres@sonarqube ~]$ sudo yum install lsof -y
[postgres@sonarqube ~]$ vim start_sonar.sh
#!/bin/bash
# chkconfig: 2345 10 90
# description: start sonarqube
export pid=`lsof -i:9002|awk '{print $2}'|grep [0-9]|uniq`
su - postgres <<EOF
if [ -z $pid ];then
/usr/local/sonarqube-8.9.10.61524/bin/linux-x86-64/sonar.sh start
fi
exit
EOF
[postgres@sonarqube ~]$ chmod 777 start_sonar.sh
[postgres@sonarqube ~]$ sudo mv start_sonar.sh /etc/init.d/
[postgres@sonarqube ~]$ sudo chkconfig --add start_sonar.sh
#检查是否有start_sonar.sh
[postgres@sonarqube ~]$ chkconfig --list
(3)登录sonarqube
- 防火墙配置
#sonarqube服务端口
[root@sonarqube ~]# firewall-cmd --add-port=9002/tcp --permanent
[root@sonarqube ~]# firewall-cmd --reload
[root@sonarqube ~]# systemctl enable firewalld
#浏览器访问192.168.10.135:9002,默认账号密码都为admin

#更改密码
#安装中文插件
#重启

(4)Jenkins服务器安装sonar客服端sonar-scanner
[root@jenkins ~]# wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.8.0.2856-linux.zip
[root@jenkins ~]# unzip sonar-scanner-cli-4.8.0.2856-linux.zip -d /usr/local/
[root@jenkins ~]# cd /usr/local/sonar-scanner-4.8.0.2856-linux/
[root@jenkins sonar-scanner-4.8.0.2856-linux]# vim conf/sonar-scanner.properties
#添加sonarqube服务器地址
sonar.host.url=http://192.168.10.135:9002
sonar.sourceEncoding=UTF-8
(5)测试代码检测功能
#登录sonarqube创建项目




[root@jenkins ~]# mkdir /data/git/devops -p
[root@jenkins ~]# vim /data/git/devops/test.py
#这里故意写错function2,测试
def function1():
print("function1")
def function2():
print
("function2")
def main():
function1()
function2()
main()
[root@jenkins ~]# python2 /data/git/devops/test.py
function1
#这个文件必须是sonar-project.properties
[root@jenkins ~]# vim /data/git/sonar-project.properties
#根据创建的项目来配置
#唯一的令牌key
sonar.projectKey=devops-python-test-scanner
#项目名称
sonar.projectName=devops-python-test-scanner
#项目版本
sonar.projectVersion=1.0
#扫描指定代码的位置
sonar.sources=devops
sonar.login=9187fc80ba6e24435b091b6a5ca16bb42c2c18f0
#扫描语言
sonar.language=py
#编码格式
sonar.sourceEncoding=UTF-8
[root@jenkins ~]# cd /data/git/
[root@jenkins git]# /usr/local/sonar-scanner-4.8.0.2856-linux/bin/sonar-scanner
#最后再给一个所有人写入的权限
[root@jenkins ~]# chmod a+w /data -R
#再去页面查看

#可以看到已经检查出问题所在
7、Jenkins代码部署
- 负载均衡服务器安装socat命令
[root@keepalived-1 ~]# yum install socat -y
[root@keepalived-2 ~]# yum install socat -y
(1)配置Jenkins 与负载均衡器免密登录
[root@jenkins ~]# ssh-copy-id root@192.168.10.130
[root@jenkins ~]# ssh-copy-id root@192.168.10.131
[root@jenkins ~]# cp .ssh/known_hosts /var/lib/jenkins/.ssh/
#测试

(2)脚本编写
[root@jenkins ~]# yum install zip -y
[root@jenkins ~]# mkdir /data/scripts -p
[root@jenkins ~]# vim /data/scripts/devops_vm_deploy.sh
#!/bin/bash
DATE=`date +%Y_%m_%d_%H-%M-%S`
#选择部署还是回滚的参数
METHOD=$1
#选择分支
BRANCH=$2
#组的选择,组1只有132的web服务器,组2有133和134的web服务器,组3都有
GROUP_LIST=$3
#根据组的选择,得到IP地址
function IP_LIST(){
if [[ ${GROUP_LIST} == "GROUP1" ]];then
Server_IP="192.168.10.132"
echo ${Server_IP}
elif [[ ${GROUP_LIST} == "GROUP2" ]];then
Server_IP="192.168.10.133 192.168.10.134"
echo ${Server_IP}
elif [[ ${GROUP_LIST} == "GROUP3" ]];then
Server_IP="192.168.10.132 192.168.10.133 192.168.10.134"
echo ${Server_IP}
fi
}
#代码clone
function clone_code(){
cd /data/git/ && rm -rf devops
git clone -b ${BRANCH} git@192.168.10.128:work_001/devops.git
if [ $? -eq 0 ];then
echo "SUCCESS:Clone Finish!"
else
echo "Error:Clone Failed!"
fi
}
#扫描代码
function scanner_code(){
cd /data/git && /usr/local/sonar-scanner-4.8.0.2856-linux/bin/sonar-scanner
if [ $? -eq 0 ];then
echo "Scanner Finish!Please go to sonarqube"
else
echo "Error:Scanner Failed!"
fi
}
#打包clone的代码
function make_zip(){
cd /data/git && zip -r devops.zip devops/*
if [ $? -eq 0 ];then
echo "SUCCESS:Zip Finish!"
else
echo "Error:Zip Failed!"
fi
}
#负载均衡停用web服务器
function down_node(){
for node in ${Server_IP};do
if [ $? -eq 0 ];then
echo "Success:${node} is have successfully taken offline from 192.168.10.130"
else
echo "Error:${node} is have failed taken offline from 192.168.10.130"
fi
ssh root@192.168.10.131 ""echo disable server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"
if [ $? -eq 0 ];then
echo "Success:${node} is have successfully taken offline from 192.168.10.131"
else
echo "Error:${node} is have failed taken offline from 192.168.10.131"
fi
done
}
#拷贝文件到web服务器
function scp_zipfile(){
for node in ${Server_IP};do
scp /data/git/devops.zip weiyun@${node}:/var/www/html/appdir/devops-${DATE}.zip
ssh weiyun@${node} "unzip -q /var/www/html/appdir/devops-${DATE}.zip -d /var/www/html/webdir/devops-${DATE} && rm -rf /var/www/html/webapps/devops && ln -sv /var/www/html/webdir/devops-${DATE}/devops /var/www/html/webapps/devops"
done
}
#web服务器停用httpd服务
function stop_http(){
for node in ${Server_IP};do
ssh weiyun@${node} "sudo systemctl stop httpd"
done
}
#web服务器启动httpd服务
function start_http(){
for node in ${Server_IP};do
ssh weiyun@${node} "sudo systemctl start httpd"
done
}
#检查web服务器是否可用访问,如果可以访问调用add_node函数,在负载均衡器启动该web服务器
function web_test(){
sleep 5
for node in ${Server_IP};do
NUM=`curl -s -I -m 10 -o /dev/null -w %{http_code} http://${node}/devops/index.html`
if [[ ${NUM} -eq 200 ]];then
echo "SUCCESS:${node} test passed and is about to be loaded into the load balancer server. "
add_node ${node}
else
echo "ERROR:The ${node} test fails,check whether the server successfully starts the httpd service."
fi
done
}
#负载均衡器启动该web服务器
function add_node(){
node=$1
ssh root@192.168.10.130 ""echo enable server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"
if [ $? -eq 0 ];then
echo "The 192.168.10.130 load balancer starts the ${node} web server successfully!"
else
echo "The 192.168.10.130 load balancer starts the ${node} web server failed!"
fi
ssh root@192.168.10.131 ""echo enable server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"
if [ $? -eq 0 ];then
echo "The 192.168.10.131 load balancer starts the ${node} web server successfully!"
else
echo "The 192.168.10.131 load balancer starts the ${node} web server failed!"
fi
}
#历史版本回滚到上一个版本
function rollback_last_version(){
for node in ${Server_IP};do
echo ${node}
NOW_VERSION=`ssh weiyun@${node} ""/bin/ls -l -rt /var/www/html/webapps/ | awk -F "->" '{print $2}' | tail -n1 | awk -F "/" '{print $6}'""`
echo "The current version of ${node} is ${NOW_VERSION}"
NAME=`ssh weiyun@${node} ""ls -l -rt /var/www/html/webdir/ | grep -B 1 ${NOW_VERSION} | head -n1 | awk '{print $9}'""`
ssh weiyun@${node} "rm -rf /var/www/html/webapps/devops && ln -sv /var/www/html/webdir/${NAME}/devops /var/www/html/webapps/devops"
done
}
#版本数量大于5,就删除版本
function delete_history_version(){
for node in ${Server_IP};do
ssh weiyun@${node} "rm -rf /var/www/html/appdir/*"
NUM=`ssh weiyun@${node} "ls /var/www/html/webdir/ | wc -l"`
echo "The number of historical versions of ${node} is ${NUM}"
while [ ${NUM} -gt 5 ];do
echo "Historical versions of ${node} that are about to be deleted"
NAME=`ssh weiyun@${node} ""ls -l -d -rt /var/www/html/webdir/devops* | head -n1 | awk '{print $9}'""`
ssh weiyun@${node} "rm -rf ${NAME}"
echo "Successfully delete the historical version ${NAME} of the ${node} address"
NUM=$[ ${NUM} -1 ]
done
done
}
#定义一个主函数来调用哪些函数
main(){
case ${METHOD} in
deploy)
IP_LIST;
clone_code;
scanner_code;
make_zip;
down_node;
stop_http;
scp_zipfile;
start_http;
web_test;
delete_history_version;
;;
rollback_last_version)
IP_LIST;
down_node;
stop_http;
rollback_last_version;
start_http;
web_test;
;;
esac
}
main $1 $2 $3
- 3台web服务器安装unzip命令
[weiyun@web-1 ~]$ sudo yum install unzip -y
[weiyun@web-2 ~]$ sudo yum install unzip -y
[weiyun@web-3 ~]$ sudo yum install unzip -y
(3)创建新项目





(4)灰度部署
1)准备工作-->保证3台web服务器内容一样
#三个web服务器部署成一样的内容,便于观察灰度部署,所以我选择GROUP3包含所有的web服务器地址

#查看vip地址,不断刷新,内容不变
#各自web服务器内容



#登录soarqube查看扫描代码的结果 ,无任何问题

2)开始灰度部署
灰度部署:#在192.168.10.132这个web服务器GROUP1部署新版本,没有问题再扩大至宁外俩台web服务器GROUP2
- 新版本代码发布到gitlab的develop分支
[root@gitlab ~]# git clone -b develop http://192.168.10.128/work_001/devops.git
[root@gitlab ~]# cd devops
[root@gitlab devops]# git branch
* develop
[root@gitlab ~]# cat devops/index.html
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Devops</title>
</head>
<body>
<h1>devops V1.0.0</h1>
<h1>devops v1.0.1</h1>
<h1>devops v1.0.2</h1>
<h1>devops v1.0.3</h1>
<h1>devops v2.0.0</h1>
</body>
</html>
[root@gitlab devops]# git add ./
[root@gitlab devops]# git commit -m "v2.0.0"
[root@gitlab devops]# git push
- 构建小部分web服务器,选择develop分支

#haproxy的web页面查看,会先停用192.168.10.132这个web服务器,颜色会变成棕色,此时用户访问的只有其他两个web服务器,等132这个web服务器升级之后,就会变为绿色,此时有一部分用户访问的新版本的内容


#不断刷新地址,会有一部分是新版本的内容

#此时分支的代码没有任何问题,然后把分支合并
[root@gitlab devops]# git checkout master
[root@gitlab devops]# git pull origin master
[root@gitlab devops]# git merge develop
[root@gitlab devops]# git push
- 构建其他部分web服务器,此时分支选择主分支、develop分支都可

#不断刷新地址,内容为新版本的内容

#多构建几次GROUP1,查看是否最大保留5个版本
- 之前

- 再构建一次
#删除了最开始的版本

(5)代码版本回滚
#先发布一个新版本,就在主分支验证这个功能
[root@gitlab ~]# cd devops/
[root@gitlab devops]# git checkout master
[root@gitlab devops]# git branch
develop
* master
[root@gitlab devops]# vim index.html
[root@gitlab devops]# cat index.html
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Devops</title>
</head>
<body>
<h1>devops V1.0.0</h1>
<h1>devops v1.0.1</h1>
<h1>devops v1.0.2</h1>
<h1>devops v1.0.3</h1>
<h1>devops v2.0.0</h1>
<h1>devops v2.1.0</h1>
</body>
</html>
[root@gitlab devops]# git add ./
[root@gitlab devops]# git commit -m "v2.1.0"
[root@gitlab devops]# git push

#web服务器此时都是新的版本,发现此时的版本并不稳定,需要回滚到上一个版本

-
开始回滚

#查看web服务器,回到了上一个的版本

(6)自动部署
1) 配置身份令牌
#生成16进制随机数,-hex是十六进制,12是12个字节
[root@jenkins ~]# openssl rand -hex 12
41490adb04f22992fef6acc8
#修改原来的项目,配置触发器


2)管理员root登录gitlab设置允许本地网络访问

3)普通用户weiyun再登录修改gitlab的项目


4)验证
[root@gitlab ~]# cd devops/
[root@gitlab devops]# git branch
* develop
[root@gitlab devops]# vim index.html
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Devops</title>
</head>
<body>
<h1>devops V1.0.0</h1>
<h1>devops v1.0.1</h1>
<h1>devops v1.0.2</h1>
<h1>devops v1.0.3</h1>
<h1>devops v2.0.0</h1>
<h1>devops v2.1.0</h1>
<h1>devops v3.0.0</h1>
</body>
</html>
[root@gitlab devops]# git add ./
[root@gitlab devops]# git commit -m "v3.0.0"
[root@gitlab devops]# git push
#此时Jenkins会自动构建项目

#再查看web服务器,有一部分服务器部署成功,Jenkins项目默认参数是第一个,所以是deplay(部署),develop(分支),GROUP1(192.168.10.132web服务器),如果新版本的web服务器没有什么问题,然后分支集成到主干,再去手工部署其他的web服务器。

#查看192.168.10.132的web服务器,网页内容是新版本。
#再查看sonarqube扫描结果


#自动部署的是192.168.10.132这个web服务器,灰度部署方式,如果这个服务器没有其他等问题,然后再去手工去构建其他的服务器。
8、外网访问vip地址(内网穿透)
#VMware设置

#在命令提示符输入ipconfig获取当前的地址,利用宿主机+端口访问

#主备安装花生壳
花生壳官网:花生壳客户端官方下载 - 贝锐花生壳官网 (oray.com)
选择centos的版本下载
主备一样操作
[root@keepalived-1 ~]# wget "https://down.oray.com/hsk/linux/phddns_5.2.0_amd64.rpm" -O phddns_5.2.0_amd64.rpm
[root@keepalived-1 ~]# rpm -i phddns_5.2.0_amd64.rpm

访问http://b.oray.com > 以sn账号登录,默认密码admin或者手机注册一个账号>激活
新增内网穿透,选择https映射类型

得到访问地址

#验证


完成!

本文详细介绍了如何使用DevOps工具Jenkins和Gitlab构建企业级持续集成环境系统。从DevOps和CI/CD的基本概念开始,讲解了Git、Jenkins的配置,再到Gitlab的集成、高可用负载均衡服务器的搭建,以及Sonarqube代码质量检测。最后,阐述了Jenkins的灰度部署和自动部署流程,实现代码的高效管理和自动化发布。













&spm=1001.2101.3001.5002&articleId=128547173&d=1&t=3&u=27f42b5789f6430991da3f90bb94fe0d)
1662

被折叠的 条评论
为什么被折叠?



