fix(application): clarify deployment type precedence logic (#8934)
This commit is contained in:
commit
39119fbff9
7 changed files with 75 additions and 31 deletions
|
|
@ -2133,7 +2133,7 @@ private function check_git_if_build_needed()
|
||||||
executeInDocker($this->deployment_uuid, 'chmod 600 /root/.ssh/id_rsa'),
|
executeInDocker($this->deployment_uuid, 'chmod 600 /root/.ssh/id_rsa'),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
executeInDocker($this->deployment_uuid, "GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$this->customPort} -o Port={$this->customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null\" git ls-remote {$this->fullRepoUrl} {$lsRemoteRef}"),
|
executeInDocker($this->deployment_uuid, "GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$this->customPort} -o Port={$this->customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" git ls-remote {$this->fullRepoUrl} {$lsRemoteRef}"),
|
||||||
'hidden' => true,
|
'hidden' => true,
|
||||||
'save' => 'git_commit_sha',
|
'save' => 'git_commit_sha',
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -57,16 +57,6 @@ class GithubPrivateRepositoryDeployKey extends Component
|
||||||
|
|
||||||
private ?string $git_repository = null;
|
private ?string $git_repository = null;
|
||||||
|
|
||||||
protected $rules = [
|
|
||||||
'repository_url' => ['required', 'string'],
|
|
||||||
'branch' => ['required', 'string'],
|
|
||||||
'port' => 'required|numeric',
|
|
||||||
'is_static' => 'required|boolean',
|
|
||||||
'publish_directory' => 'nullable|string',
|
|
||||||
'build_pack' => 'required|string',
|
|
||||||
'docker_compose_location' => \App\Support\ValidationPatterns::filePathRules(),
|
|
||||||
];
|
|
||||||
|
|
||||||
protected function rules()
|
protected function rules()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
|
|
||||||
|
|
@ -63,16 +63,6 @@ class PublicGitRepository extends Component
|
||||||
|
|
||||||
public bool $new_compose_services = false;
|
public bool $new_compose_services = false;
|
||||||
|
|
||||||
protected $rules = [
|
|
||||||
'repository_url' => ['required', 'string'],
|
|
||||||
'port' => 'required|numeric',
|
|
||||||
'isStatic' => 'required|boolean',
|
|
||||||
'publish_directory' => 'nullable|string',
|
|
||||||
'build_pack' => 'required|string',
|
|
||||||
'base_directory' => 'nullable|string',
|
|
||||||
'docker_compose_location' => \App\Support\ValidationPatterns::filePathRules(),
|
|
||||||
];
|
|
||||||
|
|
||||||
protected function rules()
|
protected function rules()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
|
|
||||||
|
|
@ -989,17 +989,24 @@ public function isPRDeployable(): bool
|
||||||
|
|
||||||
public function deploymentType()
|
public function deploymentType()
|
||||||
{
|
{
|
||||||
if (isDev() && data_get($this, 'private_key_id') === 0) {
|
$privateKeyId = data_get($this, 'private_key_id');
|
||||||
|
|
||||||
|
// Real private key (id > 0) always takes precedence
|
||||||
|
if ($privateKeyId !== null && $privateKeyId > 0) {
|
||||||
return 'deploy_key';
|
return 'deploy_key';
|
||||||
}
|
}
|
||||||
if (! is_null(data_get($this, 'private_key_id'))) {
|
|
||||||
return 'deploy_key';
|
// GitHub/GitLab App source
|
||||||
} elseif (data_get($this, 'source')) {
|
if (data_get($this, 'source')) {
|
||||||
return 'source';
|
return 'source';
|
||||||
} else {
|
|
||||||
return 'other';
|
|
||||||
}
|
}
|
||||||
throw new \Exception('No deployment type found');
|
|
||||||
|
// Localhost key (id = 0) when no source is configured
|
||||||
|
if ($privateKeyId === 0) {
|
||||||
|
return 'deploy_key';
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'other';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function could_set_build_commands(): bool
|
public function could_set_build_commands(): bool
|
||||||
|
|
|
||||||
|
|
@ -99,6 +99,21 @@ public function run(): void
|
||||||
CMD ["sh", "-c", "echo Crashing in 5 seconds... && sleep 5 && exit 1"]
|
CMD ["sh", "-c", "echo Crashing in 5 seconds... && sleep 5 && exit 1"]
|
||||||
',
|
',
|
||||||
]);
|
]);
|
||||||
|
Application::create([
|
||||||
|
'uuid' => 'github-deploy-key',
|
||||||
|
'name' => 'GitHub Deploy Key Example',
|
||||||
|
'fqdn' => 'http://github-deploy-key.127.0.0.1.sslip.io',
|
||||||
|
'git_repository' => 'git@github.com:coollabsio/coolify-examples-deploy-key.git',
|
||||||
|
'git_branch' => 'main',
|
||||||
|
'build_pack' => 'nixpacks',
|
||||||
|
'ports_exposes' => '80',
|
||||||
|
'environment_id' => 1,
|
||||||
|
'destination_id' => 0,
|
||||||
|
'destination_type' => StandaloneDocker::class,
|
||||||
|
'source_id' => 0,
|
||||||
|
'source_type' => GithubApp::class,
|
||||||
|
'private_key_id' => 1,
|
||||||
|
]);
|
||||||
Application::create([
|
Application::create([
|
||||||
'uuid' => 'gitlab-deploy-key',
|
'uuid' => 'gitlab-deploy-key',
|
||||||
'name' => 'GitLab Deploy Key Example',
|
'name' => 'GitLab Deploy Key Example',
|
||||||
|
|
|
||||||
|
|
@ -169,7 +169,6 @@
|
||||||
|
|
||||||
expect($validator->fails())->toBeFalse();
|
expect($validator->fails())->toBeFalse();
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
test('dockerfile_location validation allows paths with @ for scoped packages', function () {
|
test('dockerfile_location validation allows paths with @ for scoped packages', function () {
|
||||||
$rules = sharedDataApplications();
|
$rules = sharedDataApplications();
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,54 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
use App\Models\Application;
|
use App\Models\Application;
|
||||||
|
use App\Models\GithubApp;
|
||||||
|
|
||||||
it('treats zero private key id as deploy key', function () {
|
it('returns deploy_key when private_key_id is a real key', function () {
|
||||||
$application = new Application();
|
$application = new Application;
|
||||||
|
$application->private_key_id = 5;
|
||||||
|
|
||||||
|
expect($application->deploymentType())->toBe('deploy_key');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns deploy_key when private_key_id is a real key even with source', function () {
|
||||||
|
$application = Mockery::mock(Application::class)->makePartial();
|
||||||
|
$application->private_key_id = 5;
|
||||||
|
$application->shouldReceive('getAttribute')->with('source')->andReturn(new GithubApp);
|
||||||
|
$application->shouldReceive('getAttribute')->with('private_key_id')->andReturn(5);
|
||||||
|
|
||||||
|
expect($application->deploymentType())->toBe('deploy_key');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns source when private_key_id is null and source exists', function () {
|
||||||
|
$application = Mockery::mock(Application::class)->makePartial();
|
||||||
|
$application->private_key_id = null;
|
||||||
|
$application->shouldReceive('getAttribute')->with('source')->andReturn(new GithubApp);
|
||||||
|
$application->shouldReceive('getAttribute')->with('private_key_id')->andReturn(null);
|
||||||
|
|
||||||
|
expect($application->deploymentType())->toBe('source');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns source when private_key_id is zero and source exists', function () {
|
||||||
|
$application = Mockery::mock(Application::class)->makePartial();
|
||||||
|
$application->private_key_id = 0;
|
||||||
|
$application->shouldReceive('getAttribute')->with('source')->andReturn(new GithubApp);
|
||||||
|
$application->shouldReceive('getAttribute')->with('private_key_id')->andReturn(0);
|
||||||
|
|
||||||
|
expect($application->deploymentType())->toBe('source');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns deploy_key when private_key_id is zero and no source', function () {
|
||||||
|
$application = new Application;
|
||||||
$application->private_key_id = 0;
|
$application->private_key_id = 0;
|
||||||
$application->source = null;
|
$application->source = null;
|
||||||
|
|
||||||
expect($application->deploymentType())->toBe('deploy_key');
|
expect($application->deploymentType())->toBe('deploy_key');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('returns other when private_key_id is null and no source', function () {
|
||||||
|
$application = Mockery::mock(Application::class)->makePartial();
|
||||||
|
$application->shouldReceive('getAttribute')->with('source')->andReturn(null);
|
||||||
|
$application->shouldReceive('getAttribute')->with('private_key_id')->andReturn(null);
|
||||||
|
|
||||||
|
expect($application->deploymentType())->toBe('other');
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue