Pages

Friday, 29 December 2017

使用git自动部署web文件

通过 git 提交代码自动部署到演示站这样的功能, 之前粗略的查了下资料了解了大概, 今天偶然需要用到这个功能, 网上查了下资料, 实现了下.
一开始想 "客户端提交 ->web 目录" 这样实现, 但是发现 git 仓库文件貌似不是直接储存的, 网上找了些资料几乎都是 "客户端提交 -> 远程仓库触发 hook->web 目录下再拉取一次" 这样的方法.
首先安装 git 创建 git 用户, 然后再设置一个远程仓库, 这样一个 git 仓库, 然后切换到 web 目录内 clone 一下远程仓库的代码
apt-get install git -y #安装git
#创建git用户,写公钥文件到git用户 
adduser git
su - git
mkdir .ssh
echo "你的公钥" > authorized_keys
#创建仓库
mkdir yaf.git && cd yaf
git --bare init
#至此一个仓库就建好了
#换个文件夹尝试克隆仓库
cd ~ && git clone yaf.git #这步无错误就说明此仓库可以正常使用了 
然后将刚刚克隆的目录内的所有文件复制到你的 web 目录下, 这样会有代码冲突, 解决的方法我也不知道, 我是新建的一个目录, 代码克隆之后直接用的新目录作为 web 目录
下面是关键了, 网上查询资料发现每次提交代码时会触发 hook 目录下 post-receive 文件, 先尝试在里面写
#/bin/bash
cd /data/wwwroot/yaf && git pull origin/master
结果发现不会正常执行, 里面加入echo "1234445" > /home/git/123.txt发现 1234445 可以被正常写出到文件手动执行 post-receive 却可以正常拉取文件, 一开始怀疑权限问题, 仔细检查每个目录和文件的权限均无异常, 最后网上找来各种说明和示例, 大部分不可用, 最后在 csdn 上找到了一个脚本可以正常执行看起来作者是 embbnux, 但估计被 copy 了无数次, 不一定是真正作者, 总之能用就行.
#/bin/sh

IS_BARE=$(git rev-parse --is-bare-repository)  
if [ -z "$IS_BARE" ]; then  
echo >&2 "fatal: post-receive: IS_NOT_BARE"  
exit 1  
fi  
   
unset GIT_DIR  
DeployPath="/var/web"  #你的web目录,绝对路径
   
echo "==============================================="  
cd $DeployPath  
echo "deploying the test web"  

git fetch --all  
git reset --hard origin/master  
   
time=`date`  
echo "web server pull at webserver at time: $time."  
echo "================================================"  
这个脚本我第一次跑没成功的, 原因是第一次 web 目录还没有克隆过远程仓库, 没有远程仓库的地址, web 目录需要克隆下远程仓库或者添加远程仓库的地址为 origin 才可以.
注意权限问题, post-receive 需要设置成 www 用户, 如果你不需要直接修改 web 目录下的文件则使用 git 用户便可.
另外说下其他机器提交代码时仓库地址,git@192.168.10.127:yaf.git,git 就是刚才创建的 git 用户, 192.168.10.127 就是服务器的 ip, 换成域名也行, yaf.git 则是路径, git 用户的目录是 / home/git, 仓库的目录是 / home/git/yaf.git, 所以这里的: yaf.git 换成:/home/git/yaf.git 也可以.

No comments:

Post a Comment