基于git的代码上线脚本一例

简介:

  简单分享下我们之前的采用的基于git的开发上线流程,以及所采用的的上线脚本。流程只简单说下,只能希望是抛砖引玉了;上线脚本是本文“重点”。之所以想分享这套脚本,因为个人感觉这套脚本提供了一种目录间“备份--更新/同步--回滚”的实现思路,对其中的细节稍作修改,应该可以适用到其他地方。

总结了两张图来说明基于git的开发流程和上线流程

wKiom1ZZcfixzaTKAAClXbP22xI942.png

wKiom1ZZcg3ysKPiAAEP-Kum-S4914.png


下面一起来看上线脚本  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/bin/sh
 
###定义检查上一条命令是否执行成功的函数
function  check {
     if  [ $? - ne  0 ]; then 
         echo  -e  "\e[1;31m `date +%Y%m%d_%H:%M:%S`  $1 exec failed,please check it ! \e[0m" | tee  -a  /root/shells/update_online/logs/www .err
         exit  -1
     fi
}
 
ips= "192.xxx.xx.x  192.xxx.xx.x  192.xxx.xx.x"
domain=www.xxx.com     ###项目域名
app_base_dir= /app     ###线上server:项目所在目录,如$app_base_dir/$app_dir拼起来即为项目所在绝对路径/app/www
app_dir=www     ###线上server:项目相对目录
local_dir= /home/update/to_online/www     ###本地server:该目录是从远程git库检出的master分支,即“随时可上线的代码”
bak_dir= /update_bak     ###线上server:备份目录
 
 
cat  <<update
+------------------------------------------+
+                 A) 备份                  +
+                 B) 更新                  +
+                 C) 回滚                  +
+                 Q) 退出                  +
+------------------------------------------+
update
read  -p  "请输入 (A|B|C|Q) ,再按ENTER键: "  INPUT
 
###备份
if  [ $INPUT =  "A"  ];  then
     for  ip  in  $ips
     do
         ###在远程服务器备份,留三次的备份
         echo  -e  "\e[1;33m\n-----------backup  $ip $domain------------\e[0m"
         ssh  $ip " if  [ ! -z $bak_dir ] && [ ! -z $app_dir ]; then \
                      mkdir  $bak_dir &>  /dev/null cd  $bak_dir;
                      ls  -d $base_dir*| sort  -r| cat  -n | awk  '\$1 > 2 {print \$NF}' | xargs  rm  -rf;
                      rsync  -a --delete $app_base_dir/$app_dir/ $bak_dir/$app_dir-` date  +%Y%m%d_%H.%M`/ --exclude  'xxx'  --exclude  'xxx/xxx'
                  else \
                      exit  -1;
                  fi "               
         
         check  "backup $ip $domain" ;
         echo  -e  "\e[1;32m\n------backup $ip $domain success--------\e[0m\n"
     done
 
###更新
elif  [ $INPUT =  "B"  ];  then
     ###拉取最新代码
     echo  -e  "\e[1;33m\n---------------git pull--------------\e[0m"
     cd  $local_dir 
     git pull
     check  "git pull" ;
     echo  -e  "\e[1;32m\n-----------git pull success------------\e[0m"
     
     ###执行更新操作
     for  ip  in  $ips
     do
         echo  -e  "\e[1;33m----------update $ip $domain--------------\e[0m\n"
         cd  $local_dir
         if  [ ! -z $app_base_dir ] && [ ! -z $app_dir ]; then     ###此处因有--delete参数,故而先判断目录变量是否存在
             rsync  -avz --delete  --exclude  ".gitignore"  --exclude  ".git"   ./  $ip:$app_base_dir/$app_dir/
             check  "rsync to $ip" ;
         else
             exit  -1
         fi
         echo  -e  "\e[1;32m\n--------update $ip $domain success----------\e[0m"
     done
 
