上下文环境都是基于宝塔的,因为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();
}
}
模拟:
Coding
公司的项目使用腾讯旗下的Coding
来管理项目,也是有WebHook的功能
引用
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)