Lucifaer's Blog.

Git Hooks实现项目的自动部署

Word count: 898 / Reading time: 4 min
2018/02/28 Share

最近把自己的wiki重新更新了一下版本,正好以前的服务器到期,把新版本的wiki迁移到新的服务器上,顺手把之前配置的代码自动部署的过程记录下来。

实现项目的自动部署,最简便的方法就是利用git hooks这个方法。

0x00 什么是git hooks

简单来理解一下,就是一个可以hookgit操作,根据git操作来处理之后动作的触发式自定义脚本。

git hooks有两种类型的钩子:客户端和服务端。

客户端的钩子有:

  1. pre-commit 钩子在commit前运行
  2. prepare-commit-msg 钩子在启动提交信息编辑器前,默认信息被创建后运行。
  3. post-commit 钩子在commit过程完成后运行,对应着的是git commit之后的操作
  4. applypatch-msg 该钩子将提交信息进行格式化规范,或修正格式错误
  5. pre-applypatchgit am期间运行
  6. post-applypatch 运行于提交后产生,是在git am运行期间最后被调用的钩子
  7. pre-rewrite 钩子被那些会替换提交记录的命令调用
  8. post-checkoutgit checkout成功运行后调用
  9. post-mergegit merge成功运行后调用
  10. pre-pushgit push运行期间,更新了远程引用但尚未传送对象时被调用
  11. pre-auto-gc 在垃圾回收前被调用

服务端的钩子有:

  1. pre-receive 处理来自客户端的推送操作时最先被调用
  2. update 它会为每一个准备更新的分支各运行一次
  3. post-receive 在整个过程完成以后运行,可以用来更新其他系统服务或者通知用户

0x01 使用git hooks

所有的钩子脚本都存放在.git/hooks目录中。当使用git init初始化一个新仓库时,Git默认会子啊这个目录中放置一些示例脚本。这些示例的名字都是以.simple结尾的,如果你想启用他们,首先要移除该后缀,或者重新创建该文件。

服务端部署

在服务端部署远程仓库,使用的是git init --bare

1
2
3
$ mkdir D0g3_wiki.git
$ cd D0g3_wiki.git/
$ git init --bare

效果如图:

之后需要我们要在/hooks/下创建post-receive,并写一段shell脚本来自定义我们需要post-receive钩子完成的自定义任务:

post-receive

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/sh
GIT_REPO=/root/D0g3_wiki.git
TMP_GIT_CLONE=/tmp/D0g3_wiki
PUBLIC_WWW=/home/lucifaer

echo "init receive"
rm -rf $TMP_GIT_CLONE
if [ -d $PUBLIC_WWW ]; then
mkdir -p $PUBLIC_WWW
fi

git clone $GIT_REPO $TMP_GIT_CLONE
# sudo rm -rf /srv/http/hack_web/hack_web
# sudo cp -r $TMP_GIT_CLONE/hack_web $PUBLIC_WWW
#if [[ $EUID -eq 0 ]]; then
rsync -av $TMP_GIT_CLONE $PUBLIC_WWW
chown -R lucifaer:lucifaer $PUBLIC_WWW
#fi
rm -rf $TMP_GIT_CLONE

这里是利用了rsync命令来完成远程数据同步,并设定了同步目录为/home/lucifaer

完成了shell脚本的编辑后,给该脚本添加可执行权限:

1
$ chmod +x post-receive

至此完成了服务端的部署。

客户端部署

客户端并不需要特别的部署什么样的环境,只需要将需要给需要同步的项目建立仓库,并设置remote源就好了。

比如我要将本地的secspider项目同步到服务端:

首先给该项目建立本地仓库:

1
2
3
4
$ cd secspider
$ git init .
$ git add .
$ git commit -m "test git hooks"

之后添加remote源:

1
2
$ git remote add nick_name user@ip:/gitrepo_dir
$ git push nick_name master

这里的nick_name、user、ip设置成自己的名字。

便同步成功了。

CATALOG
  1. 1. 0x00 什么是git hooks
  2. 2. 0x01 使用git hooks
    1. 2.1. 服务端部署
    2. 2.2. 客户端部署