diff --git a/publisher/app/commands/TaskCommand.php b/publisher/app/commands/TaskCommand.php
index 9ce1098..a4e1db7 100644
--- a/publisher/app/commands/TaskCommand.php
+++ b/publisher/app/commands/TaskCommand.php
@@ -41,7 +41,7 @@ public function __construct()
public function fire()
{
//启动之前先检查进程是否还活着,如果还活着咱就退
- if(file_exists($this->filelock) && posix_kill(intval(file_get_contents($this->filelock)),0))
+ if(file_exists($this->filelock) && function_exists('posix_kill') && posix_kill(intval(file_get_contents($this->filelock)),0))
{
die("pid exists,exit");
}
diff --git a/publisher/app/controllers/ServersController.php b/publisher/app/controllers/ServersController.php
index 138eb34..a81bc0a 100644
--- a/publisher/app/controllers/ServersController.php
+++ b/publisher/app/controllers/ServersController.php
@@ -61,4 +61,14 @@ public function editServer()
return View::make('servers/edit',array('server'=>$server,'error' => $error,'project_id' => $project_id,'projects'=>$prj_list));
}
+ public function pingServer()
+ {
+ $id = intval(Input::get('id'));
+ $server = Server::find($id);
+ if($id && $server && Auth::user()->pj_is_mine($server->project_id))
+ {
+ return Response::json(Task::pingRsyncServer($server->ip));
+ }
+ return Response::json(false);
+ }
}
diff --git a/publisher/app/lib/TaskHelper.php b/publisher/app/lib/TaskHelper.php
index b2e94d4..f4c7242 100644
--- a/publisher/app/lib/TaskHelper.php
+++ b/publisher/app/lib/TaskHelper.php
@@ -222,18 +222,21 @@ private function _runDelete($task)
*/
private function _runRsync($task)
{
+ $current_dir = getcwd();
$server = \Server::find($task->server_id);
$pj_dir = \Project::getTempDir($server->project_id);
+ chdir($pj_dir);
//目前就记录个日志就得了
- $rsync_cmd = sprintf("rsync -avzP publisher@%s::%s %s",$server->ip,$server->rsync_name,$pj_dir);
- //忽略文件、 发布时要添加del选项 --delete --exclude
- file_put_contents(app_path()."/storage/rsync.log",$rsync_cmd."\n",FILE_APPEND);
- if(true)
+ $rsync_cmd = sprintf("rsync -az --delete %s %s::%s",'.',$server->ip,$server->rsync_name);
+ //file_put_contents(app_path()."/storage/rsync.log",$rsync_cmd."\n",FILE_APPEND);
+ exec($rsync_cmd,$output,$return_var);
+ if($return_var == 0)
{
- $server->current_version = $this->get_dir_version($pj_dir);
+ $server->current_version = $this->get_dir_version('.');
$server->save();
}
- return array('result'=>true,'output'=> '');
+ chdir($current_dir);
+ return array('result'=>true,'output'=> implode("\n", $output)." code {$return_var}");
}
/**
@@ -319,4 +322,21 @@ private function get_dir_version($src_path,$type='svn')
break;
}
}
+
+ // 测试服务器通迅
+ public function pingRsyncServer($ip)
+ {
+ $result = array();
+ if ($fp = @fsockopen($ip, 873, $errno, $errstr, 5))
+ {
+ fwrite($fp, "\n");
+ $ret = fread($fp, 8192);
+ fclose($fp);
+ if(preg_match('/RSYNCD:\s*\d+/',$ret))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/publisher/app/models/Server.php b/publisher/app/models/Server.php
index 6d95f74..ff1e011 100644
--- a/publisher/app/models/Server.php
+++ b/publisher/app/models/Server.php
@@ -9,33 +9,4 @@ public function project()
{
return $this->belongsTo('Project','project_id');
}
-
- // 测试服务器通迅
- // public static function pingServers($ip)
- // {
- // $result = array();
- // $fp = @fsockopen($ip, 873, $errno, $errstr, 5);
- // if (!$fp)
- // {
- // $result['result'] = false;
- // $result['msg'] = "failure: $errstr ($errno)";
- // }
- // else
- // {
- // fwrite($fp, "\n");
- // $ret = fread($fp, 8192);
- // if(preg_match('/RSYNCD:\s*\d+/',$ret))
- // {
- // $result['result'] = true;
- // $result['msg'] = "success: ".$ret;
- // }
- // elseif (preg_match ("/@ERROR:/i", $ret))
- // {
- // $result['result'] = false;
- // $result['msg'] = "error: ".$ret;
- // }
- // fclose($fp);
- // }
- // return $result;
- // }
}
\ No newline at end of file
diff --git a/publisher/app/routes.php b/publisher/app/routes.php
index ebd75e3..1bfb01c 100644
--- a/publisher/app/routes.php
+++ b/publisher/app/routes.php
@@ -28,6 +28,7 @@
//服务器
Route::any('servers/add',array('before' => 'auth', 'uses' => 'ServersController@editServer'));
Route::any('servers/edit',array('before' => 'auth', 'uses' => 'ServersController@editServer'));
+Route::get('servers/ping',array('before' => 'auth', 'uses' => 'ServersController@pingServer'));
//用户
Route::get('users/index',array('before' => 'auth', 'uses' => 'UsersController@all'));
diff --git a/publisher/app/views/hello.blade.php b/publisher/app/views/hello.blade.php
index 513b0b1..55dd02e 100644
--- a/publisher/app/views/hello.blade.php
+++ b/publisher/app/views/hello.blade.php
@@ -6,13 +6,13 @@
@stop
@section('content')
-
- 欢迎使用代码发布系统
+
+ 欢迎使用代码发布系统
本系统暂时只支持SVN,以后将逐步支持GIT。您可在“项目”菜单中找到自己要发布的项目,通过页面浏览项目的SVN历史纪录,选择要发布的版本和要发布的服务器,系统将把您选择的代码版本发布到指定服务器。
权限由超级管理员管理,请向超级管理员联系获取您所在项目的权限。请注意,获得权限之后,您将对您的项目负责。
一般配置、使用说明
-
项目配置选项说明
+ 项目配置选项说明
- 项目id: 每个项目有唯一的ID。
@@ -27,11 +27,38 @@
- 请注意,修改源码地址会导致发布服务器上check的代码完全清除并重新checkout,可能会消耗一些时间。
- 服务器配置选项说明
-
- rsync服务器端配置说明
-
- 发布操作
+ 服务器配置选项说明
+
+
+ - 服务器id: 每个服务器有唯一的ID。
+ - 服务器名称:服务器名称,例如“XX项目测试环境”
+ - 所属项目:请选择此服务器属于哪个项目
+ - 服务器ip:请和运维确认好服务器和本发布系统的网络关系,确认填写内网还是外网IP。
+ - rsync模块名:rsync配置的模块名
+
+
+ rsync服务器端配置说明
+
+ rsync配置要确认好服务器和本发布系统的网络关系,确认填写内网还是外网IP。
+ 一个典型的rsync配置文件如下
+
+uid = root
+gid = root
+port = 873
+pid file = /tmp/rsyncd.pid
+lock file = /tmp/rsync.lock
+log file = /tmp/rsyncd.log
+
+[xingyuntest]
+path = /usr/local/nginx/html/xingyuntest
+read only = false
+host allow = 127.0.0.1,192.168.83.244
+host deny = *
+
+ 本系统暂时只依赖指定IP安全性,不支持Rsync端指定帐号密码,所以请务必限制IP白名单。
+ 更详细的配置请搜索rsync配置相关文章,例。
+
+ 发布操作
diff --git a/publisher/app/views/projects/publish.blade.php b/publisher/app/views/projects/publish.blade.php
index 8b61cf0..c3fd3bd 100644
--- a/publisher/app/views/projects/publish.blade.php
+++ b/publisher/app/views/projects/publish.blade.php
@@ -61,8 +61,9 @@
服务器 |
IP |
版本 |
- 同步状态 |
+ 发布进度 |
操作 |
+ 状态 |
@@ -76,6 +77,9 @@
修改
|
+
+
+ |
@@ -260,5 +264,22 @@
}
},'json');
}
+$(".server_row").each(function(){
+ var _this = $(this);
+ $.getJSON('/servers/ping',{id:_this.find("input[name='publish_box[]']").val()},function(_data){
+ if(_data)
+ {
+ _alt = '服务器正常';
+ _class = 'uk-icon-check';
+ }
+ else
+ {
+ _alt = '服务器Rsync服务故障!';
+ _class = 'uk-icon-warning';
+ }
+ _this.find("td:last i").attr("alt",_alt).removeClass('uk-icon-question').addClass(_class);
+ });
+});
+
@stop