diff --git a/__tests__/compose/install.test.ts b/__tests__/compose/install.test.ts index 447412d..e30d059 100644 --- a/__tests__/compose/install.test.ts +++ b/__tests__/compose/install.test.ts @@ -98,28 +98,47 @@ describe('download', () => { }); describe('getDownloadVersion', () => { - it('returns latest download version', async () => { + it('returns official latest download version', async () => { const version = await Install.getDownloadVersion('latest'); + expect(version.key).toEqual('official'); expect(version.version).toEqual('latest'); 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'); }); - 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'); + expect(version.key).toEqual('official'); expect(version.version).toEqual('v2.24.3'); 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'); }); + 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', () => { - it('returns latest GitHub release', async () => { + it('returns latest official GitHub release', async () => { const version = await Install.getDownloadVersion('latest'); const release = await Install.getRelease(version); expect(release).not.toBeNull(); 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 release = await Install.getRelease(version); expect(release).not.toBeNull(); @@ -127,6 +146,14 @@ describe('getRelease', () => { expect(release?.tag_name).toEqual('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 () => { 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')); diff --git a/src/compose/install.ts b/src/compose/install.ts index d249f29..acc6b13 100644 --- a/src/compose/install.ts +++ b/src/compose/install.ts @@ -63,7 +63,7 @@ export class Install { } const installCache = new Cache({ - htcName: 'compose-dl-bin', + htcName: version.key != 'official' ? `compose-dl-bin-${version.key}` : 'compose-dl-bin', htcVersion: vspec, baseCacheDir: path.join(os.homedir(), '.bin'), cacheFile: os.platform() == 'win32' ? 'docker-compose.exe' : 'docker-compose', @@ -172,11 +172,32 @@ export class Install { } public static async getDownloadVersion(v: string): Promise { - return { - version: v, - downloadURL: 'https://github.com/docker/compose/releases/download/v%s/%s', - releasesURL: 'https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json' - }; + let [repoKey, version] = v.split(':'); + if (!version) { + version = repoKey; + 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 { diff --git a/src/types/compose/compose.ts b/src/types/compose/compose.ts index f06edeb..41d9cc9 100644 --- a/src/types/compose/compose.ts +++ b/src/types/compose/compose.ts @@ -15,6 +15,7 @@ */ export interface DownloadVersion { + key: string; version: string; downloadURL: string; releasesURL: string;