自动化部署实践(代码片段)

author author     2022-12-28     456

关键词:

1.1 早期手动部署代码

方式

1、纯手工scp上传

2、纯手工登录,git pull、svn update

3、纯手工xftp往上拉

4、开发给打一个压缩包,rz 上去然后解压

缺点

1、运维全程参与,占用大量时间

2、上线速度太慢

3、人为失误过多,管理混乱

4、回滚的太慢、不及时、并且难以回滚

1.2 如何设计自动代码部署系统

1、规划

2、实现

3、总结和扩展

4、在生产环境中应用

1.2.1 自动化部署环境

1、开发环境

开发者本地有自己的环境,然后运维需要配置公共的开发环境,大家可公用的服务,例如开发数据库mysql redis等

2、测试环境

功能测试环境和性能测试环境

3、预生产环境

生产环境集群中的某一个节点担任

4、生产环境

直接对用户提供的环境

1.2.2 自动化部署规划

  • 有一个可以上线代码的git仓库
  • 一个集群中有10个节点,实现一键部署、秒级回滚
  • 所有的web服务都应该使用普通用户
  • 所有的web服务都不应该监听80端口,除了负载均衡

1.2.3 自动化部署实现思路

  • 代码放在那里

    代码放在svn、git(优先选择)上

  • 编译(可选 java环境需要)
  • 获取什么版本的代码

1、svn+git:直接拉取某个分支

2、svn:指定版本号

3、git:指定tag

  • 差异解决

1、各个代码直接差异,配置文件未必一样

2、代码仓库和实际的差异,代码是否放在代码仓库中(配置单独进行存放)短信接口、支付,等敏感信息不能让所有的开发知道

-项目名设计
web-demo_456_2018-09-02-15-32-14

  • 如何更新

php、tomcat需要重新启动

  • 测试

1、测试关键的页面、API、后台等

2、测试一个与生产环境、通过则继续部署,失败则进行回滚

  • 日志记录

1、对部署进行设计

成功多少次

失败多少次

回滚多少次

  • 多人同时执行脚本

防止多人同时操作,导致重复上线失败,通过lock锁文件进行控制

  • 串行和并行

1、若集群中机器少,则串行看不出什么问题、若机器多则串行会非常的慢

2、分组部署、并行部署

3、测试预生产环境,成功则继续部署,失败则进行回滚

  • 如何执行

1、shell执行

2、web界面进行操作

1.2.4 自动话部署实践

1、获取最新代码

2、编译(可选)

3、配置文件(软连接或者cp)

4、打包

5、scp到目标服务器

6、解压

7、放置到webroot

8、scp差异文件

9、重启(可选)

10、测试

11、加入集群

自动化部署代码的精髓在于创建软连接

1.2.5 回退实践

1.2.5.1 正常回退实践

1、列出回滚版本

2、目标服务器移除集群

3、执行回滚(删除软连接、重建软连接)

4、重启和测试

5、加入集群

1.2.5.2 紧急回退实践

1、列出回滚版本

2、执行回滚(删除软连接、重建软连接)

3、重启对应服务

1.2.5.3 更紧急回退实践

1、执行回滚

2、重启

1.3 自动化部署系统构建实践

1.3.1 环境准备

linux_node1 10.0.0.7

linux_node2 10.0.0.8

1、创建普通用户(两台同时进行)

useradd -u 1000 lzh

echo ‘123456‘|passwd --stdin lzh

2、配置密钥

[[email protected]_node1 ~]# su - lzh  切换至普通用户

[[email protected]_node1 ~]$ ssh-keygen -t dsa  生成密钥

Generating public/private dsa key pair.

Enter file in which to save the key (/home/lzh/.ssh/id_dsa): 默认一路回车

Created directory ‘/home/lzh/.ssh‘.

Enter passphrase (empty for no passphrase): 

Enter same passphrase again:

Your identification has been saved in /home/lzh/.ssh/id_dsa. 钥匙

Your public key has been saved in /home/lzh/.ssh/id_dsa.pub. 锁

The key fingerprint is:

f9:bb:3a:7f:e3:17:56:12:d3:8a:7b:78:79:ab:e2:de [email protected]_node1

The key‘s randomart image is:

+--[ DSA 1024]----+
|               . |
|              o .|
|             . + |
|         .  . o .|
|        S    o + |
|         .  o * .|
|          .  + o.|
|        .  o+ .. |
|        .+**oE.  |
+-----------------+

