实战案例
将代码部署到web服务器
实现代码的部署和回滚
实现代码参数
创建脚本
[root@jenkins-ubuntu ~]#mkdir /data/script
[root@jenkins-ubuntu ~]#vim /data/script/deploy-test.sh
echo 1 [root@jenkins-ubuntu ~]#cat /data/script/deploy-test.sh
#!/bin/bash
echo1
[root@jenkins-ubuntu ~]#chmod +x /data/script/deploy-test.sh
创建新作业
[root@jenkins-ubuntu ~]#vim /data/script/deploy-test.sh
[root@jenkins-ubuntu ~]#cat /data/script/deploy-test.sh
#!/bin/bash
#
echo 1
echo2
[root@jenkins-ubuntu ~]#vim /data/script/deploy-test.sh
[root@jenkins-ubuntu ~]#cat /data/script/deploy-test.sh
#!/bin/bash
#
echo 1
echo2
echo $3
实战案例
范例:实现部署上线和回滚脚本
[root@jenkins-ubuntu ~]# /data/script/deploy-test.sh
#!/bin/bash
DATE=date +%Y-%m-%d_%H-%M-%S
METHOD=1
BRANCH=2
GROUP_LIST=3
function IP_list(){
if [[{GROUP_LIST} == "online-group1" ]];then
Server_IP="172.31.0.105"
echo {Server_IP}
elif [[{GROUP_LIST} == "online-group2" ]];then
Server_IP="172.31.0.106"
echo {Server_IP}
ssh root@172.31.0.103 ""echo enable server linux38-web-80/172.31.0.105" | socat stdio /run/haproxy/admin.sock"
ssh root@172.31.0.104 ""echo enable server linux38-web-80/172.31.0.105" | socat stdio /run/haproxy/admin.sock"
elif [[{GROUP_LIST} == "online-all" ]];then
Server_IP="172.31.0.105 172.31.0.106"
echo {Server_IP}
fi
}
function clone_code(){
rm -rf /data/git/linux38/app1 cd /data/git/linux38
git clone -b{BRANCH} git@172.31.0.101:magedu/app1.git
}
function scanner_code(){
cd /data/git/linux38/app1 && /usr/local/sonarscanner/bin/sonar-scanner
}
function make_zip(){
cd /data/git/linux38/app1/ && zip -r app1.zip ./*
}
function node_down(){
for node in {Server_IP};do
ssh root@172.31.0.103 "echo "disable server linux38-web-80/{node}" | socat stdio /run/haproxy/admin.sock"
ssh root@172.31.0.104 "echo "disable server linux38-web-80/{node}" | socat stdio /run/haproxy/admin.sock"
echo "{node} 从负载均衡下线成功"
#echo "{node}"
done
}
function scp_zipfile(){
for node in{Server_IP};do
scp /data/git/linux38/app1/app1.zip www@{node}:/data/tomcat/tomcat_appdir/app1-{DATE}.zip
ssh www@{node} "unzip /data/tomcat/tomcat_appdir/app1-{DATE}.zip -d /data/tomcat/tomcat_webdir/app1-{DATE} && rm -rf /data/tomcat/tomcat_webapps/myapp && ln -sv /data/tomcat/tomcat_webdir/app1-{DATE} /data/tomcat/tomcat_webapps/myapp"
done
}
function stop_tomcat(){
for node in {Server_IP};do
echo "{node} 开始停止tomcat"
ssh www@{node} "/etc/init.d/tomcat stop"
echo "{node} tomcat停止成功"
done
}
function start_tomcat(){
for node in {Server_IP};do
ssh www@{node} "/etc/init.d/tomcat start"
#sleep 5
done
}
function web_test(){
sleep 20
for node in ${Server_IP};do
NUM=curl -s -I -m 10 -o /dev/null -w %{http_code} http://${node}:8080/myapp/index.html
if [[ {NUM} -eq 200 ]];then
echo "{node} 测试通过,即将添加到负载"
add_node {node}
else
echo "{node} 测试失败,请检查该服务器是否成功启动tomcat"
fi
done
}
function add_node(){
node=1
echo{node},"----->"
if [[ {GROUP_LIST} == "online-all" ]];then
ssh root@172.31.0.103 ""echo enable server myapp/172.31.0.105" | socat stdio /run/haproxy/admin.sock"
ssh root@172.31.0.104 ""echo enable server myapp/172.31.0.105" | socat stdio /run/haproxy/admin.sock" fi
##########################################
if [{node} == "172.31.0.105" ];then
echo "172.31.0.105 部署完毕,请进行代码测试!"
else
ssh root@172.31.0.103 ""echo enable server linux38-web-80/{node}" | socat stdio /run/haproxy/admin.sock"
ssh root@172.31.0.104 ""echo enable server linux38-web-80/{node}" | socat stdio /run/haproxy/admin.sock"
fi
}
function rollback_last_version(){
for node in ${Server_IP};do
NOW_VERSION=ssh www@{node} ""/bin/ls -l -rt /data/tomcat/tomcat_webapps/ | awk -F"->" '{print2}' | tail -n1""
NOW_VERSION=basename ${NOW_VERSION}
echo $NOW_VERSION
NAME=ssh www@{node} "" ls -l -rt /data/tomcat/tomcat_webdir/ | grep -B 1{NOW_VERSION} | head -n1 | awk '{print $9}'""
ssh www@{node} "rm -rf /data/tomcat/tomcat_webapps/myapp && ln -sv /data/tomcat/tomcat_webdir/{NAME} /data/tomcat/tomcat_webapps/myapp"
done
}
main(){
case 1 in
deploy)
IP_list; clone_code;
scanner_code;
make_zip;
node_down;
stop_tomcat;
scp_zipfile;
start_tomcat;
web_test;
;;
rollback_last_version)
IP_list;
echo{Server_IP}
node_down;
stop_tomcat;
rollback_last_version;
start_tomcat;
web_test;
;;
esac
}
main 12 $3
创建项目
新建一个项目叫test-deploy用于代码发布,上一个项目test-demo可用于代码 测试,当测试阶段出现问题的时候也不会立即进行发布,只有当测试通过之后才执行发布的项目即可
如何将代码发布到web服务器?
可以通过执行命令或脚本的方式进行代码发布,在各web服务器包括Jenkins服务器创
建一个www用户,保持id一致,用于启动web服务并进行代码发布
useradd www
echo "123456" | passwd –stdin www
su – www
$ ssh-keygen
添加部署key
添加Jenkins服务器www用户的公钥到git服务器项目当中:
确认key
确认www用户的key可以拉取代码
Shell 脚本
关于权限:
一般使用非root用户启动web服务及完成代码发布,默认Jenkins运行使用的是Jenkins 用户,因此需要赋予Jenkins用户一定的权限,另外发布的脚本可以在本机也可以不在 本机,需要使用Jenkins用户ssh到发布服务器执行shell脚本。
将脚本放在/home/www用户家目录,git代码也放在家目录,因此需要jenkins服务器 远程到代码发布服务器执行远程命令,需要做免登陆认证,将jenkins服务器root和
www用户的公钥放在代码部署服务器的www用户家目录.ss/authorized_keys文件中:
su – www
$ vim /home/www/.ssh/authorized_keys
• $ chmod 600 authorized_keys
验证ssh
在root用户和www用户下ssh到本机的www用户,确认可以免密码登录,以 便让部署服务器将用户的key添加到know_keys,否则报错Host key verification failed:
配置jenkins用户sudu权限
假如jenkins使用普通用户jenkins或其他普通用户启动,则要授予sudo权限,root不需要设置。
vim /etc/sudoers
56 # Defaults requiretty #不需要tty
99 jenkins ALL=(ALL) NOPASSWD: /usr/bin/ssh #不需要使用密码即可执行ssh
脚本内容:
$ cd /home/www/
$ vim deploy.sh
!/bin/bash
echo $USER
cd /home/www/myweb1
git pull
scp -r ./* www@192.168.10.133:/apps/tomcat/webapps/myapp
scp -r ./* www@192.168.10.134:/apps/tomcat/webapps/myapp
测试执行命令
在test-deploy项目的构建步骤调用,项目-配置-构建:
执行结果:
web服务器免密码登录
复制www用户公钥到各web服务器的www用户
$ ssh-copy-id www@192.168.10.133
$ ssh-copy-id www@192.168.10.134
gitlab提交代码
在另外一台服务器编辑代码后重新提交:
git clone http://192.168.10.130/web/myweb1.git
echo “xxx” >> index.html
git add index.html
git commit index.html
git push
在jenkins执行项目构建
构建项目之前要在www用下的xxx项目里面进行git pull命令。否则第一次更新提示输入yes会导致部署失败
再次提交代码
构建结果
访问负载测试:
项目关联
代码测试的项目执行成功之后自动调用代码发布的项目完成代码部署
安装Parameterized插件, 系统管理-管理插件-可选插件,搜索Parameterized, 如果插件在线安装不成功可以下载插件到此目录然后把属主属组改成jenkins再 重启jenkins服务即可完成安装
配置项目test-demo的构建后操作,demo构建完成后自动构建demp-deploy项目:
添加构建后操作
定义视图
安装pipeline插
添加视图:
配置视图
执行构建
代码自动构建
GitLab触发jenkins构建项目
目的为在公司的测试环境当中一旦开发向gitlab仓库提交成功代码,gitlab通知jenkins 进行构建项目、代码质量测试然后部署至测试环境,注意这只是测试环境,而生产环境依然需要手动部署代码
自动构建插件
安装Gitlab Hook Plugin插件:
系统管理-管理插件-可选插件-Gitlab Hook Plugin和Build Authorization Token Root
Plugin
Token
openssl rand -hex 12
Ü f7d0ead5398bd808ee139067
触发器
v测试成功
gitlab触发
# 插 件 使 用 介 绍 ,https://wiki.jenkins– ci.org/display/JENKINS/Build+Token+Root+Plugin
选择项目-设置-webhooks:
http://192.168.10.131:8080/buildByToken/build?job=test-demo&token=f7d0ead5398bd808ee139067
格式如下:
http://X.X.X.X:8080/buildByToken/build?job=项目名&token=随机数
保存后进行测试:
测试gitlab触发
在另一台向git服务器提交代码,验证是否可以自动部署:
echo "ccc" >> index.html
git add index.html
git commit -m "ccc“
git push
验证是否自动构建:
HAProxy
实现在haproxy动态增减服务器
haproxy 动态增减服务器
在Jenkins服务器复制www用户的公钥到haproxy服务器:
$ ssh-copy-id root@192.168.10.132
ssh-copy-id root@192.168.10.132
Haproxy服务器编辑# vim /etc/sudoers必须要tty
vim /etc/sudoers
root ALL=(ALL) ALL
jenkins ALL=(ALL) NOPASSWD: /usr/bin/ssh
www ALL=(ALL) ALL
测试www和root用户的ssh功能
验证:
• echo "enable server myapp_host/web2"|socat stdio /usr/local/haproxy/stats
开启功能
vim /etc/haproxy/haproxy.cfg
stats socket /usr/local/haproxy/stats mode 600 level admin
安装命令并测试
yum install socat
echo "help"| socat stdio /usr/local/haproxy/stats
echo "show info"| socat stdio /usr/local/haproxy/stats
echo "show stat"| socat stdio /usr/local/haproxy/stats
echo "disable server myapp_host/web2"|socat stdio /usr/local/haproxy/stats
分组是为了在代码分批次上线的时候对后端服务器的一种筛选方法:
• echo "enable server myapp_host/web2"|socat stdio
编写shell脚本实现自动化部署与回
本文链接:http://www.yunweipai.com/35918.html
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/courses/52619.html