From 0a09638c5b0e77b28fa4d6eaec6639f679dc7c1e Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Tue, 29 Oct 2024 16:24:27 +0100 Subject: [PATCH] undock: run Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- __tests__/undock/undock.test.ts | 21 ++++++++++++ src/undock/undock.ts | 59 ++++++++++++++++++++++++++++++--- 2 files changed, 76 insertions(+), 4 deletions(-) diff --git a/__tests__/undock/undock.test.ts b/__tests__/undock/undock.test.ts index c8d2e71..14d6ddd 100644 --- a/__tests__/undock/undock.test.ts +++ b/__tests__/undock/undock.test.ts @@ -14,12 +14,33 @@ * limitations under the License. */ +import fs from 'fs'; +import os from 'os'; +import path from 'path'; import {describe, expect, it, jest, test} from '@jest/globals'; import * as semver from 'semver'; import {Exec} from '../../src/exec'; import {Undock} from '../../src/undock/undock'; +const tmpDir = fs.mkdtempSync(path.join(process.env.TEMP || os.tmpdir(), 'undock-undock-')); + +describe('run', () => { + it('extracts moby/moby-bin:26.1.5', async () => { + const undock = new Undock(); + await expect( + (async () => { + // prettier-ignore + await undock.run({ + source: 'moby/moby-bin:26.1.5', + dist: tmpDir, + all: true + }); + })() + ).resolves.not.toThrow(); + }, 100000); +}); + describe('isAvailable', () => { it('checks undock is available', async () => { const execSpy = jest.spyOn(Exec, 'getExecOutput'); diff --git a/src/undock/undock.ts b/src/undock/undock.ts index aac0858..f75b320 100644 --- a/src/undock/undock.ts +++ b/src/undock/undock.ts @@ -14,8 +14,6 @@ * limitations under the License. */ -import os from 'os'; -import path from 'path'; import * as core from '@actions/core'; import * as semver from 'semver'; @@ -25,6 +23,20 @@ export interface UndockOpts { binPath?: string; } +export interface UndockRunOpts { + source: string; + dist: string; + logLevel?: string; + logCaller?: boolean; + cacheDir?: string; + platform?: string; + all?: boolean; + include?: Array; + insecure?: boolean; + rmDist?: boolean; + wrap?: boolean; +} + export class Undock { private readonly binPath: string; private _version: string; @@ -36,8 +48,47 @@ export class Undock { this._versionOnce = false; } - static get cacheDir(): string { - return process.env.UNDOCK_CACHE_DIR || path.join(os.homedir(), '.local', 'share', 'undock', 'cache'); + public async run(opts: UndockRunOpts): Promise { + if (!opts.source) { + throw new Error('source is required'); + } + if (!opts.dist) { + throw new Error('dist is required'); + } + const args: Array = []; + if (opts.logLevel) { + args.push(`--log-level=${opts.logLevel}`); + } + if (opts.logCaller) { + args.push('--log-caller'); + } + if (opts.cacheDir) { + args.push(`--cachedir=${opts.cacheDir}`); + } + if (opts.platform) { + args.push(`--platform=${opts.platform}`); + } + if (opts.all) { + args.push('--all'); + } + if (opts.include) { + opts.include.forEach(i => { + args.push(`--include=${i}`); + }); + } + if (opts.insecure) { + args.push('--insecure'); + } + if (opts.rmDist) { + args.push('--rm-dist'); + } + if (opts.wrap) { + args.push('--wrap'); + } + args.push(opts.source, opts.dist); + await Exec.exec(this.binPath, args, { + failOnStdErr: false + }); } public async isAvailable(): Promise {