[[email protected]_node1 ~]$ ssh-copy-id  -i ~/.ssh/id_dsa.pub [email protected]
The authenticity of host ‘172.16.1.8 (172.16.1.8)‘ can‘t be established.
RSA key fingerprint is c2:34:59:81:a2:a7:9c:0a:23:9b:cf:1d:bb:d4:8e:ad.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘172.16.1.8‘ (RSA) to the list of known hosts.
[email protected]‘s password: 
Now try logging into the machine, with "ssh ‘[email protected]‘", and check in:

  .ssh/authorized_keys

to make sure we haven‘t added extra keys that you weren‘t expecting.

[[email protected]_node1 ~]$ ssh 172.16.1.8
[[email protected]_node2 ~]$    

3、创建相关目录

mkdir -p /deploy/code/web-demo 
mkdir -p /deploy/config/web-demo/base
mkdir -p /deploy/config/web-demo/other
mkdir -p /deploy/tar
mkdir -p /deploy/tmp 
[[email protected]_node1 ~]# tree /deploy/
/deploy/
├── code
│?? └── web-demo
├── config
│?? └── web-demo
│??     ├── base
│??     └── other
├── tar
└── tmp

8 directories, 0 files

chown -R lzh.lzh /deploy
chown -R lzh.lzh /opt/webroot/
chown -R lzh.lzh /webroot/

1.3.2 自动化脚本

查看脚本

#!/bin/bash 

#Dir List
#mkdir -p /deploy/code/web-demo 
#mkdir -p /deploy/config/web-demo/base 
#mkdir -p /deploy/config/web-demo/other
#mkdir -p /deploy/tar
#mkdir -p /deploy/tmp 
#mkdir -p /opt/webroot
#chown -R lzh.lzh /deploy
#chown -R lzh.lzh /opt/webroot
#chown -R lzh.lzh /webroot

#Node List
PRE_LIST="172.16.1.7"
GROUP1_LIST="172.16.1.8"
ROLLBACK_LIST="172.16.1.7 172.16.1.8"
#Date/Time Veriables
LOG_DATE=‘date "+%Y-%m-%d"‘
LOG_TIME=‘date "+%H-%M-%S"‘

CDATE=`date "+%Y-%m-%d"`
CTIME=`date "+%H-%M-%S"`

#PKG_NAME
TEST=pre
PRODUCT=master

# Shell Env 
SHELL_NAME="deploy.sh"
SHELL_DIR="/home/lzh"
SHELL_LOG="$SHELL_DIR/$SHELL_NAME.log"

# Code Env
PRO_NAME="web-demo"
CODE_DIR="/deploy/code/web-demo"
CONFIG_DIR="/deploy/config/web-demo"
TMP_DIR="/deploy/tmp"
TAR_DIR="/deploy/tar"
LOCK_FILE="/tmp/deploy.lock"

usage()
    echo $"Usage: $0 deploy | rollback [ list | version ]"



writelog()
    LOG_INFO=$1
    echo "$CDATE $CTIME: $SHELL_NAME : $LOG_INFO " >> $SHELL_LOG


shell_lock()
    touch $LOCK_FILE


url_test()
    URL=$1
    curl -s --head $URL|grep "200 OK"
    if [ $? -ne 0 ];then
        shell_unlock;
        writelog "test error" && exit;
    fi


shell_unlock()
    rm -f $LOCK_FILE


code_get()
    writelog " code_get";
    cd $CODE_DIR && echo "git pull"
    cp -r $CODE_DIR $TMP_DIR/
    API_VER="456"


code_build()
    echo code_build



