Files
coolify/tests/Unit/UpgradeScriptPullRetryTest.php
T
peaklabs-dev e0fb2b3897 ci(release): build and release a nightly twice a day
- Remove other/nightly, the nightly channel uses the production files, so there are no longer two copies to keep in sync
- sync-cdn.sh --nightly syncs the files of the commit the nightly is built from to /coolify/nightly on the CDN, with the nightly version in its versions.json and in /coolify/release.json, and pushes them straight to main of coollabs-cdn
- version.sh picks the branch the nightly comes from, the release branch of the next version after the newest stable one or next, and names the version <preview>.<YYYYMMDD>.<N>
- The image is labeled with its version and commit, the nightly workflow reads both from the image nightly points at to count up N and to skip a run without a new commit
2026-11-01 19:37:39 +01:00

43 lines
1.5 KiB
PHP

<?php
/**
* Runs pull_image() from the upgrade script with a fake docker that fails the first $failures pulls.
*
* @return array{exitCode: int, pulls: int}
*/
function runUpgradeScriptPullImage(string $script, int $failures): array
{
$dir = sys_get_temp_dir().'/upgrade-pull-'.bin2hex(random_bytes(4));
mkdir($dir);
$source = file_get_contents(getcwd().'/'.$script);
preg_match('/^log\(\) \{.*?^\}\n/ms', $source, $log);
preg_match('/^pull_image\(\) \{.*?^\}\n/ms', $source, $pullImage);
$harness = <<<BASH
LOGFILE="{$dir}/upgrade.log"
docker() {
local count=\$(cat "{$dir}/pulls" 2>/dev/null || echo 0)
echo \$((count + 1)) > "{$dir}/pulls"
[ "\$count" -ge {$failures} ]
}
sleep() { :; }
{$log[0]}
{$pullImage[0]}
pull_image ghcr.io/coollabsio/coolify-helper:1.0.14
BASH;
exec('bash -c '.escapeshellarg($harness).' >/dev/null 2>&1', result_code: $exitCode);
$pulls = (int) @file_get_contents("{$dir}/pulls");
exec('rm -rf '.escapeshellarg($dir));
return ['exitCode' => $exitCode, 'pulls' => $pulls];
}
it('retries a rate limited image pull until it succeeds', function (string $script) {
expect(runUpgradeScriptPullImage($script, failures: 2))->toBe(['exitCode' => 0, 'pulls' => 3]);
})->with(['scripts/upgrade.sh']);
it('fails the image pull after five attempts', function (string $script) {
expect(runUpgradeScriptPullImage($script, failures: 10))->toBe(['exitCode' => 1, 'pulls' => 5]);
})->with(['scripts/upgrade.sh']);