Hi!请登陆

通过Git钩子实现网站的自动发布

2020-10-27 51 10/27

如果需要Git服务器的安装配置可以在本站搜索,之前的文章有写过.

Git 钩子安装:

Git 钩子存在于每个 Git 仓库的./hooks目录中. 当你用 git init 初始化一个新版本库时,Git 默认会在这个目录中放置一些示例脚本.所有的示例都是 shell 脚本,其中一些还混杂了 Perl 代码,不过,任何正确命名的可执行脚本都可以正常使用,你可以用 Ruby 或 Python,或其它语言编写它们.

hooks git:(master) ls
applypatch-msg.sample     pre-applypatch.sample     pre-rebase.sample
commit-msg.sample         pre-commit.sample         prepare-commit-msg.sample
post-update.sample        pre-push.sample           update.sample

.sample拓展名是为了防止它们默认被执行,安装一个钩子只需要去掉.sample拓展名即可.

Git 钩子的作用域:

Git 钩子是对本地仓库相关操作影响,对于任何 Git 仓库来说钩子都是本地的,初始的钩子都是从 Git 默认模板目录中自动安装.

Git 钩子进行自动部署:

如何实现 Git 钩子进行自动部署,其实原理很简单,我们只需要监听每次本地 git push到远程服务器,然后远程服务器同步拉取最新文件.

1.在服务器初始化一个远程 Git 裸仓库 (git init –bare)

裸仓库与 git init 初使化的仓库不太一样,裸仓库其实相当于通过克隆来的仓库里的.git文件夹,整个裸仓库中只有git索引(index),不包含工作目录.要实现 Push to Deploy,首先我们需要一个裸仓库,进入/data/gitroot/,创建如下:

git init --bare project.git

或:

mkdir project.git
cd project.git
git init --bare

2.配置 Git Hook:

将目录切换至 /data/gitroot/project.git/hooks,用:

cp post-update.sample post-update

复制并重命名文件后 vim post-update 修改,增加执行脚本:

#!/bin/sh
unset GIT_DIR
cd /home/wwwroot/project/
git pull origin master
#注意: 一定要unset GIT_DIR清除变量, 不然会引起remote: fatal: Not a git repository: '.'错误.

post-update添加执行权限:

chmod 777 post-update
chown git:git post-update
#添加git用户在该脚本的执行权限

3.本地仓库添加 remote 源

本地仓库添加远程仓库源之后,一旦本地仓库变更提交就会触发 Git 钩子,驱动自动部署

git init
git remote add origin [email protected]:22/data/gitroot/project.git
#添加远程仓库源
git push origin master

如果Git协议是ssh则用:

git init
git remote add origin ssh://[email protected]:22/data/gitroot/project.git
git push origin master

踩过的坑:

1./data/gitroot/project.git/hooks/post-update这个脚本一定要git用户可以执行.
2.网站目录一定是git用户可读写的,包括隐藏目录,不要用root用户执行pull之类的操作,文件所有者会变成root.
3.如果钩子脚本没有执行,尝试切换到git用户直接执行/data/gitroot/project.git/hooks/post-update脚本,会看到错误.
4.如果网站内容里有和Git仓库冲突的文件,可使用以下脚本代替:

#!/bin/sh
unset GIT_DIR
cd /home/wwwroot/project/
git fetch --all
git reset --hard origin/master

该脚本会强行覆盖掉本地文件,不提示冲突.
5.不要在服务器修改Git库里有的文件也不要ftp之类上传,如果必须这样操作,记得更新到Git库,否则会提示冲突,用第二个脚本会被直接覆盖掉.
6.如果用脚本执行更新操作,git用户在该服务器必须配置免密登陆,也就是使用证书登陆,git pull的时候不能提示输入密码.(9成教程都没有这个,导致钩子脚本不执行.)
7.网站目录如果改为git用户的权限了,web程序比如nginx,apache的使用用户必须能读写,否则网页无法访问.

Tag:

相关推荐