From 5c334bbac68664202194a65d62c536d780fbc056 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 26 Jan 2024 18:46:50 +0100 Subject: [PATCH] feat: add PR comments --- app/Enums/ProcessStatus.php | 1 + app/Jobs/ApplicationDeploymentJob.php | 9 +++++- app/Jobs/ApplicationPullRequestUpdateJob.php | 34 ++++++++++---------- bootstrap/helpers/github.php | 1 + routes/webhooks.php | 3 ++ 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/app/Enums/ProcessStatus.php b/app/Enums/ProcessStatus.php index 0031cabdd..cc9e32680 100644 --- a/app/Enums/ProcessStatus.php +++ b/app/Enums/ProcessStatus.php @@ -10,4 +10,5 @@ enum ProcessStatus: string case ERROR = 'error'; case KILLED = 'killed'; case CANCELLED = 'cancelled'; + case CLOSED = 'closed'; } diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php index 0de41f32a..cca9745c1 100644 --- a/app/Jobs/ApplicationDeploymentJob.php +++ b/app/Jobs/ApplicationDeploymentJob.php @@ -3,7 +3,7 @@ namespace App\Jobs; use App\Enums\ApplicationDeploymentStatus; -use App\Enums\ProxyTypes; +use App\Enums\ProcessStatus; use App\Events\ApplicationStatusChanged; use App\Models\Application; use App\Models\ApplicationDeploymentQueue; @@ -158,6 +158,7 @@ public function __construct(int $application_deployment_queue_id) $this->preview->fqdn = $preview_fqdn; $this->preview->save(); } + ApplicationPullRequestUpdateJob::dispatch(application: $this->application, preview: $this->preview, deployment_uuid: $this->deployment_uuid, status: ProcessStatus::IN_PROGRESS); } } @@ -254,8 +255,14 @@ public function handle(): void $this->push_to_docker_registry(); } $this->next(ApplicationDeploymentStatus::FINISHED->value); + if ($this->pull_request_id !== 0) { + ApplicationPullRequestUpdateJob::dispatch(application: $this->application, preview: $this->preview, deployment_uuid: $this->deployment_uuid, status: ProcessStatus::FINISHED); + } $this->application->isConfigurationChanged(true); } catch (Exception $e) { + if ($this->pull_request_id !== 0) { + ApplicationPullRequestUpdateJob::dispatch(application: $this->application, preview: $this->preview, deployment_uuid: $this->deployment_uuid, status: ProcessStatus::ERROR); + } $this->fail($e); throw $e; } finally { diff --git a/app/Jobs/ApplicationPullRequestUpdateJob.php b/app/Jobs/ApplicationPullRequestUpdateJob.php index dbe0ff81c..85dde009d 100755 --- a/app/Jobs/ApplicationPullRequestUpdateJob.php +++ b/app/Jobs/ApplicationPullRequestUpdateJob.php @@ -17,38 +17,34 @@ class ApplicationPullRequestUpdateJob implements ShouldQueue, ShouldBeEncrypted use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public string $build_logs_url; - public Application $application; - public ApplicationPreview $preview; public string $body; public function __construct( - public string $application_id, - public int $pull_request_id, - public string $deployment_uuid, - public string $status + public Application $application, + public ApplicationPreview $preview, + public ProcessStatus $status, + public ?string $deployment_uuid = null ) { } public function handle() { try { - $this->application = Application::findOrFail($this->application_id); - $this->preview = ApplicationPreview::findPreviewByApplicationAndPullId($this->application->id, $this->pull_request_id); - - $this->build_logs_url = base_url() . "/project/{$this->application->environment->project->uuid}/{$this->application->environment->name}/application/{$this->application->uuid}/deployment/{$this->deployment_uuid}"; - - if ($this->status === ProcessStatus::IN_PROGRESS->value) { + if ($this->status === ProcessStatus::CLOSED) { + $this->delete_comment(); + return; + } else if ($this->status === ProcessStatus::IN_PROGRESS) { $this->body = "The preview deployment is in progress. 🟡\n\n"; - } - if ($this->status === ProcessStatus::FINISHED->value) { + } else if ($this->status === ProcessStatus::FINISHED) { $this->body = "The preview deployment is ready. 🟢\n\n"; if ($this->preview->fqdn) { $this->body .= "[Open Preview]({$this->preview->fqdn}) | "; } - } - if ($this->status === ProcessStatus::ERROR->value) { + } else if ($this->status === ProcessStatus::ERROR) { $this->body = "The preview deployment failed. 🔴\n\n"; } + $this->build_logs_url = base_url() . "/project/{$this->application->environment->project->uuid}/{$this->application->environment->name}/application/{$this->application->uuid}/deployment/{$this->deployment_uuid}"; + $this->body .= "[Open Build Logs](" . $this->build_logs_url . ")\n\n\n"; $this->body .= "Last updated at: " . now()->toDateTimeString() . " CET"; @@ -77,10 +73,14 @@ private function update_comment() private function create_comment() { - ['data' => $data] = githubApi(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/issues/{$this->pull_request_id}/comments", method: 'post', data: [ + ['data' => $data] = githubApi(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/issues/{$this->preview->pull_request_id}/comments", method: 'post', data: [ 'body' => $this->body, ]); $this->preview->pull_request_issue_comment_id = $data['id']; $this->preview->save(); } + private function delete_comment() + { + githubApi(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/issues/comments/{$this->preview->pull_request_issue_comment_id}", method: 'delete'); + } } diff --git a/bootstrap/helpers/github.php b/bootstrap/helpers/github.php index 60ff6d9c9..11cc5a3f8 100644 --- a/bootstrap/helpers/github.php +++ b/bootstrap/helpers/github.php @@ -69,6 +69,7 @@ function githubApi(GithubApp|GitlabApp|null $source, string $endpoint, string $m } $json = $response->json(); if ($response->failed() && $throwError) { + ray($json); throw new \Exception("Failed to get data from {$source->name} with error:

" . $json['message'] . "

Rate Limit resets at: " . Carbon::parse((int)$response->header('X-RateLimit-Reset'))->format('Y-m-d H:i:s') . 'UTC'); } return [ diff --git a/routes/webhooks.php b/routes/webhooks.php index 77484c133..314d8a06f 100644 --- a/routes/webhooks.php +++ b/routes/webhooks.php @@ -1,5 +1,7 @@ id)->where('pull_request_id', $pull_request_id)->first(); if ($found) { + ApplicationPullRequestUpdateJob::dispatchSync(application: $application, preview: $found, status: ProcessStatus::CLOSED); $found->delete(); $container_name = generateApplicationContainerName($application, $pull_request_id); // ray('Stopping container: ' . $container_name);