diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php index cdea8e8a14..8ef89f3014 100644 --- a/app/Jobs/ApplicationDeploymentJob.php +++ b/app/Jobs/ApplicationDeploymentJob.php @@ -3053,6 +3053,7 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue } } } + $this->reuse_commit_message(); $this->set_coolify_variables(); // Restart helper container with actual SOURCE_COMMIT value @@ -3062,6 +3063,29 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue } } + /** + * The commit message is read from the cloned repository. Deployments that skip the build or fail + * before the clone reuse the message stored by an earlier deployment of the same commit. + */ + private function reuse_commit_message(): void + { + if (filled($this->application_deployment_queue->commit_message) || $this->shouldResolveBranchHeadCommit()) { + return; + } + + $commitMessage = ApplicationDeploymentQueue::query() + ->where('application_id', $this->application->id) + ->where('commit', $this->commit) + ->whereNotNull('commit_message') + ->where('commit_message', '!=', '') + ->latest('id') + ->value('commit_message'); + + if (filled($commitMessage)) { + $this->application_deployment_queue->update(['commit_message' => $commitMessage]); + } + } + private function shouldResolveBranchHeadCommit(): bool { $commit = trim($this->commit); diff --git a/resources/views/livewire/dashboard.blade.php b/resources/views/livewire/dashboard.blade.php index 472b3e9961..5de545df33 100644 --- a/resources/views/livewire/dashboard.blade.php +++ b/resources/views/livewire/dashboard.blade.php @@ -83,14 +83,16 @@ @endif -
+

{{ $project->name }}

-

- {{ $project->description }} -

+ @if (filled($project->description)) +

+ {{ $project->description }} +

+ @endif
@@ -204,14 +206,16 @@ class="flex size-8 shrink-0 items-center justify-center rounded-lg border border-neutral-200 bg-neutral-50 text-neutral-500 dark:border-white/[0.1] dark:bg-white/[0.04] dark:text-fg-dim"> -
+

{{ $server->name }}

-

- {{ $server->description }} -

+ @if (filled($server->description)) +

+ {{ $server->description }} +

+ @endif
@if ($serverStatusType !== 'success')
-
+

+ x-show="project.description?.trim()" + x-text="project.description">

diff --git a/resources/views/livewire/server/index.blade.php b/resources/views/livewire/server/index.blade.php index 5258673700..30eca6ac13 100644 --- a/resources/views/livewire/server/index.blade.php +++ b/resources/views/livewire/server/index.blade.php @@ -147,13 +147,15 @@ class="flex size-8 shrink-0 items-center justify-center rounded-lg border border-neutral-200 bg-neutral-50 text-neutral-500 dark:border-white/[0.1] dark:bg-white/[0.04] dark:text-fg-dim"> -
+

{{ $serverRow['name'] }}

-

- {{ $serverRow['description'] }} -

+ @if (filled($serverRow['description'])) +

+ {{ $serverRow['description'] }} +

+ @endif
@if ($serverRow['statusType'] !== 'success')
-
+

{{ $privateKey->name }} @@ -77,9 +77,11 @@ @endif

-

- {{ $privateKey->description }} -

+ @if (filled($privateKey->description)) +

+ {{ $privateKey->description }} +

+ @endif
diff --git a/resources/views/livewire/shared-variables/environment/index.blade.php b/resources/views/livewire/shared-variables/environment/index.blade.php index 645f2e61be..ed8e38407a 100644 --- a/resources/views/livewire/shared-variables/environment/index.blade.php +++ b/resources/views/livewire/shared-variables/environment/index.blade.php @@ -33,7 +33,7 @@ href="{{ route('shared-variables.environment.show', ['project_uuid' => $project->uuid, 'environment_uuid' => $environment->uuid]) }}" {{ wireNavigate() }}>
-

{{ $environment->name }}

{{ $environment->description }}

+

{{ $environment->name }}

