目录
2.Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前端应用的蓝绿发布
一、实验
1.蓝绿发布准备
(1)环境
表1 主机
|---------|-------------|--------------|----------|---------------------|---------------------|
| 主机 | 架构 | 软件 | 版本 | IP | 备注 |
| gitlab | ansible 管理端 | gitlab 主节点 | 12.10.14 | 192.168.204.8:82 | jenkins slave(从节点) |
| | | sonarqube | 9.6 | 192.168.204.8:9000 | |
| master1 | ansible被管理端 | K8S master节点 | 1.20.6 | 192.168.204.180 | |
| node1 | ansible被管理端 | K8S node节点 | 1.20.6 | 192.168.204.181 | |
| node2 | ansible被管理端 | K8S node节点 | 1.20.6 | 192.168.204.182 | |
| jenkins | 无 | jenkins主节点 | 2.414.2 | 192.168.204.15:8080 | gitlab runner (从节点) |
| tomcat | 无 | nexus | 3.63 | 192.168.204.13:8081 | |
表2 蓝绿发布相关主机
|----------|-----------------|------|---------------|
| 服务 | IP地址 | 端口 | 主机名 |
| LB | 192.168.204.13 | 8017 | tomcat |
| service1 | 192.168.204.180 | 8019 | (K8S) master1 |
| service2 | 192.168.204.181 | 8019 | (K8S) node1 |
| service3 | 192.168.204.182 | 8019 | (K8S) node2 |
(2)策略
service1服务 1.1.2 (CD部署制品), 升级1.1.3(先CI下载制品,再CD部署制品)
service2服务 1.1.2 (CD部署制品),升级 1.1.3(先CI下载制品,再CD部署制品)
service3服务 1.1.2 (CD部署制品),服务下线,升级 1.1.3(先CI下载制品,再CD部署制品),服务上线
(3)修改3台service服务的nginx配置文件 root目录
bash
1 user nginx;
2 worker_processes auto;
3
4 error_log /var/log/nginx/error.log notice;
5 pid /var/run/nginx.pid;
6
7
8 events {
9 worker_connections 1024;
10 }
11
12
13 http {
14 include /etc/nginx/mime.types;
15 default_type application/octet-stream;
16
17 log_format main '$remote_addr - $remote_user [$time_local] "$request" '
18 '$status $body_bytes_sent "$http_referer" '
19 '"$http_user_agent" "$http_x_forwarded_for"';
20
21 access_log /var/log/nginx/access.log main;
22
23 sendfile on;
24 tcp_nopush on;
25 tcp_nodelay on;
26 types_hash_max_size 2048;
27
28
29 keepalive_timeout 65;
30
31 #gzip on;
32
33 include /etc/nginx/conf.d/*.conf;
34
35
36 server {
37 listen 8099;
38 server_name _;
39 root /usr/share/nginx/html/devops03-devops-ui;
40
41 # Load configuration files for the default server block.
42 include /etc/nginx/default.d/*.conf;
43
44 location / {
45 }
46
47 error_page 404 /404.html;
48 location = /40x.html {
49 }
50
51 error_page 500 502 503 504 /50x.html;
52 location = /50x.html {
53 }
54 }
55

(4)Jenkins手动构建前端项目CD流水线

(5)成功

(6)LB主机修改nginx配置文件
bash
# vim /etc/nginx/nginx.conf
bash
1
2 user nginx;
3 worker_processes auto;
4
5 error_log /var/log/nginx/error.log notice;
6 pid /var/run/nginx.pid;
7
8
9 events {
10 worker_connections 1024;
11 }
12
13
14 http {
15 upstream webservers {
16 server 192.168.204.180:8099 weight=100;
17 server 192.168.204.181:8099 weight=100;
18 server 192.168.204.182:8099 weight=100;
19 }
20 include /etc/nginx/mime.types;
21 default_type application/octet-stream;
22
23 log_format main '$remote_addr - $remote_user [$time_local] "$request" '
24 '$status $body_bytes_sent "$http_referer" '
25 '"$http_user_agent" "$http_x_forwarded_for"';
26
27 access_log /var/log/nginx/access.log main;
28
29 sendfile on;
30 #tcp_nopush on;
31
32
33 keepalive_timeout 65;
34
35 #gzip on;
36
37 include /etc/nginx/conf.d/*.conf;
38
39
40 server {
41 listen 8017;
42 location / {
43 proxy_pass http://webservers;
44 }
45 }
46 }

(7)重启服务监听8017端口
bash
# vim /etc/nginx/nginx.conf
# nginx -t
# netstat -antlp | grep 8017
# service nginx restart
# systemctl restart nginx.service

(8) 测试负载均衡
bash
curl http://127.0.0.1:8017

(9)watch命令观察service版本变化
bash
# watch -n 1 " curl http://127.0.0.1:8017/ -s"


2.Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前端应用的蓝绿发布
(1)GitLab前端项目添加RELEASE-1.1.3分支

(2) Jenkins修改共享库流水线脚本路径

(3)Jenkins手动构建前端项目CI流水线

(4)成功

(5)Nexus查看制品

(6) 修改LB的nginx配置文件,service3下线(K8S node2 节点)
bash
# vim /etc/nginx/nginx.conf
......
server 192.168.204.181:8099 down;
......
# service nginx restart
# systemctl restart nginx.service
(7) Jenkins手动构建前端项目CD流水线到node1 节点


(8) watch命令观察service版本变化
bash
# watch -n 1 " curl http://127.0.0.1:8017/ -s"



(9)Jenkins手动构建前端项目CD流水线到node2节点
(10) 修改LB的nginx配置文件,service3上线(K8S node2 节点)
bash
# vim /etc/nginx/nginx.conf
# service nginx restart
# systemctl restart nginx.service


(11)Jenkins手动构建前端项目CD流水线到master1节点
(12) watch命令观察service版本变化
bash
# watch -n 1 " curl http://127.0.0.1:8017/ -s"


二、问题
1.手动构建Jenkins前端项目CI流水线报错
(1)报错
ERROR: Couldn't find any revision to build. Verify the repository and branch configuration for this job.

(2)原因分析
分支名错误

(3)解决方法
GitLab前端项目确认添加RELEASE-1.1.3分支

构建时输入正确的分支名称

2.如何优化手动构建流水线选项参数
(1)Active Choices 插件
bash
Active Choices 插件用于自由式Jenkins参数化工作创建脚本化、动态和交互式作业参数。主动选择参数可以动态更新,并可以呈现为组合框,复选框,单选按钮或丰富的HTML UI小部件。
主动选择参数使用Groovy编写脚本,或者(可选)Scriptler Groovy脚本。
这些定制脚本支持使用Jenkins Java API、系统环境变量、全局节点属性,以及可能的外部Java和Javascript库。
安装插件后,有三种新的参数类型可用:
1)主动选择参数
2)主动选择反应参数
3)主动选择反应引用参数
(2)三种 Active Choices parameter 类型的行为和呈现特征

(3)安装插件


(3)更新前效果

(4)更新
bash
return [
"ansible",
"saltstack"
]

bash
if (deployTool.equals("ansible")){
return ["192.168.204.180","192.168.204.181","192.168.204.182"]
}
if (deployTool.equals("saltstack")){
return ["tomcat","jenkins"]
}

(5)更新后效果