利用git hook自动化部署程序遇到的问题
利用git hook功能自动化部署程序在网上已经有很多文章介绍过了,简述如下:
在服务器上建立一个远程中转裸仓库,假设路径为 ~/repos ,仓库名为 WEBAPP 。
git init --bare WEBAPP.git
再切换到部署目录,假设为 ~/WEBAPP 。
git init
git remote add origin ~/repos/WEBAPP.git
git pull origin master
切换到目录 ~/repos/WEBAPP.git/hooks ,编辑 post-receive 文件内容,加入部署shell脚本,大致如下:
#!/bin/sh
unset GIT_DIR
NowPath=`pwd`
echo "Now path is :"$NowPath
DeployPath="/home/USER/WEBAPP" # 使用绝对路径
echo "Deploy path is :"$DeployPath
cd $DeployPath
echo "cd deploy path"
git add . -A && git stash # 丢弃所有的本地更改,这条可以看情况使用
git pull origin master
echo "Deploy done"
cd $NowPath
echo "Restart WEBAPP"
echo "PASSWORD" | sudo -S supervisorctl stop WEBAPP
echo "PASSWORD" | sudo -S supervisorctl start WEBAPP
echo "Finish"
exit 0
使用 chmod +x post-receive 加入可执行权限后,服务器端的配置就基本完成了。
在本地代码仓库加入remote地址
git remote add prod USER@SEVER:~/repos/WEBAPP.git
然后在部署的时候只需要 git push prod master ,就可以了。
我的应用使用supervisor来管理,所以在脚本最后加入了重启相关应用的代码,但是执行supervisor需要提权,所以使用sudo命令。
从这里开始坑就出现了,首先单单使用sudo的话,在本地push时系统提示:
sudo:抱歉,您必须拥有一个终端来执行 sudo
google之后发现需要编辑 /etc/sudoers 文件,在该文件中将 Default requiretty 注释掉。
注意编辑 /etc/sudoers 文件需要使用 visudo 命令。
之后他又提示:
sudo:没有终端存在,且未指定 askpass 程序
然后再Google,发现有人说需要在sudo之后加上-S参数,会在终端提示用户输入密码。
加上之后,在终端提示你输入密码时一晃而过,根本没时间给你输入密码。。。 之后又试了很多方法都未果,最后只好将密码写在shell脚本里,用管道传给sudo,于是就成了以上可见的最终版脚本了。
为了安全起见,修改post-receive的权限,只允许拥有者有读写执行的权限。
chmod 700 post-receive
至此配置自动部署终于告一段落了。