Git钩子触发的脚本无效
背景:
接触了GitBook之后,发现这个服务用来记录一些知识点非常适合,还能导出成HTML、PDF等其他文件格式,保存起来非常方便,但是官方的服务毕竟在国外,访问起来总会遇到各种问题,就想在自己的服务器上也部署一个相关服务,碰巧之前在CentOS上已经部署了Gogs,再部署一个GitBook,简直天作之合。Gogs用来存储内容,即每个文章的md文件,而GitBook用来生成Html静态文件,通过服务器部署,即可在线浏览文章。而其中核心点就是Gogs支持Git钩子(Git Hooks),在本地编辑完文章,直接推送到Gogs的仓库,通过Git钩子触发构建脚本,把md文件生成html文件到web目录,中间无需二次介入。
构建脚本:
构建脚本如下:
#!/bin/sh
. /home/git/gogs-repositories/tedxiong/gitbook.git/hooks/update-gitbook
. /home/git/gogs-repositories/tedxiong/gitbook.git/hooks/gitbook-build
update-gitbook的作用在于拉取远程仓库信息,获取到最新的文章,内容如下:
#!/bin/sh
unset GIT_DIR
DATE=$(date +%Y-%m-%d-%H:%M)
DIR_ONE=/home/git/GitJob/GitBook/
cd $DIR_ONE
echo "exec git pull in " `pwd` "@" $DATE >> /home/git/test.txt
git pull origin master
gitbook-build的作用在于最新文章拉取完成后,执行gitbook build生成静态文件,内容如下:
#!/bin/sh
DATE=$(date +%Y-%m-%d-%H:%M)
DIR_ONE=/home/git/GitJob/
cd $DIR_ONE
gitbook build GitBook /usr/local/nginx/html/gitbook --log disabled
echo "gitbook build in" `pwd` "@" $DATE >> /home/git/test.txt
#echo "path is " $PATH "=================" >> /home/git/test.txt
真正执行的命令,每个脚本只有一条,其他的内容是为了生成日志,协助定位问题,也正是这些日志帮我定位出来了问题。
问题:
本次遇到的问题就是在Git Hooks执行的自定义脚本中,有部分命令不执行。简单的命令比如echo,cd都没有问题
具体现象:
update-gitbook脚本执行正常,只有gitbook-build脚本执行之后没有效果,最新的静态文件没有生成。
定位问题:
通过Gogs查看Hooks日志,位置在/home/git/gogs/log/hooks/*.log
,具体名称跟使用的Git钩子有关,比如我是用的是post-receive,
即在推送完成之后执行,那么日志文件名称就是post-receive.log。在日志中显示错误码为127,在Linux中127代表的是command not found
,即命令没找到。纳尼?gitbook命令找不到?我把相关命令都添加到/etc/profile中了呀,并且在Gogs运行的Git用户下执行gitbook没有问题的啊!!!灵机一动,你不是找不到吗,我写gitbook的绝对路径,你肯定能找到了吧。完成后再实验一次,127错误码没有了,反而成了1,也就是命令依旧没有生效,并且错误退出了。这个错误,还不如127呢!!!
说明绝对路径是不行的,不是找不到命令么,我就看看你能找到什么命令,通过
echo "path is " $PATH "=================" >> /home/git/test.txt
一看,输出的内容为:
path is /usr/local/git/libexec/git-core:/usr/local/git/libexec/git-core:/sbin:/usr/sbin:/bin:/usr/bin =================
妹的,原来你只能找到这些路径下的,那些自定义的环境变量并不在其中,这里好奇一下,为什么?同样是Git用户,为啥在终端里和在Gogs里看到的环境变量不一样呢?
解决问题:
既然你到不了我这里,我就到你那里去,一条命令解决问题:
ln -s /usr/local/node-v6.11.1/bin/* /usr/sbin/
收获:
这个问题困扰了我很久,将近一天时间。主要还是对Linux不熟,其次是不知道分析错误日志,企图在网上直接寻找解决方案。
本作品由TedXiong采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。