公司开发团队使用码云版本管理,近期开发新的网站,要使用码云的webhooks版本自动推送功能,其实以前配置开发过,但没有记录操作过程和相关代码,这次又耗费了几个小时才配置开发好,感觉这些操作过程需要记录下来以备后用,也感觉有共享的价值,所以写这篇文章介绍相关经验。
新的网站用php框架thinkphp5.1开发,所以相关代码也是thinkphp5.1的。
首先,要测试服务器的php用户,可以用代码echo exec('whoami')获取php网页的用户,有的用户名是apache,有的用户名是www,把.git文件夹下的文件FETCH_HEAD的用户组归属者修改为现有的用户名apache或www,如果exec函数不可用,要修改php.ini,先在php.ini里找到php.ini里面的disable_functions = exec , popen, system …然后把这个里面的exec去掉,如果其中有shell_exec也去掉,后面的代码有用,最后再重启下apache或nginx就可以用了。
然后,检查服务器的php用户在服务器的git是否可以做git pull操作,如果不能,需要在php用户的名下重新生成公钥,把公钥加入码云的设置里的公钥列表,重新克隆码云的版本,shell脚本是:git clone git@gitee.com:xxx/xxx.git xxx。
然后,在网站代码的文件夹application下创建文件夹webhooks,在webhooks下创建文件夹controller,在controller下创建网页Index.php,在Index.php里加入如下代码:
<?php
namespace app\webhooks\controller;
use think\Controller;
class Index extends Controller{
public function index(){
//git webhook 自动部署脚本
//项目存放物理路径,第一次clone时,必须保证该目录为空
$savePath = "/www/wwwroot/xxx";
$gitPath = "git@gitee.com:xxx/xxx.git";//代码仓库
$email = "xxx@xxx.com";//用户仓库邮箱
$name = "xxx";//仓库用户名,一般和邮箱一致即可
$isClone = true;//设置是否已经Clone到本地,true:已经clone,直接pull,false:先clone.
//如果已经clone过,则直接拉去代码
if ($isClone) {
$requestBody = file_get_contents("php://input");
if (empty($requestBody)) {
die('send fail');
}
//解析Git服务器通知过来的JSON信息
$content = json_decode($requestBody, true);
//$str='|'.$content['ref'].'--'.$content['total_commits_count'];
//file_put_contents("git-webhook_log.txt",$str, FILE_APPEND);
//若是主分支且提交数大于0
if ($content['ref']=='refs/heads/master' && $content['total_commits_count']>0) {
shell_exec("cd {$savePath} && git pull {$gitPath} 2>&1");//拉代码
/* $res = PHP_EOL."pull start --------".PHP_EOL;
$res .= shell_exec("cd {$savePath} && git pull {$gitPath}");//拉去代码
$res_log = '-------------------------'.PHP_EOL;
$res_log .= $content['user_name'] . ' 在' . date('Y-m-d H:i:s') . '向' . $content['repository']['name'] . '项目的' . $content['ref'] . '分支push了';
$res_log .= $content['total_commits_count'] . '个commit:';
$res_log .= $res.PHP_EOL;
$res_log .= "pull end --------".PHP_EOL;
file_put_contents("git-webhook_log.txt", $res_log, FILE_APPEND);//写入日志到log文件中*/
}
}
/*else {
$res = "clone start --------".PHP_EOL;
//注:在这里需要设置用户邮箱和用户名,不然后面无法拉去代码
$res .= shell_exec("git config --global user.email {$email}}").PHP_EOL;
$res .= shell_exec("git config --global user.name {$name}}").PHP_EOL;
$res .= shell_exec("git clone {$gitPath} {$savePath}").PHP_EOL;
$res .= "clone end --------".PHP_EOL;
file_put_contents("git-webhook_log.txt", $res, FILE_APPEND);//写入日志到log文件中
}*/
}
}
然后,到码云配置webhooks参数,把上一步创建的Index.php运转路径加入webhooks参数的url,如果要加上密码,那需要到Index.php加上密码验证,参数加好了,就可以测试了。
测试也可以修改网页直接运转网页,$result= shell_exec("cd {$savePath} && git pull {$gitPath} 2>&1");var_dump($result);,加入了2>&1,$result可以获取报错信息。
网友评论