docker: return actual error message when pull fails

Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
This commit is contained in:
CrazyMax
2024-04-12 11:43:34 +02:00
parent aa0228d826
commit fc4dae47b6
2 changed files with 52 additions and 20 deletions

View File

@@ -23,13 +23,34 @@ const maybe = !process.env.GITHUB_ACTIONS || (process.env.GITHUB_ACTIONS === 'tr
maybe('pull', () => { maybe('pull', () => {
// prettier-ignore // prettier-ignore
test.each([ test.each([
'busybox', [
'busybox:1.36', 'busybox',
'busybox@sha256:7ae8447f3a7f5bccaa765926f25fc038e425cf1b2be6748727bbea9a13102094' undefined,
])( ],
'pulling %s', async (image) => { [
await expect((async () => { '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); 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); }, 600000);
}); });

View File

@@ -122,32 +122,43 @@ export class Docker {
cacheFoundPath = await imageCache.find(); cacheFoundPath = await imageCache.find();
if (cacheFoundPath) { if (cacheFoundPath) {
core.info(`Image found from cache in ${cacheFoundPath}`); core.info(`Image found from cache in ${cacheFoundPath}`);
await Exec.getExecOutput(`docker`, ['load', '-i', cacheFoundPath]).catch(e => { await Exec.getExecOutput(`docker`, ['load', '-i', cacheFoundPath], {
core.warning(`Failed to load image from cache: ${e}`); 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; let pulled = true;
await Exec.getExecOutput(`docker`, ['pull', image]).catch(e => { await Exec.getExecOutput(`docker`, ['pull', image], {
ignoreReturnCode: true
}).then(res => {
pulled = false; pulled = false;
if (cacheFoundPath) { if (res.stderr.length > 0 && res.exitCode != 0) {
core.warning(`Failed to pull image, using one from cache: ${e}`); const err = res.stderr.match(/(.*)\s*$/)?.[0]?.trim() ?? 'unknown error';
} else { if (cacheFoundPath) {
throw new Error(e); core.warning(`Failed to pull image, using one from cache: ${err}`);
} else {
throw new Error(err);
}
} }
}); });
if (cache && pulled) { if (cache && pulled) {
const imageTarPath = path.join(Context.tmpDir(), `${Util.hash(image)}.tar`); const imageTarPath = path.join(Context.tmpDir(), `${Util.hash(image)}.tar`);
await Exec.getExecOutput(`docker`, ['save', '-o', imageTarPath, image]) await Exec.getExecOutput(`docker`, ['save', '-o', imageTarPath, image], {
.then(async () => { 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); const cachePath = await imageCache.save(imageTarPath);
core.info(`Image cached to ${cachePath}`); core.info(`Image cached to ${cachePath}`);
}) }
.catch(e => { });
core.warning(`Failed to save image: ${e}`);
});
} }
} }
} }