Merge pull request #570 from crazy-max/compose-cloud

compose: cloud releases support
This commit is contained in:
CrazyMax
2025-01-20 16:02:05 +01:00
committed by GitHub
4 changed files with 90 additions and 33 deletions

View File

@@ -57,22 +57,26 @@ describe('download', () => {
['v0.9.0'], ['v0.9.0'],
['v0.10.5'], ['v0.10.5'],
])( ])(
'acquires %p of buildx with cache', async (version) => { 'acquires %p of buildx with cache', async (version) => {
const install = new Install({standalone: false}); const install = new Install({standalone: false});
const toolPath = await install.download(version); const toolPath = await install.download(version);
expect(fs.existsSync(toolPath)).toBe(true); expect(fs.existsSync(toolPath)).toBe(true);
}); },
100000
);
// prettier-ignore // prettier-ignore
test.each([ test.each([
['v0.11.2'], ['v0.11.2'],
['v0.12.0'], ['v0.12.0'],
])( ])(
'acquires %p of buildx without cache', async (version) => { 'acquires %p of buildx without cache', async (version) => {
const install = new Install({standalone: false}); const install = new Install({standalone: false});
const toolPath = await install.download(version, true); const toolPath = await install.download(version, true);
expect(fs.existsSync(toolPath)).toBe(true); expect(fs.existsSync(toolPath)).toBe(true);
}); },
100000
);
// TODO: add tests for arm // TODO: add tests for arm
// prettier-ignore // prettier-ignore
@@ -86,7 +90,7 @@ describe('download', () => {
['linux', 'ppc64'], ['linux', 'ppc64'],
['linux', 's390x'], ['linux', 's390x'],
])( ])(
'acquires buildx for %s/%s', async (os, arch) => { 'acquires buildx for %s/%s', async (os, arch) => {
jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform); jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform);
jest.spyOn(osm, 'arch').mockImplementation(() => arch); jest.spyOn(osm, 'arch').mockImplementation(() => arch);
const install = new Install(); const install = new Install();

View File

@@ -36,7 +36,7 @@ describe('download', () => {
['v2.32.4', true], ['v2.32.4', true],
['latest', true] ['latest', true]
])( ])(
'acquires %p of compose (standalone: %p)', async (version, standalone) => { 'acquires %p of compose (standalone: %p)', async (version, standalone) => {
const install = new Install({standalone: standalone}); const install = new Install({standalone: standalone});
const toolPath = await install.download(version); const toolPath = await install.download(version);
expect(fs.existsSync(toolPath)).toBe(true); expect(fs.existsSync(toolPath)).toBe(true);
@@ -57,22 +57,26 @@ describe('download', () => {
['v2.31.0'], ['v2.31.0'],
['v2.32.4'], ['v2.32.4'],
])( ])(
'acquires %p of compose with cache', async (version) => { 'acquires %p of compose with cache', async (version) => {
const install = new Install({standalone: false}); const install = new Install({standalone: false});
const toolPath = await install.download(version); const toolPath = await install.download(version);
expect(fs.existsSync(toolPath)).toBe(true); expect(fs.existsSync(toolPath)).toBe(true);
}); },
100000
);
// prettier-ignore // prettier-ignore
test.each([ test.each([
['v2.27.1'], ['v2.27.1'],
['v2.28.0'], ['v2.28.0'],
])( ])(
'acquires %p of compose without cache', async (version) => { 'acquires %p of compose without cache', async (version) => {
const install = new Install({standalone: false}); const install = new Install({standalone: false});
const toolPath = await install.download(version, true); const toolPath = await install.download(version, true);
expect(fs.existsSync(toolPath)).toBe(true); expect(fs.existsSync(toolPath)).toBe(true);
}); },
100000
);
// TODO: add tests for arm // TODO: add tests for arm
// prettier-ignore // prettier-ignore
@@ -86,7 +90,7 @@ describe('download', () => {
['linux', 'ppc64'], ['linux', 'ppc64'],
['linux', 's390x'], ['linux', 's390x'],
])( ])(
'acquires compose for %s/%s', async (os, arch) => { 'acquires compose for %s/%s', async (os, arch) => {
jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform); jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform);
jest.spyOn(osm, 'arch').mockImplementation(() => arch); jest.spyOn(osm, 'arch').mockImplementation(() => arch);
const install = new Install(); const install = new Install();
@@ -98,28 +102,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 +150,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;