使用git hooks实现代码自动部署

使用git hooks实现代码自动部署

5 Mar 2019

项目的开发一般有三个环境:本地开发环境、测试环境、生产环境,本地开发完毕后上传代码到测试环境,经测试没问题后部署到生产环境,但是代码传来传去很麻烦,而且多个环境来回上传也容易出错,这时可以利用git自带的hooks,本地代码提交到版本库后,自动同步到测试环境和生产环境,省去很多不必要的麻烦。

 

首先我看看hooks脚本,位于git仓库的hooks目录:

[root@localhost demo]# ll /home/gituser/test/demo.git/hooks/
总用量 48
-rwxr-xr-x. 1 gituser git   452 3月   1 15:02 applypatch-msg.sample
-rwxr-xr-x. 1 gituser git   896 3月   1 15:02 commit-msg.sample
-rwxrwxrwx. 1 gituser git   168 3月   1 15:24 post-receive
-rwxr-xr-x. 1 root    root  389 3月   5 16:14 post-update
-rwxr-xr-x. 1 gituser git   189 3月   1 15:02 post-update.sample
-rwxr-xr-x. 1 gituser git   398 3月   1 15:02 pre-applypatch.sample
-rwxr-xr-x. 1 gituser git  1704 3月   1 15:02 pre-commit.sample
-rwxr-xr-x. 1 gituser git  1239 3月   1 15:02 prepare-commit-msg.sample
-rw-r--r--. 1 gituser git  1348 3月   1 15:02 pre-push.sample
-rwxr-xr-x. 1 gituser git  4951 3月   1 15:02 pre-rebase.sample
-rwxr-xr-x. 1 gituser git  3611 3月   1 15:02 update.sample

这些都是git自带的脚本demo,在这里我们使用post-update这个脚本,复制一份去掉sample后缀

cp /home/gituser/test/demo.git/hooks/post-update.sample /home/gituser/test/demo.git/hooks/post-update

编辑脚本,加入以下内容并保存:

#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".

#exec git update-server-info
unset GIT_DIR
DIR_ONE=/data/wwwroot/demo/ #这里是需要同步代码的目录
cd $DIR_ONE
git pull origin master

当git版本库有更新时,即可自动触发该脚本,拉取最新的代码

 

我们以测试仓库为例,在线上站点目录和本地目录分别下克隆代码:

git clone /home/gituser/test/demo.git

站点目录记得要给git账户权限,否则会报错:"remote: error: cannot open .git/FETCH_HEAD: Permission denied"

git chown -R gituser:git /data/wwwroot/demo/
git chmod -R 777 /data/wwwroot/demo/

这时如果直接在线上环境pull,可能会报以下错误:

来自 /home/gituser/test/demo
 * branch            master     -> FETCH_HEAD
更新 0a3ba4d..dbdc440
error: Your local changes to the following files would be overwritten by merge:
        index.php
Please, commit your changes or stash them before you can merge.
Aborting

这时因为更改权限后,导致版本文件有了改动,需要提交版本:

git add -a
git commit -m "xxx"
git push origin master

然后再拉取正常

另一个本地环境修改代码,然后提交到仓库,再去线上环境看看,代码已经成功同步,搞定!