/** * * 针对一个服务器,调用Rsync将项目发布到线上,然后回写Server的版本和更新结果 * @link http://www.cnblogs.com/mchina/p/2829944.html Rsync的配置 */ private function _runRsync($task) { $current_dir = getcwd(); $server = \Server::find($task->server_id); $pj_dir = \Project::getTempDir($server->project_id); chdir($pj_dir); $excludes = ''; $exclude_files = explode("\n", $server->project->ignore_files); foreach ($exclude_files as $_file) { $_file = trim($_file); if ($_file) { $excludes .= ' --exclude ' . escapeshellarg($_file); } } $rsync_cmd = sprintf("rsync -azc --delete %s . %s::%s", $excludes, $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('.'); $server->save(); } chdir($current_dir); return array('result' => true, 'output' => implode("\n", $output) . " code {$return_var}"); }