利用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

至此配置自动部署终于告一段落了。


CashQian Blog

欢迎来到我的个人博客网站

友情链接

Powered by Python Blog. Copyright © 2016.

www.cashqian.net. All rights reserved.