-
-
Pull Requests on Git
- Load Pull Requests
-
-
+ @if ($application->is_github_based())
+
+
Pull Requests on Git
+ Load Pull Requests
+
+
+ @endif
@isset($rate_limit_remaining)
Requests remaining till rate limited by Git: {{ $rate_limit_remaining }}
@endisset
diff --git a/routes/webhooks.php b/routes/webhooks.php
index cb2c0d704..3eab89a3a 100644
--- a/routes/webhooks.php
+++ b/routes/webhooks.php
@@ -239,43 +239,58 @@ Route::post('/source/bitbucket/events/manual', function () {
$return_payloads = collect([]);
$payload = request()->collect();
$headers = request()->headers->all();
- $x_bitbucket_token = data_get($headers, 'x-hub-signature', [""])[0];
- $x_bitbucket_event = data_get($headers, 'x-event-key', [""])[0];
+ $x_bitbucket_token = data_get($headers, 'x-hub-signature.0', "");
+ $x_bitbucket_event = data_get($headers, 'x-event-key.0', "");
+ $handled_events = collect(['repo:push', 'pullrequest:created', 'pullrequest:rejected', 'pullrequest:fulfilled']);
+ if (!$handled_events->contains($x_bitbucket_event)) {
+ return response([
+ 'status' => 'failed',
+ 'message' => 'Nothing to do. Event not handled.',
+ ]);
+ }
if ($x_bitbucket_event === 'repo:push') {
$branch = data_get($payload, 'push.changes.0.new.name');
- $name = data_get($payload, 'repository.name');
+ $full_name = data_get($payload, 'repository.full_name');
if (!$branch) {
- $return_payloads->push([
+ return response([
'status' => 'failed',
'message' => 'Nothing to do. No branch found in the request.',
]);
- return response($return_payloads);
}
- ray('Manual Webhook bitbucket Push Event with branch: ' . $branch);
+ ray('Manual webhook bitbucket push event with branch: ' . $branch);
}
- $applications = Application::where('git_repository', 'like', "%$name%");
- if ($x_bitbucket_event === 'repo:push') {
- $applications = $applications->where('git_branch', $branch)->get();
- if ($applications->isEmpty()) {
- $return_payloads->push([
- 'status' => 'failed',
- 'message' => "Nothing to do. No applications found with deploy key set, branch is '$branch' and Git Repository name has $name.",
- ]);
- return response($return_payloads);
- }
+ if ($x_bitbucket_event === 'pullrequest:created' || $x_bitbucket_event === 'pullrequest:rejected' || $x_bitbucket_event === 'pullrequest:fulfilled') {
+ $branch = data_get($payload, 'pullrequest.destination.branch.name');
+ $base_branch = data_get($payload, 'pullrequest.source.branch.name');
+ $full_name = data_get($payload, 'repository.full_name');
+ $pull_request_id = data_get($payload, 'pullrequest.id');
+ $pull_request_html_url = data_get($payload, 'pullrequest.links.html.href');
+ $commit = data_get($payload, 'pullrequest.source.commit.hash');
+ }
+ $applications = Application::where('git_repository', 'like', "%$full_name%");
+ $applications = $applications->where('git_branch', $branch)->get();
+ if ($applications->isEmpty()) {
+ return response([
+ 'status' => 'failed',
+ 'message' => "Nothing to do. No applications found with deploy key set, branch is '$branch' and Git Repository name has $full_name.",
+ ]);
}
foreach ($applications as $application) {
+ if (!$application->isPRDeployable()) {
+ $return_payloads->push([
+ 'application' => $application->name,
+ 'status' => 'failed',
+ 'message' => 'Preview deployments disabled.',
+ ]);
+ continue;
+ }
$webhook_secret = data_get($application, 'manual_webhook_secret_bitbucket');
$payload = request()->getContent();
- fwrite(STDOUT, $payload);
-
list($algo, $hash) = explode('=', $x_bitbucket_token, 2);
-
$payloadHash = hash_hmac($algo, $payload, $webhook_secret);
-
- if (!hash_equals($hash, $payloadHash)) {
+ if (!hash_equals($hash, $payloadHash) && !isDev()) {
$return_payloads->push([
'application' => $application->name,
'status' => 'failed',
@@ -289,34 +304,94 @@ Route::post('/source/bitbucket/events/manual', function () {
$return_payloads->push([
'application' => $application->name,
'status' => 'failed',
- 'message' => 'Server is not functional',
+ 'message' => 'Server is not functional.',
]);
ray('Server is not functional: ' . $application->destination->server->name);
continue;
}
if ($x_bitbucket_event === 'repo:push') {
- if ($application->isDeployable()) {
+ if ($application->isPRDeployable()) {
ray('Deploying ' . $application->name . ' with branch ' . $branch);
$deployment_uuid = new Cuid2(7);
queue_application_deployment(
- application_id: $application->id,
+ application: $application,
deployment_uuid: $deployment_uuid,
force_rebuild: false,
is_webhook: true
);
+ $return_payloads->push([
+ 'application' => $application->name,
+ 'status' => 'success',
+ 'message' => 'Preview deployment queued.',
+ ]);
} else {
$return_payloads->push([
'application' => $application->name,
'status' => 'failed',
- 'message' => 'Deployments disabled',
+ 'message' => 'Preview deployments disabled.',
+ ]);
+ }
+ }
+ if ($x_bitbucket_event === 'pullrequest:created') {
+ if ($application->isPRDeployable()) {
+ ray('Deploying preview for ' . $application->name . ' with branch ' . $branch . ' and base branch ' . $base_branch . ' and pull request id ' . $pull_request_id);
+ $deployment_uuid = new Cuid2(7);
+ $found = ApplicationPreview::where('application_id', $application->id)->where('pull_request_id', $pull_request_id)->first();
+ if (!$found) {
+ ApplicationPreview::create([
+ 'git_type' => 'bitbucket',
+ 'application_id' => $application->id,
+ 'pull_request_id' => $pull_request_id,
+ 'pull_request_html_url' => $pull_request_html_url,
+ ]);
+ }
+ queue_application_deployment(
+ application: $application,
+ pull_request_id: $pull_request_id,
+ deployment_uuid: $deployment_uuid,
+ force_rebuild: false,
+ commit: $commit,
+ is_webhook: true,
+ git_type: 'bitbucket'
+ );
+ $return_payloads->push([
+ 'application' => $application->name,
+ 'status' => 'success',
+ 'message' => 'Preview deployment queued.',
+ ]);
+ } else {
+ $return_payloads->push([
+ 'application' => $application->name,
+ 'status' => 'failed',
+ 'message' => 'Preview deployments disabled.',
+ ]);
+ }
+ }
+ if ($x_bitbucket_event === 'pullrequest:rejected' || $x_bitbucket_event === 'pullrequest:fulfilled') {
+ ray('Pull request rejected');
+ $found = ApplicationPreview::where('application_id', $application->id)->where('pull_request_id', $pull_request_id)->first();
+ if ($found) {
+ $found->delete();
+ $container_name = generateApplicationContainerName($application, $pull_request_id);
+ instant_remote_process(["docker rm -f $container_name"], $application->destination->server);
+ $return_payloads->push([
+ 'application' => $application->name,
+ 'status' => 'success',
+ 'message' => 'Preview deployment closed.',
+ ]);
+ } else {
+ $return_payloads->push([
+ 'application' => $application->name,
+ 'status' => 'failed',
+ 'message' => 'No preview deployment found.',
]);
- ray('Deployments disabled for ' . $application->name);
}
}
}
+ ray($return_payloads);
return response($return_payloads);
} catch (Exception $e) {
- ray($e->getMessage());
+ ray($e);
return handleError($e);
}
});