From 622563f197ce18729cb9910c60128ed3c60257c7 Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Tue, 8 Jun 2021 20:27:13 +0200 Subject: [PATCH] Use built-in `getExecOutput` --- __tests__/buildx.test.ts | 19 +++++++- dist/index.js | 97 ++++++++++------------------------------ src/buildx.ts | 38 ++++++++++------ src/exec.ts | 34 -------------- src/main.ts | 15 ++++--- 5 files changed, 75 insertions(+), 128 deletions(-) delete mode 100644 src/exec.ts diff --git a/__tests__/buildx.test.ts b/__tests__/buildx.test.ts index 072b011..d415906 100644 --- a/__tests__/buildx.test.ts +++ b/__tests__/buildx.test.ts @@ -2,9 +2,26 @@ import * as semver from 'semver'; import * as buildx from '../src/buildx'; import * as exec from '@actions/exec'; +describe('isAvailable', async () => { + const execSpy: jest.SpyInstance = jest.spyOn(exec, 'getExecOutput'); + execSpy.mockImplementation(() => + Promise.resolve({ + exitCode: expect.any(Number), + stdout: expect.any(Function), + stderr: expect.any(Function) + }) + ); + + await buildx.isAvailable(); + + expect(execSpy).toHaveBeenCalledWith(`docker`, ['buildx'], { + silent: true, + ignoreReturnCode: true + }); +}); + describe('getVersion', () => { it('valid', async () => { - await exec.exec('docker', ['buildx', 'version']); const version = await buildx.getVersion(); console.log(`version: ${version}`); expect(semver.valid(version)).not.toBeNull(); diff --git a/dist/index.js b/dist/index.js index 19ab141..c8ebebb 100644 --- a/dist/index.js +++ b/dist/index.js @@ -518,7 +518,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge Object.defineProperty(exports, "__esModule", { value: true }); const buildx = __importStar(__webpack_require__(295)); const context = __importStar(__webpack_require__(842)); -const mexec = __importStar(__webpack_require__(757)); const core = __importStar(__webpack_require__(186)); const exec = __importStar(__webpack_require__(514)); function run() { @@ -538,9 +537,13 @@ function run() { core.startGroup(`Bake definition`); yield exec.exec('docker', [...args, '--print']); core.endGroup(); - yield mexec.exec('docker', args).then(res => { - if (res.stderr.length > 0 && !res.success) { - throw new Error(`buildx bake failed with: ${res.stderr.match(/(.*)\s*$/)[0]}`); + yield exec + .getExecOutput('docker', args, { + ignoreReturnCode: true + }) + .then(res => { + if (res.stderr.length > 0 && res.exitCode != 0) { + throw new Error(`buildx bake failed with: ${res.stderr.match(/(.*)\s*$/)[0].trim()}`); } }); } @@ -2116,22 +2119,32 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge Object.defineProperty(exports, "__esModule", { value: true }); exports.parseVersion = exports.getVersion = exports.isAvailable = void 0; const semver = __importStar(__webpack_require__(383)); -const exec = __importStar(__webpack_require__(757)); +const exec = __importStar(__webpack_require__(514)); function isAvailable() { return __awaiter(this, void 0, void 0, function* () { - return yield exec.exec(`docker`, ['buildx'], true).then(res => { - if (res.stderr != '' && !res.success) { + return yield exec + .getExecOutput('docker', ['buildx'], { + ignoreReturnCode: true, + silent: true + }) + .then(res => { + if (res.stderr.length > 0 && res.exitCode != 0) { return false; } - return res.success; + return res.exitCode == 0; }); }); } exports.isAvailable = isAvailable; function getVersion() { return __awaiter(this, void 0, void 0, function* () { - return yield exec.exec(`docker`, ['buildx', 'version'], true).then(res => { - if (res.stderr != '' && !res.success) { + return yield exec + .getExecOutput('docker', ['buildx', 'version'], { + ignoreReturnCode: true, + silent: true + }) + .then(res => { + if (res.stderr.length > 0 && res.exitCode != 0) { throw new Error(res.stderr); } return parseVersion(res.stdout); @@ -2143,7 +2156,7 @@ function parseVersion(stdout) { return __awaiter(this, void 0, void 0, function* () { const matches = /\sv?([0-9.]+)/.exec(stdout); if (!matches) { - throw new Error(`Cannot parse Buildx version`); + throw new Error(`Cannot parse buildx version`); } return semver.clean(matches[1]); }); @@ -3962,68 +3975,6 @@ module.exports = function(data, options={}){ } -/***/ }), - -/***/ 757: -/***/ (function(__unusedmodule, exports, __webpack_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.exec = void 0; -const aexec = __importStar(__webpack_require__(514)); -exports.exec = (command, args = [], silent) => __awaiter(void 0, void 0, void 0, function* () { - let stdout = ''; - let stderr = ''; - const options = { - silent: silent, - ignoreReturnCode: true - }; - options.listeners = { - stdout: (data) => { - stdout += data.toString(); - }, - stderr: (data) => { - stderr += data.toString(); - } - }; - const returnCode = yield aexec.exec(command, args, options); - return { - success: returnCode === 0, - stdout: stdout.trim(), - stderr: stderr.trim() - }; -}); -//# sourceMappingURL=exec.js.map - /***/ }), /***/ 785: diff --git a/src/buildx.ts b/src/buildx.ts index 2e52876..a6ac9c1 100644 --- a/src/buildx.ts +++ b/src/buildx.ts @@ -1,28 +1,38 @@ import * as semver from 'semver'; -import * as exec from './exec'; +import * as exec from '@actions/exec'; export async function isAvailable(): Promise { - return await exec.exec(`docker`, ['buildx'], true).then(res => { - if (res.stderr != '' && !res.success) { - return false; - } - return res.success; - }); + return await exec + .getExecOutput('docker', ['buildx'], { + ignoreReturnCode: true, + silent: true + }) + .then(res => { + if (res.stderr.length > 0 && res.exitCode != 0) { + return false; + } + return res.exitCode == 0; + }); } export async function getVersion(): Promise { - return await exec.exec(`docker`, ['buildx', 'version'], true).then(res => { - if (res.stderr != '' && !res.success) { - throw new Error(res.stderr); - } - return parseVersion(res.stdout); - }); + return await exec + .getExecOutput('docker', ['buildx', 'version'], { + ignoreReturnCode: true, + silent: true + }) + .then(res => { + if (res.stderr.length > 0 && res.exitCode != 0) { + throw new Error(res.stderr); + } + return parseVersion(res.stdout); + }); } export async function parseVersion(stdout: string): Promise { const matches = /\sv?([0-9.]+)/.exec(stdout); if (!matches) { - throw new Error(`Cannot parse Buildx version`); + throw new Error(`Cannot parse buildx version`); } return semver.clean(matches[1]); } diff --git a/src/exec.ts b/src/exec.ts deleted file mode 100644 index 00257e1..0000000 --- a/src/exec.ts +++ /dev/null @@ -1,34 +0,0 @@ -import * as aexec from '@actions/exec'; -import {ExecOptions} from '@actions/exec'; - -export interface ExecResult { - success: boolean; - stdout: string; - stderr: string; -} - -export const exec = async (command: string, args: string[] = [], silent?: boolean): Promise => { - let stdout: string = ''; - let stderr: string = ''; - - const options: ExecOptions = { - silent: silent, - ignoreReturnCode: true - }; - options.listeners = { - stdout: (data: Buffer) => { - stdout += data.toString(); - }, - stderr: (data: Buffer) => { - stderr += data.toString(); - } - }; - - const returnCode: number = await aexec.exec(command, args, options); - - return { - success: returnCode === 0, - stdout: stdout.trim(), - stderr: stderr.trim() - }; -}; diff --git a/src/main.ts b/src/main.ts index 2bac793..0d8d209 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,5 @@ import * as buildx from './buildx'; import * as context from './context'; -import * as mexec from './exec'; import * as core from '@actions/core'; import * as exec from '@actions/exec'; @@ -24,11 +23,15 @@ async function run(): Promise { await exec.exec('docker', [...args, '--print']); core.endGroup(); - await mexec.exec('docker', args).then(res => { - if (res.stderr.length > 0 && !res.success) { - throw new Error(`buildx bake failed with: ${res.stderr.match(/(.*)\s*$/)![0]}`); - } - }); + await exec + .getExecOutput('docker', args, { + ignoreReturnCode: true + }) + .then(res => { + if (res.stderr.length > 0 && res.exitCode != 0) { + throw new Error(`buildx bake failed with: ${res.stderr.match(/(.*)\s*$/)![0].trim()}`); + } + }); } catch (error) { core.setFailed(error.message); }