Jenkins 业务发版平滑上线实战

开发 架构
原来发版必须等到晚上10点访问量最少的时候,期间服务中断产生大量告警。为了不影响业务,现在需要修改jenkins使其平滑上线。

背景简介:

原来发版必须等到晚上10点访问量最少的时候,期间服务中断产生大量告警。为了不影响业务,现在需要修改jenkins使其平滑上线。具体操作步骤如下:

第一步:拉取git指定分支

Jenkins默认一个项目只能对应一个git分支来构建,通过git Parameter插件可以从项目中读取GIT SCM 配置实现选择分支或tag来构建项目。

pipeline {
parameters{
gitParameter(name: 'BRANCH_TAG',type: 'PT_BRANCH_TAG',defaultValue: 'master')
}
stage('gitpull') {
steps {
checkout([$class: 'GitSCM',
branches: [[name: "${params.BRANCH_TAG}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [],gitTool: 'Default',submoduleCfg: [],
userRemoteConfigs: [[url: 'http://xxx.git',credentialsId: 'xxx',]]
])
}}}

图1-1 拉取指定分支

第二步:编译

通过mvn编译java代码,将编译后得到的jar包推送至各个服务器,其中servers_ips为各个服务器ip地址(如: servers_ips = ” 172.1.1.100 172.1.1.101”)。

script {
sh " mvn clean package -DskipTests " #编译java项目代码
for (server_ip in servers_ips.tokenize(' ')){
def remote = [:]
remote.name = root
remote.host = server_ip
remote.allowAnyHosts = true
withCredentials([sshUserPrivateKey(credentialsId:xxx,keyFileVariable:'identity',passphr aseVariable:'',usernameVariable:'userName')])
{
remote.user = userName
remote.identityFile = identity
sshPut remote: remote, from: "./target/xxx.jar", into: "/data/" #
将jar包推送至服务器
}}}

第三步:下线指定服务器

批量修改各个服务器上nginx配置,注释upstream中指定的服务器,使其下线不提供服务,为之后新代码上线做准备,在不影响业务的情况下平滑上线。

script {
for (server_ip2 in servers_ips.tokenize(' ')){
def remote = [:]
remote.name = root
remote.host = server_ip2
remote.allowAnyHosts = true

withCredentials([sshUserPrivateKey(credentialsId:xxx,keyFileVariable:'identity', passphraseVariable: '', usernameVariable: 'userName')]) {
remote.user = userName
remote.identityFile = identity
sshCommand remote: remote, command:"""
sed -i 's/.*'${指定服务器ip}'/#&/' /etc/nginx/conf.d/xxx.conf
nginx -s reload
"""
}}}

第四步:重启服务运行新代码

在刚下线的服务器上重启java项目使其运行新的代码。立即重启会导致原有的连接返回5xx,所以在重启之前sleep几秒。

sleep 30
def remote = [:]
remote.name = root
remote.host = 指定服务器ip
remote.allowAnyHosts = true
withCredentials([sshUserPrivateKey(credentialsId: xxx, keyFileVariable: 'identity', passphraseVariable: '', usernameVariable: 'userName')]) {
remote.user = userName
remote.identityFile = identity
sshCommand remote: remote, command:"./prodservice.sh restart"
}

第五步:健康检查

访问该服务器后端提供的接口判断是否可以提供服务。状态码为200即为健康即可上线提供服务,否则访问3次之后抛出异常中断Jenkins。服务启动过程中进行检查,jenkins会抛异常并中断,这里需要加上异常处理继续运行jenkins。

health_times=0
health_status = ""
while(health_times < 3){
try {
health_status = sh(script: "curl -I -m 10 -o /dev/null -s -w %{http_code} -d '' http://${server_ip}:8080/xxx", returnStdout: true).trim()
} catch(Exception e1) {
echo "服务没起来" }
if ( health_status == '200' ){
echo "健康"
break
}else if ( health_times < 2) {
sleep 30
echo "不健康,再次尝试检测..."
}else{
error "不健康" }
health_times = health_times +1 }

第六步:上线指定服务器

通过健康检查后,即可批量修改各个服务器上的nginx配置,使得该服务器上线提供服务。

for (server_ip2 in servers_ips.tokenize(' ')){
remote.name = root
remote.host = server_ip2
remote.allowAnyHosts = true
withCredentials([sshUserPrivateKey(credentialsId: ssh_credentialsId, keyFileVariable: 'identity', passphraseVariable: '', usernameVariable: 'userName')]) {
remote.user = userName
remote.identityFile = identity
sshCommand remote: remote, command:"""
sed -i 's/^#*\\(.*'${server_ip}'\\)/\\1/' /etc/nginx/conf.d/xxx.conf
nginx -s reload
"""
}}

第七步:检查

在构建过程中循环curl服务,检查是否会出现服务中断的情况。下图7-1为构建过程中的日志。

图7-1 平滑上线过程

至此,Jenkins平滑上线完成。


责任编辑:武晓燕 来源: 新钛云服
相关推荐

2021-10-26 09:27:10

MySQL分表上线

2020-01-21 21:48:07

架构平滑上云机房迁移

2020-07-21 15:13:58

腾讯云SQL Server数据库

2009-12-29 16:25:14

全业务接入网

2020-07-21 15:52:01

腾讯云数据库SQL Server

2022-07-27 22:48:29

消息中间件RocketMQ架构设计

2016-01-05 11:53:27

视频监控智能云平台VCM502华为

2020-06-18 09:32:15

微信移动应用

2014-03-28 10:50:07

微软iPadOffice

2017-03-30 16:21:51

互联网

2011-12-09 18:14:38

中关村商城

2014-04-23 17:21:45

Cooliris豌豆荚

2023-12-11 06:27:39

MySQL线上业务优化后台上传文件

2017-01-20 11:14:37

红包

2010-09-09 09:51:26

Webmail邮件安全263企业邮箱

2010-04-22 09:35:51

互联网

2015-06-24 16:09:54

Easy Connec深信服

2009-04-28 14:18:17

电子商务

2015-07-17 17:39:07

微软Windows 1应用商店

2012-05-06 08:36:54

iOS
点赞
收藏

51CTO技术栈公众号