Home
Linux
Golang
MySQL
PHP
Other
Message
自动部署那些事
创建日期:2020-07-10 22:41:08
更新日期:2020-10-23 01:14:38
栏目:
Linux
浏览:232
[TOC] # git 钩子 原理:就是在你推送代码到远程仓库的时候,可以触发一个钩子,告诉你的服务器,代码有更新了,你就可以根据相应信息来自送更新你的代码。 以 gitee 钩子为例: - gitee 设置钩子   - URL 触发后的执行代码 ``` <?php namespace App\Http\Controllers\OpenApi; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class IndexController extends Controller { /** * WebHook 自动部署 * * @param Request $request * @return string */ public function index(Request $request) { // 项目路径,我是直接写在项目中,所以可以这样找目录,一般是单独写,路径可以写死 $project = base_path(); // Git 地址,最好采用 SSH 这样不会出现拉取代码需要输入密码的情况 $gitPath = 'git@gitee.com:shuxiaoyuan/laravel_sxyblog.git'; // header 头信息 $header = $request->header(); // 判断密码 if ($header['x-gitee-token'][0] == '你设置的密码') { $requestBody = file_get_contents("php://input"); if (empty($requestBody)) { return 'body为空'; } //解析Git服务器通知过来的JSON信息 $content = json_decode($requestBody, true); // 使用 shell_exec 来执行 Linux 命令(composer,migrate等等都可以执行),命令有一定的危险性,所以。。。。。。 $res = PHP_EOL . "pull start --------" . PHP_EOL; $res .= shell_exec("cd {$project} && 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了 ' . $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); echo "success"; } else { echo "token error"; } } } ``` > 注:最好不要将触发钩子代码写在项目中,这样当你的项目整体报错时不能更新代码,最好的方式是,该钩子不要依赖太多东西,最简单的就是,远程仓库回调到该代码,去执行拉去代码 # 计划任务 这个最简单,在服务器上写一个计划任务,比如,每隔一分钟,进入到相应目录,去执行 `git pull` 命令,简直无脑,可是很好用 # Deployer 这个最麻烦,功能也最全,可见我详细写的一篇文章,[Deployer 自动部署](https://www.shuxiaoyuan.com/info/42 "Deployer部署")
内容版权声明:本文为舒孝元原创文章,转载无需和我联系,但请注明来自
舒孝元博客:https://www.shuxiaoyuan.com/info/83
联系邮箱:sxy@shuxiaoyuan.com