Description
最近由于想提高代码提交的效率不再git commit && git push 和 svn commit 后每次要去服务器更新代码。
就参考了 分享下使用svn或者git时,测试服务器代码自动更新、线上服务器代码手动更新的配置经验 孟康的文章。没有配置服务器上的文件
svn 用的svn bucket 免费的自带钩子
这个工具比较好的是有钩子请求历史记录。
然后写了项目里的控制器代码:
<?php
namespace app\dev\home;
use think\Controller;
/**
* Svn钩子
* @package app\install\controller
*/
class Svn extends Controller
{
protected function _initialize()
{
define('SVN_TOKEN', 'guihzip');
header("Cache-Control:no-cache,must-revalidate");
}
public function commit()
{
header("Cache-Control:no-cache,must-revalidate");
extract($_POST);
if ($token == SVN_TOKEN) {
switch ($event) {
case 'test':
return 'ok';
break;
case 'start-commit':
return 'ok';
break;
default:
// ptrace($log);
if(stripos($log, '@commit') !== false){
$username = 'XXXXX';
$password = 'XXXXX';
$target_dir = realpath('..');
// ptrace($target_dir);
ini_set('disable_functions', '');
exec("sudo svn up --username {$username} --password {$password} --no-auth-cache {$target_dir} 2>&1", $output, $outresult);
ptrace(implode(PHP_EOL, $output).PHP_EOL.$outresult);
if ($outresult === 0) {
// echo '更新成功!';
//echo print_r($output);
return 'ok';
} else {
// echo '更新失败!';
// echo print_r($output);
return 'failed';
}
}else{
return 'no up';
}
break;
}
} else {
return 'error token';
}
}
}
钩子运行时会报各种没权限,因为我的项目是root clone 出来的。于是查找各种办法,
加入了www 用户组后 执行的svn 命令前面一定要带sudo 就可以了。
接下来是git 用的oschina 后来换名为了 gitee 。
在项目里 新增钩子,咱们只管push的钩子
对应的代码:
<?php
namespace app\dev\home;
use think\Controller;
/**
* Git钩子
* @package app\install\controller
*/
class Git extends Controller
{
protected function _initialize()
{
define('GIT_TOKEN', 'guihzip');
header("Cache-Control:no-cache,must-revalidate");
}
public function push()
{
header("Cache-Control:no-cache,must-revalidate");
// ptrace($_POST);
$rws_post = file_get_contents('php://input');
$_POST = json_decode($rws_post, 1);
// ptrace($_POST);
extract($_POST);
$header = $this->request->header();
// ptrace($header);
$token = $header['x-gitee-token'];
$event = $header['x-gitee-event'];
if ($token == GIT_TOKEN) {
switch ($event) {
case 'test':
return 'ok';
break;
case 'start-commit':
return 'ok';
break;
default:
// ptrace($log);
$log = $head_commit['message'];
if(stripos($log, '@push') !== false){
error_reporting ( E_ALL );
$dir = realpath('..');//该目录为git检出目录
exec("sudo cd {$dir} && git pull origin master 2>&1", $output, $outresult);
ptrace(implode(PHP_EOL, $output).PHP_EOL.$outresult);
if ($outresult === 0) {
// echo '更新成功!';
//echo print_r($output);
return 'ok';
} else {
// echo '更新失败!';
// echo print_r($output);
return 'failed';
}
}else{
return 'no up';
}
break;
}
} else {
return 'error token';
}
}
}
git 遇到的问题:
1) 没有账号密码
2)git pull 说没有指定分支
第一个问题 通过 设置remote url 为带名称 密码的 地址就行 https://www.jianshu.com/p/8020de245f6a
第二个问题 通过 git branch --set-upstream 本地关联远程分支
孟康文章里的 output 不是一个字符串要自行转换。
gitee 里的post不是传统post 7.2 里 全局变量
$rws_post = $GLOBALS['HTTP_RAW_POST_DATA'];
$mypost = json_decode($rws_post,1);
方式 已经获取不到了 必须 file_get_contents('php://input'); 获取
x-gitee-token 在 gitee 的文章里 其实是大写的, 可能我的nginx环境不同,所以大家要自己调试一下获取header 看看。
ptrace 是自己封装的 钉钉告警函数,大家可以换成发邮件。