fix(docker): replace deprecated stop flags with version-aware ones

Store each server's Docker version and build stop commands via
dockerStopCommand() so newer Docker uses --timeout instead of
deprecated --time/-t. Also show Docker version in server details.
This commit is contained in:
Andras Bacsai
2026-08-13 11:17:44 +02:00
parent 6481ffffcf
commit e79230cf37
32 changed files with 697 additions and 64 deletions
+112
View File
@@ -0,0 +1,112 @@
<?php
use App\Jobs\ServerConnectionCheckJob;
use App\Models\PrivateKey;
use App\Models\Server;
use App\Models\Team;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Process;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\Storage;
uses(RefreshDatabase::class);
function createServerForDockerVersionStorageTest(): Server
{
$team = Team::factory()->create();
$privateKey = PrivateKey::factory()->create(['team_id' => $team->id]);
return Server::factory()->create([
'team_id' => $team->id,
'private_key_id' => $privateKey->id,
'ip' => '203.0.113.10',
]);
}
beforeEach(function () {
Storage::fake('ssh-keys');
Carbon::setTestNow('2026-08-13 12:00:00');
});
afterEach(function () {
Carbon::setTestNow();
});
it('has docker and compose version columns on server settings', function () {
expect(Schema::hasColumns('server_settings', [
'docker_version',
'docker_version_checked_at',
'compose_version',
'compose_version_checked_at',
]))->toBeTrue();
});
it('stores a parsed docker version on the server settings', function () {
$server = createServerForDockerVersionStorageTest();
$server->rememberDockerVersion('29.4.3-ce');
$settings = $server->settings->fresh();
expect($settings->docker_version)->toBe('29.4.3')
->and($settings->docker_version_checked_at?->equalTo(Carbon::parse('2026-08-13 12:00:00')))->toBeTrue()
->and($server->dockerVersion())->toBe('29.4.3');
});
it('updates the stored docker version when the engine changes', function () {
$server = createServerForDockerVersionStorageTest();
$server->rememberDockerVersion('27.5.1');
Carbon::setTestNow('2026-08-13 13:00:00');
$server->rememberDockerVersion('29.4.3');
$settings = $server->settings->fresh();
expect($settings->docker_version)->toBe('29.4.3')
->and($settings->docker_version_checked_at?->equalTo(Carbon::parse('2026-08-13 13:00:00')))->toBeTrue();
});
it('builds stop commands from the stored server docker version', function (?string $storedVersion, string $expectedCommand) {
$server = createServerForDockerVersionStorageTest();
if ($storedVersion !== null) {
$server->rememberDockerVersion($storedVersion);
}
expect(dockerStopCommand(30, 'app-1', $server->fresh()))->toBe($expectedCommand);
})->with([
'unset' => [null, 'docker stop --time=30 app-1'],
'docker 28+' => ['29.4.3', 'docker stop --timeout=30 app-1'],
'docker 27' => ['27.5.1', 'docker stop --time=30 app-1'],
]);
it('stores a parsed compose version on the server settings', function () {
$server = createServerForDockerVersionStorageTest();
$server->rememberComposeVersion('v2.32.4');
$settings = $server->settings->fresh();
expect($settings->compose_version)->toBe('2.32.4')
->and($settings->compose_version_checked_at?->equalTo(Carbon::parse('2026-08-13 12:00:00')))->toBeTrue()
->and($server->composeVersion())->toBe('2.32.4');
});
it('records docker and compose versions during connection checks', function () {
$server = createServerForDockerVersionStorageTest();
Process::fake([
'*compose*' => Process::result(output: 'v2.32.4', exitCode: 0),
'*' => Process::result(
output: '{"Server":{"Version":"29.4.3"}}',
exitCode: 0,
),
]);
(new ServerConnectionCheckJob($server, disableMux: false))->handle();
$settings = $server->settings->fresh();
expect($settings->docker_version)->toBe('29.4.3')
->and($settings->compose_version)->toBe('2.32.4');
});