曹逸君 Blog

11月 10, 2013

git hooks 自动部署网站

git的hook提供了非常大得自由度。 有commit发邮件啦。push后更新网站啦。做测试啦。无所不能。 所谓hook就是.git/hooks目录下得各种脚本。根据名字分别在不同情况下由git调用。这里post-receives是接收push结束后触发。

.git/hooks/post-receive

1
2
3
4
5
6
7
8
9
#!/bin/sh
echo 'auto deploy'
git --git-dir=/path/blog.git/ --work-tree=/webroot/blog reset --hard
STAT=$?
if [ $STAT -eq 0 ]; then
    echo 'deployed!'
else
    echo "=口= something went wrong. $STAT"
fi

说起来被shell脚本坑了一道。[ $STAT -eq 0 ][$STAT -eq 0]是不一样的。

字符串比较和数字比较是不一样的。表达式还有圆括号、方框号、双圆括号、双方框号之分。

虽说shell script很不习惯,也可以用Python等其他脚本语言,但直接写命令进去还是最符合平时在shell中的操作。

比较有意思的是这句。git --git-dir=/path/blog.git/ --work-tree=/webroot/blog reset --hard

我得工作流是笔记本写好博文,生成静态文件,git commit然后push到服务器的bare仓库。通过bare仓库得钩子将文件更新到webroot。

因为webroot目录不是git仓库,所以就采取了这种以真正得git仓库为仓库(git-dir),把工作目录(work-tree)定为webroot然后reset的这种暴力方式。

如果你想,其实把webroot作为git得work-tree目录也行。要更直接。连hook都不用写了。

为什么不用rsync或者Capistrano?=。= 纯粹是因为懒。

当我只需要一个简单得更新文件得时候,不想牵扯到更多东西,既然git写个hook可以搞定,以后还可以随意扩展,就不想增加复杂性了。