GitHub / GitLab 的 Webhooks 进行网站自动化部署

这世界上没有什么一步登天的幸福,你唯一可以创造未来的方式,就是脚踏实地向前走。

一直没写这个东西,今天阅兵完第一天上班,整天处于神游状态,想想还是弄点啥,把这个折腾出来然后更新博客还是可以的,最终做到的效果就是,每当有新的 commit pushmaster 分支的时候,就自动在服务器上进行 git pull 拉取最新的代码,来更新我的博客

一、web hooks

1.1 过程

流程
可以看到使用了 webhooks 之后明显省去了上机器手动 PULL 的过程

1.2 脚本

这个脚本的目的在于能够处理 github/gitlab 因 push event 产生的一个 HTTP POST 请求,而后触发一系列操作,在我这个场景里,就是 pull 代码即可,当然也可以完成其他事情

我是 PHP 的脚本来完成的,本身不会 PHP,花了点时间弄这个脚本,主要机器上跑的 LNMP 的架构,所以 PHP 省事,不用安装其他东西,而且找了很多网上的脚本已不能用了,看了看 github 发送 post 请求的参数在变化了,所以如果不可用,请根据 github 官方的 request 里的内容来修改脚本,当然组合可以很多,有人用 nginx + lua 的,还有 flask 的,还有 nodejs 的,当然了,只要能处理 POST 请求,无所谓哪种,看个人喜好而已。

脚本如下:

<?php
// Set Variables
$LOG_FILE = dirname(__FILE__).'</path/log/hook_result.log>';
$LOCAL_ROOT = "</path/blog?";
$LOCAL_REPO_NAME = "<repo_name>";
$LOCAL_REPO = "{$LOCAL_ROOT}/{$LOCAL_REPO_NAME}";
$REMOTE_REPO = "git@github.com:<username>/<username>.github.io.git";
$BRANCH = "master";

// json decode info from Github
$info = json_decode(file_get_contents("php://input"), true);
$hooks_username = $info['commits'][0]['author']['username'];

// 验证来源
if ($hooks_username == '<username>') {
echo "ok";
// 判断本地仓库是否存在,并且分支匹配
$branch = explode('/', $info['ref']);
if( is_dir($LOCAL_REPO.'/.git') && $branch[2] == $BRANCH ) {

//exec command
$pull_cmd = "cd {$LOCAL_REPO} && sudo git pull";
exec($pull_cmd, $array);
print_r($array);

//write log
file_put_contents($LOG_FILE, date("[Y-m-d H:i:s]")." success pull: ".$_SERVER['REMOTE_ADDR']."\n", FILE_APPEND|LOCK_EX);
}

} else {
echo "not ok";
// If the repo does not exist, then clone it into the parent directory
$clone_cmd = "cd {$LOCAL_ROOT} && sudo git clone {$REMOTE_REPO}";
exec($clone_cmd);
file_put_contents($LOG_FILE, date("[Y-m-d H:i:s]")." invalid access: ".$_SERVER['REMOTE_ADDR']."\n", FILE_APPEND|LOCK_EX);
}

?>

请将 <> 里的内容修改为自己的实际路径,另外,因为我 PHP 进程启动的用户是不能去执行 git pull 的,请放开 PHP 配置文件里的 disable_function 以及检查是否有权限进行同步,否则报错,在 github response 上没法看到,纠结了很久

另外,请保证这个 PHP 文件能被访问到,如 http://x.x.x.x./test_hooks.php 这个请求地址待会就是我们要通过 github 发送 POST 请求的地址

1.3 github 设置

1、项目里新增一个 webhooks
add hooks

2、查看 http request
request

3、每次发送请求得到的 response
resault

到此,每次像 github 中推送更新就可以完成整个 webhooks 的流程

每次推送更新查看服务器日志,有如下的日志表示推送成功

192.30.252.41 - - [11/Sep/2015:10:10:16 +0800] "POST /test_hooks.php HTTP/1.1" 200 5 "-" "GitHub-Hookshot/66235e3" -

然后可以查看 github 上的 webhooks 日志,这里的信息是刚才上面的 PHP 定义的

result

  

参考阅读