利用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
至此配置自动部署终于告一段落了。