From da128399b4d7c09241ea56d1c457968127a42c4d Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Wed, 23 Jun 2021 16:07:03 +0200 Subject: [PATCH] Use built-in `getExecOutput` Signed-off-by: CrazyMax --- __tests__/buildx.test.ts | 45 ++++++++++++++++++++----- src/buildx.ts | 71 +++++++++++++++++++++++++--------------- src/docker.ts | 7 ---- src/exec.ts | 34 ------------------- src/main.ts | 21 +++++++----- 5 files changed, 94 insertions(+), 84 deletions(-) delete mode 100644 src/docker.ts delete mode 100644 src/exec.ts diff --git a/__tests__/buildx.test.ts b/__tests__/buildx.test.ts index de68108d..9b98f87a 100644 --- a/__tests__/buildx.test.ts +++ b/__tests__/buildx.test.ts @@ -1,18 +1,40 @@ import fs = require('fs'); -import * as docker from '../src/docker'; import * as buildx from '../src/buildx'; import * as path from 'path'; import * as os from 'os'; import * as semver from 'semver'; import * as exec from '@actions/exec'; +describe('isAvailable', () => { + const execSpy: jest.SpyInstance = jest.spyOn(exec, 'getExecOutput'); + 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(); - }, 100000); + async function isDaemonRunning() { + return await exec + .getExecOutput(`docker`, ['version', '--format', '{{.Server.Os}}'], { + ignoreReturnCode: true, + silent: true + }) + .then(res => { + return !res.stdout.includes(' ') && res.exitCode == 0; + }); + } + (isDaemonRunning() ? it : it.skip)( + 'valid', + async () => { + const version = await buildx.getVersion(); + console.log(`version: ${version}`); + expect(semver.valid(version)).not.toBeNull(); + }, + 100000 + ); }); describe('parseVersion', () => { @@ -27,7 +49,14 @@ describe('parseVersion', () => { describe('inspect', () => { async function isDaemonRunning() { - return await docker.isDaemonRunning(); + return await exec + .getExecOutput(`docker`, ['version', '--format', '{{.Server.Os}}'], { + ignoreReturnCode: true, + silent: true + }) + .then(res => { + return !res.stdout.includes(' ') && res.exitCode == 0; + }); } (isDaemonRunning() ? it : it.skip)( 'valid', diff --git a/src/buildx.ts b/src/buildx.ts index 65a1dcc0..ff5c6665 100644 --- a/src/buildx.ts +++ b/src/buildx.ts @@ -3,9 +3,9 @@ import * as path from 'path'; import * as semver from 'semver'; import * as util from 'util'; import * as context from './context'; -import * as exec from './exec'; import * as github from './github'; import * as core from '@actions/core'; +import * as exec from '@actions/exec'; import * as tc from '@actions/tool-cache'; export type Builder = { @@ -18,36 +18,49 @@ export type Builder = { node_platforms?: string; }; +export async function isAvailable(): Promise { + 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.length > 0 && !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.trim()); + } + 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]); } -export async function isAvailable(): Promise { - return await exec.exec(`docker`, ['buildx'], true).then(res => { - if (res.stderr.length > 0 && !res.success) { - return false; - } - return res.success; - }); -} - export async function inspect(name: string): Promise { - return await exec.exec(`docker`, ['buildx', 'inspect', name], true).then(res => { - if (res.stderr.length > 0 && !res.success) { - throw new Error(res.stderr); + return await exec.getExecOutput(`docker`, ['buildx', 'inspect', name], { + ignoreReturnCode: true, + silent: true + }).then(res => { + if (res.stderr.length > 0 && res.exitCode != 0) { + throw new Error(res.stderr.trim()); } const builder: Builder = {}; itlines: for (const line of res.stdout.trim().split(`\n`)) { @@ -173,18 +186,24 @@ async function filename(version: string): Promise { } export async function getBuildKitVersion(containerID: string): Promise { - return exec.exec(`docker`, ['inspect', '--format', '{{.Config.Image}}', containerID], true).then(bkitimage => { - if (bkitimage.success && bkitimage.stdout.length > 0) { - return exec.exec(`docker`, ['run', '--rm', bkitimage.stdout, '--version'], true).then(bkitversion => { - if (bkitversion.success && bkitversion.stdout.length > 0) { + return exec.getExecOutput(`docker`, ['inspect', '--format', '{{.Config.Image}}', containerID], { + ignoreReturnCode: true, + silent: true + }).then(bkitimage => { + if (bkitimage.exitCode == 0 && bkitimage.stdout.length > 0) { + return exec.getExecOutput(`docker`, ['run', '--rm', bkitimage.stdout, '--version'], { + ignoreReturnCode: true, + silent: true + }).then(bkitversion => { + if (bkitversion.exitCode == 0 && bkitversion.stdout.length > 0) { return `${bkitimage.stdout} => ${bkitversion.stdout}`; } else if (bkitversion.stderr.length > 0) { - core.warning(bkitversion.stderr); + core.warning(bkitversion.stderr.trim()); } return bkitversion.stdout; }); } else if (bkitimage.stderr.length > 0) { - core.warning(bkitimage.stderr); + core.warning(bkitimage.stderr.trim()); } return bkitimage.stdout; }); diff --git a/src/docker.ts b/src/docker.ts deleted file mode 100644 index a35b384b..00000000 --- a/src/docker.ts +++ /dev/null @@ -1,7 +0,0 @@ -import * as exec from './exec'; - -export async function isDaemonRunning(): Promise { - return await exec.exec(`docker`, ['version', '--format', '{{.Server.Os}}'], true).then(res => { - return !res.stdout.includes(' ') && res.success; - }); -} diff --git a/src/exec.ts b/src/exec.ts deleted file mode 100644 index 3d0c4ced..00000000 --- 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 b4f29555..d2b8ab43 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,12 +1,11 @@ -import * as core from '@actions/core'; -import * as exec from '@actions/exec'; import * as os from 'os'; import * as path from 'path'; import * as semver from 'semver'; import * as buildx from './buildx'; import * as context from './context'; -import * as mexec from './exec'; import * as stateHelper from './state-helper'; +import * as core from '@actions/core'; +import * as exec from '@actions/exec'; async function run(): Promise { try { @@ -94,9 +93,11 @@ async function run(): Promise { async function cleanup(): Promise { if (stateHelper.IsDebug && stateHelper.containerName.length > 0) { core.startGroup(`BuildKit container logs`); - await mexec.exec('docker', ['logs', `${stateHelper.containerName}`], false).then(res => { - if (res.stderr.length > 0 && !res.success) { - core.warning(res.stderr); + await exec.getExecOutput('docker', ['logs', `${stateHelper.containerName}`], { + ignoreReturnCode: true + }).then(res => { + if (res.stderr.length > 0 && res.exitCode != 0) { + core.warning(res.stderr.trim()); } }); core.endGroup(); @@ -104,9 +105,11 @@ async function cleanup(): Promise { if (stateHelper.builderName.length > 0) { core.startGroup(`Removing builder`); - await mexec.exec('docker', ['buildx', 'rm', `${stateHelper.builderName}`], false).then(res => { - if (res.stderr.length > 0 && !res.success) { - core.warning(res.stderr); + await exec.getExecOutput('docker', ['buildx', 'rm', `${stateHelper.builderName}`], { + ignoreReturnCode: true + }).then(res => { + if (res.stderr.length > 0 && res.exitCode != 0) { + core.warning(res.stderr.trim()); } }); core.endGroup();