From fc4dae47b637c9cec4371287c3e1798d262fa3dd Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Fri, 12 Apr 2024 11:43:34 +0200 Subject: [PATCH] docker: return actual error message when pull fails Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- __tests__/docker/docker.test.itg.ts | 35 +++++++++++++++++++++------ src/docker/docker.ts | 37 +++++++++++++++++++---------- 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/__tests__/docker/docker.test.itg.ts b/__tests__/docker/docker.test.itg.ts index 9065907..0cd83be 100644 --- a/__tests__/docker/docker.test.itg.ts +++ b/__tests__/docker/docker.test.itg.ts @@ -23,13 +23,34 @@ const maybe = !process.env.GITHUB_ACTIONS || (process.env.GITHUB_ACTIONS === 'tr maybe('pull', () => { // prettier-ignore test.each([ - 'busybox', - 'busybox:1.36', - 'busybox@sha256:7ae8447f3a7f5bccaa765926f25fc038e425cf1b2be6748727bbea9a13102094' - ])( - 'pulling %s', async (image) => { - await expect((async () => { + [ + 'busybox', + undefined, + ], + [ + 'busybox:1.36', + undefined, + ], + [ + 'busybox@sha256:7ae8447f3a7f5bccaa765926f25fc038e425cf1b2be6748727bbea9a13102094', + undefined, + ], + [ + 'doesnotexist:foo', + `pull access denied for doesnotexist`, + ], + ])('pulling %p', async (image: string, err: string | undefined) => { + try { await Docker.pull(image, true); - })()).resolves.not.toThrow(); + if (err !== undefined) { + throw new Error('Expected an error to be thrown'); + } + } catch (e) { + if (err === undefined) { + throw new Error(`Expected no error, but got: ${e.message}`); + } + // eslint-disable-next-line jest/no-conditional-expect + expect(e.message).toContain(err); + } }, 600000); }); diff --git a/src/docker/docker.ts b/src/docker/docker.ts index 2f8bb3e..56dbba3 100644 --- a/src/docker/docker.ts +++ b/src/docker/docker.ts @@ -122,32 +122,43 @@ export class Docker { cacheFoundPath = await imageCache.find(); if (cacheFoundPath) { core.info(`Image found from cache in ${cacheFoundPath}`); - await Exec.getExecOutput(`docker`, ['load', '-i', cacheFoundPath]).catch(e => { - core.warning(`Failed to load image from cache: ${e}`); + await Exec.getExecOutput(`docker`, ['load', '-i', cacheFoundPath], { + ignoreReturnCode: true + }).then(res => { + if (res.stderr.length > 0 && res.exitCode != 0) { + core.warning(`Failed to load image from cache: ${res.stderr.match(/(.*)\s*$/)?.[0]?.trim() ?? 'unknown error'}`); + } }); } } let pulled = true; - await Exec.getExecOutput(`docker`, ['pull', image]).catch(e => { + await Exec.getExecOutput(`docker`, ['pull', image], { + ignoreReturnCode: true + }).then(res => { pulled = false; - if (cacheFoundPath) { - core.warning(`Failed to pull image, using one from cache: ${e}`); - } else { - throw new Error(e); + if (res.stderr.length > 0 && res.exitCode != 0) { + const err = res.stderr.match(/(.*)\s*$/)?.[0]?.trim() ?? 'unknown error'; + if (cacheFoundPath) { + core.warning(`Failed to pull image, using one from cache: ${err}`); + } else { + throw new Error(err); + } } }); if (cache && pulled) { const imageTarPath = path.join(Context.tmpDir(), `${Util.hash(image)}.tar`); - await Exec.getExecOutput(`docker`, ['save', '-o', imageTarPath, image]) - .then(async () => { + await Exec.getExecOutput(`docker`, ['save', '-o', imageTarPath, image], { + ignoreReturnCode: true + }).then(async res => { + if (res.stderr.length > 0 && res.exitCode != 0) { + core.warning(`Failed to save image: ${res.stderr.match(/(.*)\s*$/)?.[0]?.trim() ?? 'unknown error'}`); + } else { const cachePath = await imageCache.save(imageTarPath); core.info(`Image cached to ${cachePath}`); - }) - .catch(e => { - core.warning(`Failed to save image: ${e}`); - }); + } + }); } } }