Use built-in `getExecOutput`

Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
pull/94/head
CrazyMax 4 years ago
parent faca7837b0
commit 29f1eeb9e5
No known key found for this signature in database
GPG Key ID: 3248E46B6BB8C7F7

@ -1,18 +1,40 @@
import fs = require('fs'); import fs = require('fs');
import * as docker from '../src/docker';
import * as buildx from '../src/buildx'; import * as buildx from '../src/buildx';
import * as path from 'path'; import * as path from 'path';
import * as os from 'os'; import * as os from 'os';
import * as semver from 'semver'; import * as semver from 'semver';
import * as exec from '@actions/exec'; 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', () => { describe('getVersion', () => {
it('valid', async () => { async function isDaemonRunning() {
await exec.exec('docker', ['buildx', 'version']); return await exec
const version = await buildx.getVersion(); .getExecOutput(`docker`, ['version', '--format', '{{.Server.Os}}'], {
console.log(`version: ${version}`); ignoreReturnCode: true,
expect(semver.valid(version)).not.toBeNull(); silent: true
}, 100000); })
.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', () => { describe('parseVersion', () => {
@ -27,7 +49,14 @@ describe('parseVersion', () => {
describe('inspect', () => { describe('inspect', () => {
async function isDaemonRunning() { 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)( (isDaemonRunning() ? it : it.skip)(
'valid', 'valid',

10256
dist/index.js generated vendored

File diff suppressed because it is too large Load Diff

@ -3,9 +3,9 @@ import * as path from 'path';
import * as semver from 'semver'; import * as semver from 'semver';
import * as util from 'util'; import * as util from 'util';
import * as context from './context'; import * as context from './context';
import * as exec from './exec';
import * as github from './github'; import * as github from './github';
import * as core from '@actions/core'; import * as core from '@actions/core';
import * as exec from '@actions/exec';
import * as tc from '@actions/tool-cache'; import * as tc from '@actions/tool-cache';
export type Builder = { export type Builder = {
@ -18,77 +18,92 @@ export type Builder = {
node_platforms?: string; node_platforms?: string;
}; };
export async function isAvailable(): Promise<Boolean> {
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<string> { export async function getVersion(): Promise<string> {
return await exec.exec(`docker`, ['buildx', 'version'], true).then(res => { return await exec
if (res.stderr.length > 0 && !res.success) { .getExecOutput('docker', ['buildx', 'version'], {
throw new Error(res.stderr); ignoreReturnCode: true,
} silent: true
return parseVersion(res.stdout); })
}); .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<string> { export async function parseVersion(stdout: string): Promise<string> {
const matches = /\sv?([0-9.]+)/.exec(stdout); const matches = /\sv?([0-9.]+)/.exec(stdout);
if (!matches) { if (!matches) {
throw new Error(`Cannot parse Buildx version`); throw new Error(`Cannot parse buildx version`);
} }
return semver.clean(matches[1]); return semver.clean(matches[1]);
} }
export async function isAvailable(): Promise<Boolean> {
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<Builder> { export async function inspect(name: string): Promise<Builder> {
return await exec.exec(`docker`, ['buildx', 'inspect', name], true).then(res => { return await exec
if (res.stderr.length > 0 && !res.success) { .getExecOutput(`docker`, ['buildx', 'inspect', name], {
throw new Error(res.stderr); ignoreReturnCode: true,
} silent: true
const builder: Builder = {}; })
itlines: for (const line of res.stdout.trim().split(`\n`)) { .then(res => {
const [key, ...rest] = line.split(':'); if (res.stderr.length > 0 && res.exitCode != 0) {
const value = rest.map(v => v.trim()).join(':'); throw new Error(res.stderr.trim());
if (key.length == 0 || value.length == 0) {
continue;
} }
switch (key) { const builder: Builder = {};
case 'Name': { itlines: for (const line of res.stdout.trim().split(`\n`)) {
if (builder.name == undefined) { const [key, ...rest] = line.split(':');
builder.name = value; const value = rest.map(v => v.trim()).join(':');
} else { if (key.length == 0 || value.length == 0) {
builder.node_name = value; continue;
}
break;
}
case 'Driver': {
builder.driver = value;
break;
} }
case 'Endpoint': { switch (key) {
builder.node_endpoint = value; case 'Name': {
break; if (builder.name == undefined) {
} builder.name = value;
case 'Status': { } else {
builder.node_status = value; builder.node_name = value;
break; }
} break;
case 'Flags': { }
builder.node_flags = value; case 'Driver': {
break; builder.driver = value;
} break;
case 'Platforms': { }
builder.node_platforms = value.replace(/\s/g, ''); case 'Endpoint': {
break itlines; builder.node_endpoint = value;
break;
}
case 'Status': {
builder.node_status = value;
break;
}
case 'Flags': {
builder.node_flags = value;
break;
}
case 'Platforms': {
builder.node_platforms = value.replace(/\s/g, '');
break itlines;
}
} }
} }
} return builder;
return builder; });
});
} }
export async function install(inputVersion: string, dockerConfigHome: string): Promise<string> { export async function install(inputVersion: string, dockerConfigHome: string): Promise<string> {
@ -173,19 +188,29 @@ async function filename(version: string): Promise<string> {
} }
export async function getBuildKitVersion(containerID: string): Promise<string> { export async function getBuildKitVersion(containerID: string): Promise<string> {
return exec.exec(`docker`, ['inspect', '--format', '{{.Config.Image}}', containerID], true).then(bkitimage => { return exec
if (bkitimage.success && bkitimage.stdout.length > 0) { .getExecOutput(`docker`, ['inspect', '--format', '{{.Config.Image}}', containerID], {
return exec.exec(`docker`, ['run', '--rm', bkitimage.stdout, '--version'], true).then(bkitversion => { ignoreReturnCode: true,
if (bkitversion.success && bkitversion.stdout.length > 0) { silent: true
return `${bkitimage.stdout} => ${bkitversion.stdout}`; })
} else if (bkitversion.stderr.length > 0) { .then(bkitimage => {
core.warning(bkitversion.stderr); if (bkitimage.exitCode == 0 && bkitimage.stdout.length > 0) {
} return exec
return bkitversion.stdout; .getExecOutput(`docker`, ['run', '--rm', bkitimage.stdout, '--version'], {
}); ignoreReturnCode: true,
} else if (bkitimage.stderr.length > 0) { silent: true
core.warning(bkitimage.stderr); })
} .then(bkitversion => {
return bkitimage.stdout; if (bkitversion.exitCode == 0 && bkitversion.stdout.length > 0) {
}); return `${bkitimage.stdout} => ${bkitversion.stdout}`;
} else if (bkitversion.stderr.length > 0) {
core.warning(bkitversion.stderr.trim());
}
return bkitversion.stdout;
});
} else if (bkitimage.stderr.length > 0) {
core.warning(bkitimage.stderr.trim());
}
return bkitimage.stdout;
});
} }

@ -1,7 +0,0 @@
import * as exec from './exec';
export async function isDaemonRunning(): Promise<boolean> {
return await exec.exec(`docker`, ['version', '--format', '{{.Server.Os}}'], true).then(res => {
return !res.stdout.includes(' ') && res.success;
});
}

@ -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<ExecResult> => {
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()
};
};

@ -1,12 +1,11 @@
import * as core from '@actions/core';
import * as exec from '@actions/exec';
import * as os from 'os'; import * as os from 'os';
import * as path from 'path'; import * as path from 'path';
import * as semver from 'semver'; import * as semver from 'semver';
import * as buildx from './buildx'; import * as buildx from './buildx';
import * as context from './context'; import * as context from './context';
import * as mexec from './exec';
import * as stateHelper from './state-helper'; import * as stateHelper from './state-helper';
import * as core from '@actions/core';
import * as exec from '@actions/exec';
async function run(): Promise<void> { async function run(): Promise<void> {
try { try {
@ -94,21 +93,29 @@ async function run(): Promise<void> {
async function cleanup(): Promise<void> { async function cleanup(): Promise<void> {
if (stateHelper.IsDebug && stateHelper.containerName.length > 0) { if (stateHelper.IsDebug && stateHelper.containerName.length > 0) {
core.startGroup(`BuildKit container logs`); core.startGroup(`BuildKit container logs`);
await mexec.exec('docker', ['logs', `${stateHelper.containerName}`], false).then(res => { await exec
if (res.stderr.length > 0 && !res.success) { .getExecOutput('docker', ['logs', `${stateHelper.containerName}`], {
core.warning(res.stderr); ignoreReturnCode: true
} })
}); .then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
core.warning(res.stderr.trim());
}
});
core.endGroup(); core.endGroup();
} }
if (stateHelper.builderName.length > 0) { if (stateHelper.builderName.length > 0) {
core.startGroup(`Removing builder`); core.startGroup(`Removing builder`);
await mexec.exec('docker', ['buildx', 'rm', `${stateHelper.builderName}`], false).then(res => { await exec
if (res.stderr.length > 0 && !res.success) { .getExecOutput('docker', ['buildx', 'rm', `${stateHelper.builderName}`], {
core.warning(res.stderr); ignoreReturnCode: true
} })
}); .then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
core.warning(res.stderr.trim());
}
});
core.endGroup(); core.endGroup();
} }
} }

Loading…
Cancel
Save