compose: cloud releases support

Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
This commit is contained in:
CrazyMax
2025-01-20 15:38:48 +01:00
parent 2925ff2bef
commit 1229986252
3 changed files with 59 additions and 10 deletions

View File

@@ -98,28 +98,47 @@ describe('download', () => {
}); });
describe('getDownloadVersion', () => { describe('getDownloadVersion', () => {
it('returns latest download version', async () => { it('returns official latest download version', async () => {
const version = await Install.getDownloadVersion('latest'); const version = await Install.getDownloadVersion('latest');
expect(version.key).toEqual('official');
expect(version.version).toEqual('latest'); expect(version.version).toEqual('latest');
expect(version.downloadURL).toEqual('https://github.com/docker/compose/releases/download/v%s/%s'); expect(version.downloadURL).toEqual('https://github.com/docker/compose/releases/download/v%s/%s');
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json'); expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json');
}); });
it('returns v2.24.3 download version', async () => { it('returns official v2.24.3 download version', async () => {
const version = await Install.getDownloadVersion('v2.24.3'); const version = await Install.getDownloadVersion('v2.24.3');
expect(version.key).toEqual('official');
expect(version.version).toEqual('v2.24.3'); expect(version.version).toEqual('v2.24.3');
expect(version.downloadURL).toEqual('https://github.com/docker/compose/releases/download/v%s/%s'); expect(version.downloadURL).toEqual('https://github.com/docker/compose/releases/download/v%s/%s');
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json'); expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json');
}); });
it('returns cloud latest download version', async () => {
const version = await Install.getDownloadVersion('cloud:latest');
expect(version.key).toEqual('cloud');
expect(version.version).toEqual('latest');
expect(version.downloadURL).toEqual('https://github.com/docker/compose-desktop/releases/download/v%s/%s');
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-lab-releases.json');
});
it('returns cloud v2.27.1-desktop.1 download version', async () => {
const version = await Install.getDownloadVersion('cloud:v2.27.1-desktop.1');
expect(version.key).toEqual('cloud');
expect(version.version).toEqual('v2.27.1-desktop.1');
expect(version.downloadURL).toEqual('https://github.com/docker/compose-desktop/releases/download/v%s/%s');
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-lab-releases.json');
});
it('unknown repo', async () => {
await expect(Install.getDownloadVersion('foo:bar')).rejects.toThrow(new Error('Cannot find compose version for foo:bar'));
});
}); });
describe('getRelease', () => { describe('getRelease', () => {
it('returns latest GitHub release', async () => { it('returns latest official GitHub release', async () => {
const version = await Install.getDownloadVersion('latest'); const version = await Install.getDownloadVersion('latest');
const release = await Install.getRelease(version); const release = await Install.getRelease(version);
expect(release).not.toBeNull(); expect(release).not.toBeNull();
expect(release?.tag_name).not.toEqual(''); expect(release?.tag_name).not.toEqual('');
}); });
it('returns v2.24.3 GitHub release', async () => { it('returns v2.24.3 official GitHub release', async () => {
const version = await Install.getDownloadVersion('v2.24.3'); const version = await Install.getDownloadVersion('v2.24.3');
const release = await Install.getRelease(version); const release = await Install.getRelease(version);
expect(release).not.toBeNull(); expect(release).not.toBeNull();
@@ -127,6 +146,14 @@ describe('getRelease', () => {
expect(release?.tag_name).toEqual('v2.24.3'); expect(release?.tag_name).toEqual('v2.24.3');
expect(release?.html_url).toEqual('https://github.com/docker/compose/releases/tag/v2.24.3'); expect(release?.html_url).toEqual('https://github.com/docker/compose/releases/tag/v2.24.3');
}); });
it('returns v2.27.1-desktop.1 cloud GitHub release', async () => {
const version = await Install.getDownloadVersion('cloud:v2.27.1-desktop.1');
const release = await Install.getRelease(version);
expect(release).not.toBeNull();
expect(release?.id).toEqual(157591108);
expect(release?.tag_name).toEqual('v2.27.1-desktop.1');
expect(release?.html_url).toEqual('https://github.com/docker/compose-desktop/releases/tag/v2.27.1-desktop.1');
});
it('unknown release', async () => { it('unknown release', async () => {
const version = await Install.getDownloadVersion('foo'); const version = await Install.getDownloadVersion('foo');
await expect(Install.getRelease(version)).rejects.toThrow(new Error('Cannot find Compose release foo in https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json')); await expect(Install.getRelease(version)).rejects.toThrow(new Error('Cannot find Compose release foo in https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json'));

View File

@@ -63,7 +63,7 @@ export class Install {
} }
const installCache = new Cache({ const installCache = new Cache({
htcName: 'compose-dl-bin', htcName: version.key != 'official' ? `compose-dl-bin-${version.key}` : 'compose-dl-bin',
htcVersion: vspec, htcVersion: vspec,
baseCacheDir: path.join(os.homedir(), '.bin'), baseCacheDir: path.join(os.homedir(), '.bin'),
cacheFile: os.platform() == 'win32' ? 'docker-compose.exe' : 'docker-compose', cacheFile: os.platform() == 'win32' ? 'docker-compose.exe' : 'docker-compose',
@@ -172,11 +172,32 @@ export class Install {
} }
public static async getDownloadVersion(v: string): Promise<DownloadVersion> { public static async getDownloadVersion(v: string): Promise<DownloadVersion> {
return { let [repoKey, version] = v.split(':');
version: v, if (!version) {
downloadURL: 'https://github.com/docker/compose/releases/download/v%s/%s', version = repoKey;
releasesURL: 'https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json' repoKey = 'official';
}; }
switch (repoKey) {
case 'official': {
return {
key: repoKey,
version: version,
downloadURL: 'https://github.com/docker/compose/releases/download/v%s/%s',
releasesURL: 'https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json'
};
}
case 'cloud': {
return {
key: repoKey,
version: version,
downloadURL: 'https://github.com/docker/compose-desktop/releases/download/v%s/%s',
releasesURL: 'https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-lab-releases.json'
};
}
default: {
throw new Error(`Cannot find compose version for ${v}`);
}
}
} }
public static async getRelease(version: DownloadVersion): Promise<GitHubRelease> { public static async getRelease(version: DownloadVersion): Promise<GitHubRelease> {

View File

@@ -15,6 +15,7 @@
*/ */
export interface DownloadVersion { export interface DownloadVersion {
key: string;
version: string; version: string;
downloadURL: string; downloadURL: string;
releasesURL: string; releasesURL: string;