想检查一下,我对Bitbucket新推出的webhook相当新,以前我使用的服务是Bitbucket将执行指向我网站的链接,从而触发部署脚本。
因此,由于旧服务很快就会被折旧,所以我们都迁移到了webhook。使用相同的实现,我在提交/推送/合并时不断收到错误500,我们无法查看给出的错误的详细信息。起初我以为是我的服务器出问题但是当我通过浏览器手动调用链接时,一切都很好。部署脚本可以成功执行,那么为什么bitbucket的webhook会一直告诉我错误500?
随后我发现Bitbucket给出的指南没有帮助。对于所述网址没有指定的调用方法,webhook是否会发起GET
或POST
请求?以前使用服务会启动POST
请求。那么,我需要包含在webhook URL中的任何必要的有效负载吗?没有说明。然后,如果有错误,至少让我看到错误,所以我可以修复它,而不是告诉我错误500.
我希望有人可以帮我解决这个问题。以下是该网站的一些规范。
Server : Ubuntu LEMP 14.04 x64 Laravel framework 5.0
Webhook Url: bot.example.com/bitbucket/deploy/{Site API}
Method : GET
当调用abode链接时,它会到达一个
的控制器public function attemptDeploy($site_api)
{
$script = 'nohup setsid php ~/scripts/deploy.php ' . $site_api. ' > /dev/null 2>&1 &';
exec($script);
return response('Deploy running.', 200);
}
请注意,当我从浏览器或控制台手动调用此链接时,除了bitbucket的webhook之外,一切都很完美。我该如何解决这个问题?
答案 0 :(得分:1)
我遇到了同样的情况。 Bitbucket修剪了响应的主体,我无法看到我的服务器给出的错误。
我查看了日志storage/logs/laravel.log
并看到了 TokenMismatchException
。 Webhooks是API调用,他们不存储cookie或会话,因此Laravel的CSRF会中断。
您需要从CSRF为bitbucket部署路由添加例外。您可以在app/Http/Middleware/VerifyCsrfToken.php
中添加此例外。例如,如果您的链接为www.your_site.com/bit_deploy
,则您将拥有:
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'bit_deploy'
];
}
希望这对你有所帮助......因为我已经失去了3个小时。
PS:在撰写此答案时,bitbucket webhooks执行 POST 调用(不是GET)