调用博主最近登录时间
生活中的HYGGE
Laravel对接Coding仓库WebHooks实现自动部署
PHP

Laravel对接Coding仓库WebHooks实现自动部署

hygge
2024-07-10 / 0 评论 / 85 阅读 / 正在检测是否收录...
上下文环境都是基于宝塔的,因为Bash操作都使用的www用户,其他环境并不适用

项目

执行bash主要使用的是exec函数,项目跑在nginx上。

nginx使用的用户为www,所以会有权限问题

权限解决:

vim /etc/sudoers

# 文件内容如下

# www ALL=(ALL) NOPASSWD: /usr/bin/git  # +
# www ALL=(www) NOPASSWD: /www/server/php/81/bin/php /usr/local/bin/composer install  # +
第一行配置:允许用户www以任何用户身份运行/usr/bin/git命令,而无需输入密码。
第二行配置:允许用户www以自身身份运行指定的composer install命令,而无需输入密码。

路由:

/**
 * 处理WebHook的请求
 * 自动化部署
 */
Route::post('webhook', [App\Http\Controllers\Deploy\WebHookController::class, 'handle']);

控制器:

解释: 当发现仓库有push操作后,自动执行git pull拉取代码,然后执行composer install安装依赖

class WebHookController extends Controller
{
    /**
     * 监听Coding仓库代码更新操作
     * 自动部署最新版项目
     * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource
     */
    public function handle(Request $request)
    {
        Log::info('接收到Coding WebHook', [$request]);
        $hookEvent = $request->header('X-Coding-Event');
        if (!\Str::contains($hookEvent, 'push')) return \Response::ok();
        Log::info("开始执行自动部署任务");
        // Git Pull
        exec('cd .. && sudo git pull' . ' 2>&1', $output, $status);
        if ($status != 0) {
            Log::error('拉取代码失败', [$output, $status]);
            \Response::fail('拉取代码失败', ResponseCodeEnum::SYSTEM_ERROR);
        }
        Log::info("拉取代码成功", [$output, $status]);
        // Composer Install
        exec('cd .. && /www/server/php/81/bin/php /usr/local/bin/composer install' . ' 2>&1', $output, $status);
        if ($status != 0) {
            Log::error('composer安装失败', [$output, $status]);
            \Response::fail('composer安装失败', ResponseCodeEnum::SYSTEM_ERROR);
        }
        Log::info("composer安装成功", [$output, $status]);
        // 后端完成部署
        Log::info("自动部署任务执行完毕");
        return \Response::ok();
    }
}

模拟:

lyfaswq6.png

Coding

公司的项目使用腾讯旗下的Coding来管理项目,也是有WebHook的功能

lyfat27u.png

引用

1.Coding WebHook:https://coding.net/help/docs/project-settings/open/webhook.html

2.如何实现Git Push之后自动部署到服务器?:https://blog.csdn.net/ll15982534415/article/details/136669152

0

评论 (0)

取消