@if (filled($environment->description))

{{ $environment->description }}

@endif
@endforeach diff --git a/resources/views/livewire/shared-variables/project/index.blade.php b/resources/views/livewire/shared-variables/project/index.blade.php index d19fc39f5e..e1ac890a52 100644 --- a/resources/views/livewire/shared-variables/project/index.blade.php +++ b/resources/views/livewire/shared-variables/project/index.blade.php @@ -31,9 +31,11 @@ @endif
-
+

{{ $project->name }}

-

{{ $project->description }}

+ @if (filled($project->description)) +

{{ $project->description }}

+ @endif
diff --git a/tests/Feature/DeploymentCommitMessageReuseTest.php b/tests/Feature/DeploymentCommitMessageReuseTest.php new file mode 100644 index 0000000000..52a05e71ad --- /dev/null +++ b/tests/Feature/DeploymentCommitMessageReuseTest.php @@ -0,0 +1,84 @@ +create(); + $this->server = Server::factory()->create(['team_id' => $team->id]); + $destination = StandaloneDocker::where('server_id', $this->server->id)->firstOrFail(); + $project = Project::factory()->create(['team_id' => $team->id]); + $environment = $project->environments()->first() ?? Environment::factory()->create(['project_id' => $project->id]); + + $this->application = Application::factory()->create([ + 'environment_id' => $environment->id, + 'destination_id' => $destination->id, + 'destination_type' => $destination->getMorphClass(), + ]); +}); + +function createCommitMessageDeployment(Application $application, Server $server, string $commit, ?string $commitMessage = null): ApplicationDeploymentQueue +{ + return ApplicationDeploymentQueue::create([ + 'application_id' => $application->id, + 'deployment_uuid' => new_public_id(), + 'server_id' => $server->id, + 'commit' => $commit, + 'commit_message' => $commitMessage, + ]); +} + +function reuseCommitMessage(ApplicationDeploymentQueue $deployment, Application $application, string $commit): void +{ + $reflection = new ReflectionClass(ApplicationDeploymentJob::class); + $job = $reflection->newInstanceWithoutConstructor(); + $reflection->getProperty('application')->setValue($job, $application); + $reflection->getProperty('application_deployment_queue')->setValue($job, $deployment); + $reflection->getProperty('commit')->setValue($job, $commit); + + $reflection->getMethod('reuse_commit_message')->invoke($job); +} + +test('copies the commit message from an earlier deployment of the same commit', function () { + $commit = str_repeat('a', 40); + createCommitMessageDeployment($this->application, $this->server, $commit, 'feat: add portfolio work page'); + $deployment = createCommitMessageDeployment($this->application, $this->server, $commit); + + reuseCommitMessage($deployment, $this->application, $commit); + + expect($deployment->fresh()->commit_message)->toBe('feat: add portfolio work page'); +}); + +test('does not copy a commit message from another commit or application', function () { + $commit = str_repeat('a', 40); + createCommitMessageDeployment($this->application, $this->server, str_repeat('b', 40), 'other commit'); + $otherApplication = Application::factory()->create([ + 'environment_id' => $this->application->environment_id, + 'destination_id' => $this->application->destination_id, + 'destination_type' => $this->application->destination_type, + ]); + createCommitMessageDeployment($otherApplication, $this->server, $commit, 'other application'); + $deployment = createCommitMessageDeployment($this->application, $this->server, $commit); + + reuseCommitMessage($deployment, $this->application, $commit); + + expect($deployment->fresh()->commit_message)->toBeNull(); +}); + +test('does not look up a commit message for an unresolved HEAD commit', function () { + createCommitMessageDeployment($this->application, $this->server, 'HEAD', 'stale message'); + $deployment = createCommitMessageDeployment($this->application, $this->server, 'HEAD'); + + reuseCommitMessage($deployment, $this->application, 'HEAD'); + + expect($deployment->fresh()->commit_message)->toBeNull(); +});