测试服务器 SVN 生产环境,通过 post-commit 钩子调用 Git 自动备份

版权声明:Max Sky 原创文章,转载时请保留所有权并以超链接形式标明文章出处。否则将追究相关法律责任。 https://blog.csdn.net/maxsky/article/details/80458655

折腾一个晚上,令人窒息的操作诞生了!

服务器:阿里云 ECS
VCS:SVN

端口的开放是必不可少的,配置安全组内的规则即可

在此之前我仅会通过配置钩子在提交代码时自动部署/发布到 Web 环境中

保险起见,为了更好的存储代码,就突发奇想的弄了一个这玩意儿

开发人员 => SVN 提交代码到服务器 => 钩子自动部署 Web => Git 提交并推送到码云

简直是完美的操作…

结果踩坑无数


首先搭建好 SVN 环境,这没什么难的(CentOS 7) yum install subversion

也就是那几个文件 passwdauthzsvnserv.conf 的配置,百度了解一下。弄完记得设置个自启妥妥的

完成后码云新建 Git 项目(空的最好),接着在你的 Web 目录中 clone 一下

注意:如果此时在服务器上已经部署代码并开启 SVN 版本控制,需要在项目 Web 目录中执行 git initgit remote add origin Git地址

然后什么也不用做【所以空项目最好嘛】

SVN 的文件属性忽略调整一下,Git 的 .gitignore 配置好

服务器端各自提交/推送一手让 SVN/Git 代码同步。

好,撸钩子,戳开版本库 hooks 目录,post-commit.tmpl 复制一份为 post-commit 并赋予其执行权限,chmod +x post-commit

打开此文件,除开注释内容是这样:

REPOS="$1"
REV="$2"
TXN_NAME="$3"

mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf

开始改造,删除最后一行并添加代码如下:

REPOS="$1" # 版本库路径
REV="$2" # 提交的修订号
TXN_NAME="$3" # 事务名称

PROJECT_DIR1="/var/www/wwwroot/xxx.com" # 项目目录自行调整,之所以写了个 1 怕有多个项目需要如此操作
export LANG=zh_CN.UTF-8 # Emm,编码
CURDATE=`date` # 取一下当前时间
echo "自动部署:$CURDATE,库:$REPOS,版本:$REV,事务号:$TXN_NAME" >> /var/log/svn/code_deploy.log # 手动写日志,注意目录需要自己创建

# 这儿是重点,我将命令提出来了,因为注释说最好是提出来,当然写在这个文件里也没毛病

# 之所以用到了 root,因为...我之前的 Git 配置都是用 root 用户配置的
# 所以必须要切换至 root 用户,不然提示你没有配置邮箱、名称、保存密码方式等等,导致无法提交/推送到码云

# 这儿我们可以看到我直接调用了 /opt 目录下的 post-git.sh 脚本
su - root -s /bin/bash /opt/post-git.sh

post-git.sh 内容:

#!/bin/sh

PROJECT_DIR1="/var/www/wwwroot/xxx.com" # 同上
export LANG=zh_CN.UTF-8 # 同上

svn update $PROJECT_DIR1 --quiet --username SVN用户名 --password SVN密码
# 注意这儿连着三行我都写了输出,s.log 是成功输出(有 2 别看漏了),f.log 是失败输出
# 如果调试自动 Git 备份代码未成功,通过这里的日志可以很方便的查阅到

# 移动到项目目录
cd $PROJECT_DIR1 >> /var/log/svn/s.log 2>> /var/log/svn/f.log
# 不用 git add . 了,直接 git commit -a,写一句备注就行
git commit -am '生产环境代码同步/备份' >> /var/log/svn/s.log 2>> /var/log/svn/f.log
# 推送走你
git push >> /var/log/svn/s.log 2>> /var/log/svn/f.log
修改 SVN 用户、钩子等信息不用重启 SVN 服务端
所以,直接测试吧

客户端 svn checkout 一份代码出来,随便改个东西提交试试!


PS:如果 Git 一直需要输入用户和密码,戳一下这个 git config --global credential.helper store 即可存储

猜你喜欢

转载自blog.csdn.net/maxsky/article/details/80458655
今日推荐