樂猪先生

在Coding上部署WebHook

2017-09-10

今天在家没事部署了一个自己的业余项目,代码托管目前用的是Coding。想着试一下WebHook吧。以为挺简单的东西,没想到配置的过程中遇到了一些坑。

第一步

需要生成一个服务器的部署公钥,然后在在Coding网站填写生成的公钥。

1
sudo -Hu www ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

这样就会在/home/www下的.ssh生成一对公私钥。然后叫公钥(id_rsa.pub)复制到Coding的后台。

部署公钥

第二步

克隆项目到WEB目录下,我服务器上的web目录为/srv/code,所以执行下面的命令

1
2
cd /srv/code
sudo -u www git clone git@git.coding.net/yourAccount/yourRepoName

上面的第二条命令很关键,我就掉了这个坑。-u参数指定了使用Web服务器的执行用户,不然当Coding发送push请求的时候会因为没有权限而导致pull不下来。我之前是直接root用户登录上去的,然后直接用root克隆下来的仓库。但是网上也有解决办法,但是使用-u参数来克隆仓库是最简单的。

第三步

最后一步就是准备钩子文件了。首先在web目录下生成一个webhook.php文件。然后具体代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php

error_reporting(1);

$target = '/srv/code/MongoDB'; // 生产环境web目录
$token = 'xxx';
//$wwwUser = 'www';
//$wwwGroup = 'www';

$json = json_decode(file_get_contents('php://input'), true);
if (empty($json['token']) || $json['token'] !== $token) {
exit('error request');
}
//$repo = $json['repository']['name'];
//$dir = __DIR__ . '/repos/' . $repo;

$cmds = array(
"cd $target && git pull",
/*
"cd $dir && git pull",
"rm -rf $target/* && cp -r $dir/* $target/",
"chown -R {$wwwUser}:{$wwwGroup} $target/",
*/
);

foreach ($cmds as $cmd) {
shell_exec($cmd);
}

这个文件参考了安正超博客但是去掉了一些多余的部分。就是因为上面我使用了-u参数,所有我不需要在使用chown来重新更新所属用户和所属组了。

最后的最后就是在本地git add . && git commit && git push稍等一会不出意外的话就可以正常同步到服务器端了。