###回滚
elif  [ $INPUT =  "C"  ];  then
     for  ip  in  $ips
     do
         echo  -e  "\e[1;33m\n--------$ip $domain Start Rollback----------\e[0m"
         ###在远程获取备份目录的倒序排列,这里没有将命令集成到下面的远程命令代码块中是因为远程for i in `cat`操作需用单引号,进而无法使用awk,故而放到这里,多了一次ssh链接
         ssh  $ip  "cd /update_bak && ls -d $base_dir*|sort -r|cat -n|awk '{print \"-\"\$1\",\"\$NF}' > /tmp/bak_dirs.txt"
                  
         ssh  $ip 'app_dir=www;
         app_base_dir= /app ;
         app_dir=www;
         bak_dir= /update_bak ;
         info_file= /tmp/bak_dirs .txt;     ###以倒序排列记录备份目录的文件
                 
         unset  bak_arr &&  declare  -A bak_arr;     ###定义以(-1,-2,-3)为key,以备份文件名称为value的关联数组
                            
         ###下面的for循环用于给关联数组赋值
         for  in  $( cat  $info_file); do  \
             bak_arr[$( echo  $i| cut  -d  ","  -f 1)]=$( echo  $i| cut  -d  ","  -f 2);
         done ;
 
         echo  -e  "\e[1;33m\n There are ${#bak_arr[@]} old version \n\e[0m" ;
         cat  $info_file| sed  "s/,/)  /" ;     ###显示本台机器上旧版本倒序排列
         echo  -e  "\e[1;33m\n Which one do you want to roolback ?\n Input one of \"-1, -2, -3\"\n \e[0m" ;
         read  INPUT;
 
         ###下面对输入以及目录存在性做判断
         if  [[ -z  "${bak_arr[$INPUT]}"  ]]; then  \
             echo  -e  "\e[1;31m Your input is wrong !\e[0m" ;
         elif  [[ ! -d  "$bak_dir/${bak_arr[$INPUT]}"  ]]; then  \
             echo  -e  "\e[1;31m  $bak_dir/${bak_arr[$INPUT]} not exist ! \e[0m" ;
         else  \
             ###执行回滚操作
             cd  $bak_dir/${bak_arr[$INPUT]};
             rsync  -av --delete ./  $app_base_dir/$app_dir/ --exclude  "xxx"  --exclude  "xxx/xxx"
         fi '
         check  "$ip rollback" ;
         echo  -e  "\e[1;32m\n--------$ip $domain rollback success----------\e[0m"
     done
 
elif  [ $INPUT =  "Q"  ];  then 
     echo  -e  "\n -----bye bye-----"
     exit  0
else
     exit  1
fi

以下是使用截图

备份:

wKioL1gGPgyDampGAAE5CqwJal0744.png

更新:

wKioL1gGPg_wDzGYAAQhUT8Q5c8342.png

回滚:

wKioL1gGQDbwArVVAAJ9j0xfRtM862.png





     本文转自kai404 51CTO博客,原文链接:http://blog.51cto.com/kaifly/1717650,如需转载请自行联系原作者

相关文章
|
2月前
|
JavaScript 前端开发 持续交付
实际工作中 Git Commit 代码提交规范是什么样的?
实际工作中 Git Commit 代码提交规范是什么样的?
115 7
|
2月前
|
网络安全 开发工具 git
Git仓库创建与代码上传指南
本教程介绍了将本地项目推送到远程Git仓库的完整流程,包括初始化本地仓库、添加和提交文件、创建远程仓库、关联远程地址及推送代码。同时,还提供了`.gitignore`配置、分支管理等可选步骤,并针对常见问题(如认证失败、分支不匹配、大文件处理及推送冲突)给出了解决方案。适合初学者快速上手Git版本控制。
|
1月前
|
开发工具 git 索引
如何使用Git的暂存区来管理代码更改?
如何使用Git的暂存区来管理代码更改?
293 0
|
11月前
|
IDE 网络安全 开发工具
【Azure App Service】Local Git App Service的仓库代码遇见卡住不Clone代码的问题
【Azure App Service】Local Git App Service的仓库代码遇见卡住不Clone代码的问题
120 1
【Azure App Service】Local Git App Service的仓库代码遇见卡住不Clone代码的问题
|
6月前
|
Devops Shell 网络安全
git使用之如何将一套代码同时推送至github|gitee|gitcode|gitlab等多个仓库-含添加ssh-优雅草央千澈完美解决-提供整体提交代码
git使用之如何将一套代码同时推送至github|gitee|gitcode|gitlab等多个仓库-含添加ssh-优雅草央千澈完美解决-提供整体提交代码
272 16
git使用之如何将一套代码同时推送至github|gitee|gitcode|gitlab等多个仓库-含添加ssh-优雅草央千澈完美解决-提供整体提交代码
|
8月前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
300 2
|
9月前
|
开发工具 git
git如何修改提交代码时的名字和邮箱?
git如何修改提交代码时的名字和邮箱?
2106 4
|
9月前
|
Java Linux 开发工具
IDEA中git提交前如何关闭code analysis以及开启格式化代码
【10月更文挑战第12天】本文介绍了在 IntelliJ IDEA 中关闭代码分析和开启代码格式化的步骤。关闭代码分析可通过取消默认启用检查或针对特定规则进行调整实现,同时可通过设置 VCS 静默模式在提交时跳过检查。开启代码格式化则需在 `Settings` 中配置 `Code Style` 规则,并通过创建 Git 钩子实现提交前自动格式化。
2791 3
|
10月前
|
Shell 网络安全 开发工具
git与gitee结合使用,提交代码,文件到远程仓库
本文介绍了如何将Git与Gitee结合使用来提交代码文件到远程仓库。内容涵盖了Git的安装和环境变量配置、SSH公钥的生成和配置、在Gitee上创建仓库、设置Git的全局用户信息、初始化本地仓库、添加远程仓库地址、提交文件和推送到远程仓库的步骤。此外,还提供了如何克隆远程仓库到本地的命令。
git与gitee结合使用,提交代码,文件到远程仓库
|
9月前
|
JavaScript 前端开发 开发工具
一身反骨的我,用--no-verify绕开了git代码提交限制!
【10月更文挑战第7天】一身反骨的我,用--no-verify绕开了git代码提交限制!
663 0