✨ Populate docker_compose_domains for dockercompose apps
Add logic to populate docker_compose_domains in applicationParser for dockercompose build packs, ensuring proper domain handling for KEY-based SERVICE_FQDN variables.
This commit is contained in:
parent
61f47cc7ee
commit
7f46b2ed71
3 changed files with 169 additions and 3 deletions
|
|
@ -1229,7 +1229,7 @@ private function create_application(Request $request, $type)
|
||||||
$request->offsetUnset('docker_compose_domains');
|
$request->offsetUnset('docker_compose_domains');
|
||||||
}
|
}
|
||||||
if ($dockerComposeDomainsJson->count() > 0) {
|
if ($dockerComposeDomainsJson->count() > 0) {
|
||||||
$application->docker_compose_domains = $dockerComposeDomainsJson;
|
$application->docker_compose_domains = json_encode($dockerComposeDomainsJson);
|
||||||
}
|
}
|
||||||
$repository_url_parsed = Url::fromString($request->git_repository);
|
$repository_url_parsed = Url::fromString($request->git_repository);
|
||||||
$git_host = $repository_url_parsed->getHost();
|
$git_host = $repository_url_parsed->getHost();
|
||||||
|
|
@ -1461,7 +1461,7 @@ private function create_application(Request $request, $type)
|
||||||
$request->offsetUnset('docker_compose_domains');
|
$request->offsetUnset('docker_compose_domains');
|
||||||
}
|
}
|
||||||
if ($dockerComposeDomainsJson->count() > 0) {
|
if ($dockerComposeDomainsJson->count() > 0) {
|
||||||
$application->docker_compose_domains = $dockerComposeDomainsJson;
|
$application->docker_compose_domains = json_encode($dockerComposeDomainsJson);
|
||||||
}
|
}
|
||||||
$application->fqdn = $fqdn;
|
$application->fqdn = $fqdn;
|
||||||
$application->git_repository = str($gitRepository)->trim()->toString();
|
$application->git_repository = str($gitRepository)->trim()->toString();
|
||||||
|
|
@ -1665,7 +1665,7 @@ private function create_application(Request $request, $type)
|
||||||
$request->offsetUnset('docker_compose_domains');
|
$request->offsetUnset('docker_compose_domains');
|
||||||
}
|
}
|
||||||
if ($dockerComposeDomainsJson->count() > 0) {
|
if ($dockerComposeDomainsJson->count() > 0) {
|
||||||
$application->docker_compose_domains = $dockerComposeDomainsJson;
|
$application->docker_compose_domains = json_encode($dockerComposeDomainsJson);
|
||||||
}
|
}
|
||||||
$application->fqdn = $fqdn;
|
$application->fqdn = $fqdn;
|
||||||
$application->private_key_id = $privateKey->id;
|
$application->private_key_id = $privateKey->id;
|
||||||
|
|
|
||||||
|
|
@ -504,6 +504,28 @@ function applicationParser(Application $resource, int $pull_request_id = 0, ?int
|
||||||
'is_preview' => false,
|
'is_preview' => false,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Also populate docker_compose_domains for dockercompose apps (mirrors Path 1 at lines 601-627)
|
||||||
|
if ($resource->build_pack === 'dockercompose') {
|
||||||
|
$normalizedFqdnFor = str($fqdnFor)->replace('-', '_')->replace('.', '_')->value();
|
||||||
|
$serviceExists = false;
|
||||||
|
foreach ($services as $serviceNameKey => $svc) {
|
||||||
|
if (str($serviceNameKey)->replace('-', '_')->replace('.', '_')->value() === $normalizedFqdnFor) {
|
||||||
|
$serviceExists = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($serviceExists) {
|
||||||
|
$domains = collect(json_decode(data_get($resource, 'docker_compose_domains'))) ?? collect([]);
|
||||||
|
$domainExists = data_get($domains->get($normalizedFqdnFor), 'domain');
|
||||||
|
if (is_null($domainExists)) {
|
||||||
|
$domainValue = $fqdn;
|
||||||
|
$domains->put($normalizedFqdnFor, ['domain' => $domainValue]);
|
||||||
|
$resource->docker_compose_domains = $domains->toJson();
|
||||||
|
$resource->save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
144
tests/Feature/ApplicationParserDockerComposeDomainsTest.php
Normal file
144
tests/Feature/ApplicationParserDockerComposeDomainsTest.php
Normal file
|
|
@ -0,0 +1,144 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use App\Models\Application;
|
||||||
|
use App\Models\Environment;
|
||||||
|
use App\Models\PrivateKey;
|
||||||
|
use App\Models\Project;
|
||||||
|
use App\Models\Server;
|
||||||
|
use App\Models\ServerSetting;
|
||||||
|
use App\Models\StandaloneDocker;
|
||||||
|
use App\Models\Team;
|
||||||
|
use App\Models\User;
|
||||||
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||||
|
use phpseclib3\Crypt\EC;
|
||||||
|
|
||||||
|
uses(RefreshDatabase::class);
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
$this->user = User::factory()->create();
|
||||||
|
$this->team = Team::factory()->create();
|
||||||
|
$this->user->teams()->attach($this->team);
|
||||||
|
|
||||||
|
$this->project = Project::factory()->create(['team_id' => $this->team->id]);
|
||||||
|
$this->environment = Environment::factory()->create([
|
||||||
|
'project_id' => $this->project->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$ecKey = EC::createKey('Ed25519');
|
||||||
|
$privateKeyContent = $ecKey->toString('OpenSSH');
|
||||||
|
|
||||||
|
$privateKey = PrivateKey::create([
|
||||||
|
'name' => 'test-key',
|
||||||
|
'private_key' => $privateKeyContent,
|
||||||
|
'team_id' => $this->team->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->server = Server::factory()->create([
|
||||||
|
'team_id' => $this->team->id,
|
||||||
|
'private_key_id' => $privateKey->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
ServerSetting::create([
|
||||||
|
'server_id' => $this->server->id,
|
||||||
|
'wildcard_domain' => 'http://127.0.0.1.sslip.io',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->destination = StandaloneDocker::factory()->create([
|
||||||
|
'server_id' => $this->server->id,
|
||||||
|
'network' => 'test-network-'.fake()->uuid(),
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('applicationParser populates docker_compose_domains for KEY-based SERVICE_FQDN variables', function () {
|
||||||
|
$dockerCompose = <<<'YAML'
|
||||||
|
services:
|
||||||
|
backend:
|
||||||
|
image: myapp/backend:latest
|
||||||
|
environment:
|
||||||
|
- SERVICE_FQDN_BACKEND_8000=${BACKEND_URL}
|
||||||
|
frontend:
|
||||||
|
image: myapp/frontend:latest
|
||||||
|
environment:
|
||||||
|
- SERVICE_FQDN_FRONTEND=${FRONTEND_URL}
|
||||||
|
YAML;
|
||||||
|
|
||||||
|
$application = Application::factory()->create([
|
||||||
|
'environment_id' => $this->environment->id,
|
||||||
|
'destination_id' => $this->destination->id,
|
||||||
|
'destination_type' => StandaloneDocker::class,
|
||||||
|
'build_pack' => 'dockercompose',
|
||||||
|
'docker_compose_raw' => $dockerCompose,
|
||||||
|
'fqdn' => null,
|
||||||
|
'docker_compose_domains' => null,
|
||||||
|
]);
|
||||||
|
|
||||||
|
applicationParser($application);
|
||||||
|
|
||||||
|
$application->refresh();
|
||||||
|
|
||||||
|
$domains = json_decode($application->docker_compose_domains, true);
|
||||||
|
|
||||||
|
expect($domains)->not->toBeNull()
|
||||||
|
->and($domains)->toBeArray()
|
||||||
|
->and($domains)->toHaveKey('backend')
|
||||||
|
->and($domains['backend'])->toHaveKey('domain')
|
||||||
|
->and($domains['backend']['domain'])->not->toBeEmpty();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('applicationParser populates docker_compose_domains for KEY-based SERVICE_FQDN without port', function () {
|
||||||
|
$dockerCompose = <<<'YAML'
|
||||||
|
services:
|
||||||
|
frontend:
|
||||||
|
image: myapp/frontend:latest
|
||||||
|
environment:
|
||||||
|
- SERVICE_FQDN_FRONTEND=${FRONTEND_URL}
|
||||||
|
YAML;
|
||||||
|
|
||||||
|
$application = Application::factory()->create([
|
||||||
|
'environment_id' => $this->environment->id,
|
||||||
|
'destination_id' => $this->destination->id,
|
||||||
|
'destination_type' => StandaloneDocker::class,
|
||||||
|
'build_pack' => 'dockercompose',
|
||||||
|
'docker_compose_raw' => $dockerCompose,
|
||||||
|
'fqdn' => null,
|
||||||
|
'docker_compose_domains' => null,
|
||||||
|
]);
|
||||||
|
|
||||||
|
applicationParser($application);
|
||||||
|
|
||||||
|
$application->refresh();
|
||||||
|
|
||||||
|
$domains = json_decode($application->docker_compose_domains, true);
|
||||||
|
|
||||||
|
expect($domains)->not->toBeNull()
|
||||||
|
->and($domains)->toHaveKey('frontend')
|
||||||
|
->and($domains['frontend'])->toHaveKey('domain');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('applicationParser does not populate docker_compose_domains for non-dockercompose build_pack', function () {
|
||||||
|
$dockerCompose = <<<'YAML'
|
||||||
|
services:
|
||||||
|
backend:
|
||||||
|
image: myapp/backend:latest
|
||||||
|
environment:
|
||||||
|
- SERVICE_FQDN_BACKEND_8000=${BACKEND_URL}
|
||||||
|
YAML;
|
||||||
|
|
||||||
|
$application = Application::factory()->create([
|
||||||
|
'environment_id' => $this->environment->id,
|
||||||
|
'destination_id' => $this->destination->id,
|
||||||
|
'destination_type' => StandaloneDocker::class,
|
||||||
|
'build_pack' => 'dockerfile',
|
||||||
|
'docker_compose_raw' => $dockerCompose,
|
||||||
|
'fqdn' => null,
|
||||||
|
'docker_compose_domains' => null,
|
||||||
|
]);
|
||||||
|
|
||||||
|
applicationParser($application);
|
||||||
|
|
||||||
|
$application->refresh();
|
||||||
|
|
||||||
|
// For non-dockercompose, docker_compose_domains should remain empty
|
||||||
|
$domains = json_decode($application->docker_compose_domains, true);
|
||||||
|
expect($domains)->toBeNull();
|
||||||
|
});
|
||||||
Loading…
Reference in a new issue