diff --git a/__tests__/context.test.ts b/__tests__/context.test.ts index 517bce0..975de73 100644 --- a/__tests__/context.test.ts +++ b/__tests__/context.test.ts @@ -234,7 +234,7 @@ describe('getCreateArgs', () => { ], [ 10, - 'v0.10.3', + 'v0.37.0', new Map([ ['use', 'false'], ['driver', 'cloud'], @@ -301,6 +301,25 @@ describe('getCreateArgs', () => { expect(res).toEqual(expected); } ); + + test('rejects cloud driver with unsupported official Buildx', async () => { + setInput('version', 'v0.36.1'); + setInput('driver', 'cloud'); + setInput('use', 'true'); + setInput('cache-binary', 'true'); + setInput('cleanup', 'true'); + setInput('keep-state', 'false'); + const toolkit = new Toolkit(); + const versionSpy = vi.spyOn(Buildx.prototype, 'version').mockImplementation(async (): Promise => { + return 'v0.36.1'; + }); + try { + const inp = await context.getInputs(); + await expect(context.getCreateArgs(inp, toolkit)).rejects.toThrow(/requires Buildx v0.37.0 or later/); + } finally { + versionSpy.mockRestore(); + } + }); }); describe('getAppendArgs', () => { @@ -361,140 +380,6 @@ describe('getAppendArgs', () => { ); }); -describe('getVersion', () => { - beforeEach(() => { - process.env = Object.keys(process.env).reduce((object, key) => { - if (!key.startsWith('INPUT_')) { - object[key] = process.env[key]; - } - return object; - }, {}); - }); - - // prettier-ignore - test.each([ - [ - 0, - new Map([ - // defaults - ['use', 'true'], - ['cache-binary', 'true'], - ['cleanup', 'true'], - ['keep-state', 'false'] - ]), - '' - ], - [ - 1, - new Map([ - ['version', 'latest'], - // defaults - ['use', 'true'], - ['cache-binary', 'true'], - ['cleanup', 'true'], - ['keep-state', 'false'] - ]), - 'latest' - ], - [ - 2, - new Map([ - ['version', 'edge'], - // defaults - ['use', 'true'], - ['cache-binary', 'true'], - ['cleanup', 'true'], - ['keep-state', 'false'] - ]), - 'edge' - ], - [ - 3, - new Map([ - ['version', 'v0.19.2'], - // defaults - ['use', 'true'], - ['cache-binary', 'true'], - ['cleanup', 'true'], - ['keep-state', 'false'] - ]), - 'v0.19.2' - ], - [ - 4, - new Map([ - ['version', 'latest'], - ['driver', 'cloud'], - // defaults - ['use', 'true'], - ['cache-binary', 'true'], - ['cleanup', 'true'], - ['keep-state', 'false'] - ]), - 'cloud:latest' - ], - [ - 5, - new Map([ - ['version', 'edge'], - ['driver', 'cloud'], - // defaults - ['use', 'true'], - ['cache-binary', 'true'], - ['cleanup', 'true'], - ['keep-state', 'false'] - ]), - 'cloud:edge' - ], - [ - 6, - new Map([ - ['driver', 'cloud'], - // defaults - ['use', 'true'], - ['cache-binary', 'true'], - ['cleanup', 'true'], - ['keep-state', 'false'] - ]), - 'cloud:latest' - ], - [ - 7, - new Map([ - ['version', 'cloud:v0.11.2-desktop.2'], - ['driver', 'cloud'], - // defaults - ['use', 'true'], - ['cache-binary', 'true'], - ['cleanup', 'true'], - ['keep-state', 'false'] - ]), - 'cloud:v0.11.2-desktop.2' - ], - [ - 8, - new Map([ - ['version', 'cloud:v0.11.2-desktop.2'], - // defaults - ['use', 'true'], - ['cache-binary', 'true'], - ['cleanup', 'true'], - ['keep-state', 'false'] - ]), - 'cloud:v0.11.2-desktop.2' - ], - ])( - '[%d] given %o as inputs, returns version %o', - async (num: number, inputs: Map, expected: string) => { - inputs.forEach((value: string, name: string) => { - setInput(name, value); - }); - const inp = await context.getInputs(); - expect(context.getVersion(inp)).toEqual(expected); - } - ); -}); - // See: https://github.com/actions/toolkit/blob/master/packages/core/src/core.ts#L67 function getInputName(name: string): string { return `INPUT_${name.replace(/ /g, '_').toUpperCase()}`; diff --git a/src/context.ts b/src/context.ts index 5e92e55..38cf4a8 100644 --- a/src/context.ts +++ b/src/context.ts @@ -52,6 +52,9 @@ export async function getBuilderName(name: string, driver: string): Promise> { const args: Array = ['create', '--name', inputs.name, '--driver', inputs.driver]; + if (inputs.driver === 'cloud' && !inputs.version.startsWith('cloud:') && !inputs.version.startsWith('lab:') && !(await toolkit.buildx.versionSatisfies('>=0.37.0-0'))) { + throw new Error(`Docker Build Cloud with official Buildx requires Buildx v0.37.0 or later. Set version to cloud: or lab: to use the legacy Docker Build Cloud release channel.`); + } if (await toolkit.buildx.versionSatisfies('>=0.3.0')) { await Util.asyncForEach(inputs.driverOpts, async (driverOpt: string) => { args.push('--driver-opt', driverOpt); @@ -116,17 +119,3 @@ export async function getInspectArgs(inputs: Inputs, toolkit: Toolkit): Promise< function driverSupportsBuildkitdFlags(driver: string): boolean { return driver == '' || driver == 'docker-container' || driver == 'docker' || driver == 'kubernetes'; } - -export function getVersion(inputs: Inputs): string { - const version = inputs.version; - if (inputs.driver === 'cloud') { - if (!version || version === 'latest') { - return 'cloud:latest'; - } - if (version.startsWith('cloud:') || version.startsWith('lab:')) { - return version; - } - return `cloud:${version}`; - } - return version; -} diff --git a/src/main.ts b/src/main.ts index 8e79c2f..836b0d5 100644 --- a/src/main.ts +++ b/src/main.ts @@ -22,7 +22,6 @@ actionsToolkit.run( async () => { const inputs: context.Inputs = await context.getInputs(); stateHelper.setCleanup(inputs.cleanup); - const version = context.getVersion(inputs); const toolkit = new Toolkit(); const standalone = await toolkit.buildx.isStandalone(); @@ -44,17 +43,17 @@ actionsToolkit.run( }); let toolPath; - if (Util.isValidRef(version)) { + if (Util.isValidRef(inputs.version)) { if (standalone) { throw new Error(`Cannot build from source without the Docker CLI`); } await core.group(`Build buildx from source`, async () => { - toolPath = await toolkit.buildxInstall.build(version, !inputs.cacheBinary); + toolPath = await toolkit.buildxInstall.build(inputs.version, !inputs.cacheBinary); }); - } else if (!(await toolkit.buildx.isAvailable()) || version) { + } else if (!(await toolkit.buildx.isAvailable()) || inputs.version || (inputs.driver === 'cloud' && !inputs.version && !(await toolkit.buildx.versionSatisfies('>=0.37.0-0')))) { await core.group(`Download buildx from GitHub Releases`, async () => { toolPath = await toolkit.buildxInstall.download({ - version: version || 'latest', + version: inputs.version || 'latest', ghaNoCache: !inputs.cacheBinary }); });