Jnekins实战: 实现代码的部署和回滚

实战案例

将代码部署到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

创建新作业

Jnekins实战: 实现代码的部署和回滚插图
Jnekins实战: 实现代码的部署和回滚插图(1)
Jnekins实战: 实现代码的部署和回滚插图(2)
Jnekins实战: 实现代码的部署和回滚插图(3)
Jnekins实战: 实现代码的部署和回滚插图(4)
Jnekins实战: 实现代码的部署和回滚插图(5)
Jnekins实战: 实现代码的部署和回滚插图(6)
Jnekins实战: 实现代码的部署和回滚插图(7)
Jnekins实战: 实现代码的部署和回滚插图(8)

[root@jenkins-ubuntu ~]#vim /data/script/deploy-test.sh
[root@jenkins-ubuntu ~]#cat /data/script/deploy-test.sh
#!/bin/bash
#
echo 1
echo2

Jnekins实战: 实现代码的部署和回滚插图(9)
Jnekins实战: 实现代码的部署和回滚插图(10)
Jnekins实战: 实现代码的部署和回滚插图(11)

[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

Jnekins实战: 实现代码的部署和回滚插图(12)
Jnekins实战: 实现代码的部署和回滚插图(13)

实战案例

范例:实现部署上线和回滚脚本

[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服务器项目当中:

Jnekins实战: 实现代码的部署和回滚插图(14)

确认key

确认www用户的key可以拉取代码

Jnekins实战: 实现代码的部署和回滚插图(15)

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

Jnekins实战: 实现代码的部署和回滚插图(16)

验证ssh

在root用户和www用户下ssh到本机的www用户,确认可以免密码登录,以 便让部署服务器将用户的key添加到know_keys,否则报错Host key verification failed:

Jnekins实战: 实现代码的部署和回滚插图(17)

配置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项目的构建步骤调用,项目-配置-构建:

Jnekins实战: 实现代码的部署和回滚插图(18)

执行结果:

Jnekins实战: 实现代码的部署和回滚插图(19)

web服务器免密码登录

复制www用户公钥到各web服务器的www用户

$ ssh-copy-id www@192.168.10.133

$ ssh-copy-id www@192.168.10.134

Jnekins实战: 实现代码的部署和回滚插图(20)

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会导致部署失败

再次提交代码

构建结果

Jnekins实战: 实现代码的部署和回滚插图(21)

访问负载测试:

Jnekins实战: 实现代码的部署和回滚插图(22)

项目关联

代码测试的项目执行成功之后自动调用代码发布的项目完成代码部署

安装Parameterized插件, 系统管理-管理插件-可选插件,搜索Parameterized, 如果插件在线安装不成功可以下载插件到此目录然后把属主属组改成jenkins再 重启jenkins服务即可完成安装

Jnekins实战: 实现代码的部署和回滚插图(23)
Jnekins实战: 实现代码的部署和回滚插图(24)

配置项目test-demo的构建后操作,demo构建完成后自动构建demp-deploy项目:

Jnekins实战: 实现代码的部署和回滚插图(25)
Jnekins实战: 实现代码的部署和回滚插图(26)

添加构建后操作

定义视图

安装pipeline插

Jnekins实战: 实现代码的部署和回滚插图(27)
Jnekins实战: 实现代码的部署和回滚插图(28)

添加视图:

Jnekins实战: 实现代码的部署和回滚插图(29)

配置视图

Jnekins实战: 实现代码的部署和回滚插图(30)

执行构建

Jnekins实战: 实现代码的部署和回滚插图(31)
Jnekins实战: 实现代码的部署和回滚插图(32)

代码自动构建

GitLab触发jenkins构建项目

目的为在公司的测试环境当中一旦开发向gitlab仓库提交成功代码,gitlab通知jenkins 进行构建项目、代码质量测试然后部署至测试环境,注意这只是测试环境,而生产环境依然需要手动部署代码

自动构建插件

安装Gitlab Hook Plugin插件:

系统管理-管理插件-可选插件-Gitlab Hook Plugin和Build Authorization Token Root

Plugin

Jnekins实战: 实现代码的部署和回滚插图(33)
Jnekins实战: 实现代码的部署和回滚插图(34)

Token

openssl rand -hex 12

Ü f7d0ead5398bd808ee139067

触发器

Jnekins实战: 实现代码的部署和回滚插图(35)

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=随机数

保存后进行测试:

Jnekins实战: 实现代码的部署和回滚插图(36)
Jnekins实战: 实现代码的部署和回滚插图(37)

测试gitlab触发

在另一台向git服务器提交代码,验证是否可以自动部署:

echo "ccc" >> index.html

git add index.html

git commit -m "ccc“

git push

验证是否自动构建:

Jnekins实战: 实现代码的部署和回滚插图(38)

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功能

验证:

Jnekins实战: 实现代码的部署和回滚插图(39)

• 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

分组是为了在代码分批次上线的时候对后端服务器的一种筛选方法:

Jnekins实战: 实现代码的部署和回滚插图(40)

• echo "enable server myapp_host/web2"|socat stdio

Jnekins实战: 实现代码的部署和回滚插图(41)

编写shell脚本实现自动化部署与回

本文链接:http://www.yunweipai.com/35918.html

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/courses/52619.html

(0)
上一篇 2021年8月6日 16:40
下一篇 2021年8月6日 16:40

相关推荐

发表回复

登录后才能评论