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, "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,
|
||||
'save' => 'git_commit_sha',
|
||||
]
|
||||
|
|
|
|||
|
|
@ -57,16 +57,6 @@ class GithubPrivateRepositoryDeployKey extends Component
|
|||
|
||||
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()
|
||||
{
|
||||
return [
|
||||
|
|
|
|||
|
|
@ -63,16 +63,6 @@ class PublicGitRepository extends Component
|
|||
|
||||
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()
|
||||
{
|
||||
return [
|
||||
|
|
|
|||
|
|
@ -989,17 +989,24 @@ public function isPRDeployable(): bool
|
|||
|
||||
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';
|
||||
}
|
||||
if (! is_null(data_get($this, 'private_key_id'))) {
|
||||
return 'deploy_key';
|
||||
} elseif (data_get($this, 'source')) {
|
||||
|
||||
// GitHub/GitLab App source
|
||||
if (data_get($this, '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
|
||||
|
|
|
|||
|
|
@ -99,6 +99,21 @@ public function run(): void
|
|||
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([
|
||||
'uuid' => 'gitlab-deploy-key',
|
||||
'name' => 'GitLab Deploy Key Example',
|
||||
|
|
|
|||
|
|
@ -169,7 +169,6 @@
|
|||
|
||||
expect($validator->fails())->toBeFalse();
|
||||
});
|
||||
});
|
||||
|
||||
test('dockerfile_location validation allows paths with @ for scoped packages', function () {
|
||||
$rules = sharedDataApplications();
|
||||
|
|
|
|||
|
|
@ -1,11 +1,54 @@
|
|||
<?php
|
||||
|
||||
use App\Models\Application;
|
||||
use App\Models\GithubApp;
|
||||
|
||||
it('treats zero private key id as deploy key', function () {
|
||||
$application = new Application();
|
||||
it('returns deploy_key when private_key_id is a real key', function () {
|
||||
$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->source = null;
|
||||
|
||||
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