code_config()
    writelog "code_config"
    /bin/cp -r $CONFIG_DIR/base/* $TMP_DIR/"$PRO_NAME"
    PKG_NAME="$PRO_NAME"_"$API_VER"_"$TEST"_"$CDATE-$CTIME"
    cd $TMP_DIR && mv $PRO_NAME $PKG_NAME


code_tar()
    writelog "code_tar"
    cd $TMP_DIR && tar zcf $PKG_NAME.tar.gz $PKG_NAME
    writelog "$PKG_NAME.tar.gz"


code_scp()
    writelog "code_scp"
    for node in $PRE_LIST;do
        scp $TMP_DIR/$PKG_NAME.tar.gz $node:/opt/webroot/
    done
    for node in $GROUP1_LIST;do
        scp $TMP_DIR/$PKG_NAME.tar.gz $node:/opt/webroot/
    done


pre_deploy()
    writelog "remove from cluster"
                ssh $PRE_LIST "cd /opt/webroot && tar zxf $PKG_NAME.tar.gz"
        ssh $PRE_LIST "rm -f /webroot/web-demo && ln -s /opt/webroot/$PKG_NAME /webroot/web-demo"


pre_test()
    url_test "http://$PRE_LIST/index.html"
    echo "add to cluster"


group1_deploy()
    writelog "remove from cluster"
        for node in $GROUP1_LIST;do
                ssh $node "cd /opt/webroot && tar zxf $PKG_NAME.tar.gz"
        ssh $node "rm -f /webroot/web-demo && ln -s /opt/webroot/$PKG_NAME /webroot/web-demo"
        done
    scp $CONFIG_DIR/other/172.16.1.8.crontab.xml 172.16.1.8:/webroot/web-demo/crontab.xml


group1_test()
    url_test "http://172.16.1.8/index.html"
    echo "add to cluster"


cluster_node_in()
    echo cluster_node_in



rollback_fun()
if [ -z $1 ];then
        shell_unlock
        echo "Pls input rollback version" && exit
fi
        for node in $ROLLBACK_LIST;do
            ssh $node "rm -f /webroot/web-demo && ln -s /opt/webroot/$1 /webroot/web-demo"
        done


rollback_list()
    find /opt/webroot/*.tar.gz -mtime +1|tail -1 |awk -F "[/ .]" ‘print$4‘


rollback()
if [ -z $1 ];then
    shell_unlock
    echo "Pls input rollback version" && exit
fi
    case "$1" in
        list)
            ls -l /opt/webroot/*.tar.gz
            ;;
        *)
            rollback_fun $1
    esac


main()
   if [ -f $LOCK_FILE ];then
    echo "Deploy is running" && exit;
   fi
    DEPLOY_METHOD=$1
    ROLLBACK_VER=$2
    case "$DEPLOY_METHOD" in
        deploy)
        shell_lock;
        code_get;
        code_build;
        code_config;
        code_tar;
        code_scp;
        pre_deploy;
        pre_test;
        group1_deploy;
        group1_test;
        shell_unlock;
        ;;
    list)
        rollback_list;
        ;;
       rollback)
        shell_lock;
        rollback $ROLLBACK_VER;
        shell_unlock;
        ;;
       *)
        usage;
  esac

main $1 $2

执行部署上线

[[email protected]_node1 ~]$ ./deploy.sh deploy
git pull
code_build
web-demo_456_pre_2018-09-02-16-06-52.tar.gz                                                        100%  218     0.2KB/s   00:00    
web-demo_456_pre_2018-09-02-16-06-52.tar.gz                                                        100%  218     0.2KB/s   00:00    
HTTP/1.1 200 OK
pre add to cluster
172.16.1.8.crontab.xml                                                                             100%    0     0.0KB/s   00:00    
HTTP/1.1 200 OK
group1 add to cluster

查看当前版本

[[email protected]_node1 ~]$ ./deploy.sh list
web-demo_456_2018-09-02-15-10-13
web-demo_456_2018-09-02-15-10-13

执行回滚操作

[[email protected]_node1 ~]$ ./deploy.sh rollback 
Pls input rollback version
[[email protected]_node1 ~]$ ./deploy.sh 配合list使用  web-demo_456_pre_2018-08-30-00-00-06

查看日志

[[email protected]_node1 ~]$ tail deploy.sh.log 
2018-09-02 16-45-23: deploy.sh : code_scp 
2018-09-02 16-45-23: deploy.sh : remove from cluster 
2018-09-02 16-45-23: deploy.sh : remove from cluster 
2018-09-02 17-29-54: deploy.sh :  code_get 
2018-09-02 17-29-54: deploy.sh : code_config 
2018-09-02 17-29-54: deploy.sh : code_tar 
2018-09-02 17-29-54: deploy.sh : web-demo_456_pre_2018-09-02-17-29-54.tar.gz 
2018-09-02 17-29-54: deploy.sh : code_scp 
2018-09-02 17-29-54: deploy.sh : remove from cluster 
2018-09-02 17-29-54: deploy.sh : remove from cluster

git+jenkins学习之路(十四)之自动化脚本部署实践(代码片段)

一、环境说明和准备1、环境说明主机名IP地址角色系统deploy-server192.168.56.12发布Centos7.4web192.168.56.13web服务器,nfs服务器Centos7.42、服务器准备工作(1)发布机前期准备a.增加普通用户并配置密码[[email protected]~]#useraddwww[[email... 查看详情

前端自动化部署的深度实践(代码片段)

年前我也在自动化部署这方面下了点功夫,将自己的学习所得在自动化部署的一小步,前端搬砖的一大步这篇博客中做了分享。感谢两位网友@_shanks和@TomCzHen的意见,让我有了继续优化部署流程的动力。本文主要是在自动化部署... 查看详情

自动化部署的一次实践(代码片段)

...。问题1:需要每次手动triggerbuild。解决1:在Bamboo上设置自动化的buildschedule。问题2:需要手动下载并解压build好的tar包。解决2:写一个downloadpackage的脚本。至此,上述的问题已经得到解决。解决Fix1:Configurebuildschedule->BambooBamboo... 查看详情

jenkinspipeline部署实践及重点问题分析(代码片段)

...自由风格或者maven风格来创建jenkinsitem,虽然也能实现自动化部署,但是面对相对复杂的构建需求时可能就不太好实现。一般正式的项目,除了基本的拉取代码、编译代码、运行junit、打包、启动或者重启外,可能... 查看详情

一文解答,亲自实践|计算机视觉mlops自动化pipeline工具链(代码片段)

...;和DevOps的推进,机器学习等的模型训练、部署全流程自动化技术、容器化技术的推广,逐渐可以做到计算机视觉MLOps。今天分享的文章就是介绍这样的一个工具链,帮助你完成模型训练、调参、monitor、部署的全流程... 查看详情

一文解答,亲自实践|计算机视觉mlops自动化pipeline工具链(代码片段)

...;和DevOps的推进,机器学习等的模型训练、部署全流程自动化技术、容器化技术的推广,逐渐可以做到计算机视觉MLOps。今天分享的文章就是介绍这样的一个工具链,帮助你完成模型训练、调参、monitor、部署的全流程... 查看详情

k8s集群使用ingress实现网站入口动静分离实践(代码片段)

...个问题,问题简要如下:1、java应用容器化部署首先通过自动化部署工具编译出全量的war包,将war包直接编译到docker镜像后推送到私用仓库并版本化控制;其次通过更新deployment的yaml文件来实现部署和后续的滚动更新,应用程序... 查看详情

自动化部署之jenkins及简介(代码片段)

...,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。... 查看详情

docker+jenkins+gitlab+django应用部署实践(代码片段)

...解决方案,应用好CI/CD可以大大的方便我们的日常工作,自动化快速的持续集成/持续交付为我们带来了应用开放的更快速度、更好的稳定性和更强的可靠性。二、拓扑环境2.1架构拓扑如上图实例,简单花了下流程拓扑:当研发pus... 查看详情

ci/cd(代码片段)

CI/CD  CI/CD是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD的核心概念是持续集成、持续交付和持续部署。持续集成:是一种软件开发实践,团队开发人员频繁提交代码到源代码仓库,每次提交都进行... 查看详情

linux-gitlab+jenkins持续集成+自动化部署(代码片段)

GitLab+Jenkins持续集成+自动化部署什么是持续集成?(1)Continuousintegration(CI)持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员至少集成一次,也就意味着每天可能会发生多次集成。每次集成都... 查看详情

ci/cd(代码片段)

CI/CD  CI/CD是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD的核心概念是持续集成、持续交付和持续部署。持续集成:是一种软件开发实践,团队开发人员频繁提交代码到源代码仓库,每次提交都进行... 查看详情

2020系统综合实践(代码片段)

...常是HTTPRESTFULAPI。这些服务围绕业务能力来划分,并通过自动化部署机制来独立部署。这些服务可以使用不同的编程语言,不同数据库,以保证最低限度的集中式管理。总的来说,微服务是一种架构风格,一个大型复杂软件应用... 查看详情

实践docker部署(代码片段)

实践Docker部署一键Docker安装可以使用如下两种命令之一,注意容器内东八区时间配置curl-fsSLhttps://get.docker.com|bash-sdocker--mirrorAliyun或者curl-sSLhttps://get.daocloud.io/docker|sh常用服务1MySQL创建并更改配置文件/home/dockerFiles/mysql/conf 查看详情

devops实践之gitlab安装部署(代码片段)

AllGitLabpackagesarepostedtoour packageserver andcanbedownloaded.Wemaintainfiverepos:GitLabEE:forofficialEnterpriseEditionreleasesGitLabCE:forofficialCommunityEditionreleasesUnstable:forrele 查看详情

中小企业自动化部署实践

上部署流程图自动化部署的流程图 查看详情

springcloud应用在kubernetes上的最佳实践—部署篇(工具部署)(代码片段)

...读:上一篇文章《SpringCloud应用在Kubernetes上的最佳实践—部署篇(开发部署)》我们介绍了从IDE插件内介绍了如何进行应用部署的方式,除此之外,目前EDAS还支持了额外的工具对其他场景进行覆盖,这一篇内容主要就是介绍EDAS上... 查看详情

我的docker随笔35:jenkins服务部署(代码片段)

...现CICD功能。其目的是为了在实际工作中使用代码托管及自动化操作。一、引言因工作需要,需部署jenkins服务器进行测试。与网上几分钟即可部署的文章相比,本文更注重个人的实践记录。本文与前面的gitlab有一定的关联... 查看详情