利用git勾子函数实现本地代码部署到服务器

记录一下如何在搬瓦工建一个 git 服务器,再利用勾子函数实现每次 push 代码后自动将代码部署到站点目录。

实际目的是我在本地写了个项目, 首先需要一个 git 仓库存放代码, 自然而然想到, 上传代码之后怎么上到服务器去呢?手动传多麻烦啊, 有没有每次我 push 代码 都自动部署到服务器上的方法呢?

答案是肯定的, 下面我们来一步一步配置。

安装和配置 git

查看一下 git 版本

如果没有安装 git, 请移驾新 CentOS 开发环境搭建参考安装一下

1
$ git --version

创建 git 用户, 并授权

创建 git 用户,根据提示设置密码

1
$ adduser git

赋予 git 用户 sudo 权限

1
2
$ chmod 740 /etc/sudoers
$ vim /etc/sudoers

找到以下内容 并添加

1
2
3
4
# User privilege specification
root ALL=(ALL:ALL) ALL
/** 以下是添加内容 **/
git ALL=(ALL:ALL) ALL

保存退出后,修改回文件权限 chmod 440 /etc/sudoers

初始化 git 仓库

切换到 git 用户并创建对应目录

1
2
3
4
5
$ su git
$ cd /home/git
$ mkdir dewhome.git
$ cd dewhome.git
$ git init --bare // 创建裸仓库

root 模式下 设置 git 密码

1
passwd git 密码

创建网站目录

1
2
$ cd /home/wwwroot
$ mkdir www.dewhome.cn

查看用户权限 确保dewhome.git、www.dewhome.cn目录用户组权限全是git:git

1
2
$ ll /home/git/dewhome.git
$ ll /home/wwwroot/www.dewhome.cn

如果不是 git:git 权限, 执行下列命令

1
2
$ sudo chown git:git -R /home/git/dewhome.git
$ sudo chown git:git -R /home/wwwroot/www.dewhome.cn

配置 Git Hooks

创建 post-receive 文件

git 用户执行:

1
2
$ cd /home/git/dewhome.git/hooks
$ vim post-receive

注意:不要直接用自带编辑器打开 post-receive 文件 copy 进去了事, 最好手打。会有莫名 bug,应该跟 window 下编辑器保存格式有关。

编辑 post-receive 文件:

1
2
3
4
5
6
7
8
#!/bin/bash
GIT_REPO=/home/git/dewhome.git
TMP_GIT_CLONE=/tmp/dewhome
PUBLIC_WWW=/home/wwwroot/www.dewhome.cn
rm -rf ${TMP_GIT_CLONE}
git clone ${GIT_REPO} ${TMP_GIT_CLONE}
rm -rf ${PUBLIC_WWW}/*
cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}

最后保存退出,赋予文件执行权限chmod +x post-receive

本地 clone 项目

1
$ git clone ssh://git@IP:Port/home/git/dewhome.git