1
0
Files
setup-buildx-action/src/main.ts
T

166 lines
5.7 KiB
TypeScript
Raw Normal View History

import * as os from 'os';
import * as path from 'path';
2022-03-21 13:43:41 +01:00
import * as uuid from 'uuid';
import * as buildx from './buildx';
import * as context from './context';
2022-04-17 17:22:03 +02:00
import * as docker from './docker';
import * as stateHelper from './state-helper';
2021-07-02 07:02:22 +02:00
import * as util from './util';
2021-06-23 16:11:52 +02:00
import * as core from '@actions/core';
import * as exec from '@actions/exec';
async function run(): Promise<void> {
try {
const inputs: context.Inputs = await context.getInputs();
const dockerConfigHome: string = process.env.DOCKER_CONFIG || path.join(os.homedir(), '.docker');
2022-04-17 17:22:03 +02:00
// standalone if docker cli not available
const standalone = !(await docker.isAvailable());
stateHelper.setStandalone(standalone);
core.startGroup(`Docker info`);
if (standalone) {
core.info(`Docker info skipped in standalone mode`);
} else {
await exec.exec('docker', ['version'], {
failOnStdErr: false
});
await exec.exec('docker', ['info'], {
failOnStdErr: false
});
}
core.endGroup();
2021-07-02 07:02:22 +02:00
if (util.isValidUrl(inputs.version)) {
2022-04-17 17:22:03 +02:00
if (standalone) {
throw new Error(`Cannot build from source without the Docker CLI`);
}
2021-07-02 07:02:22 +02:00
core.startGroup(`Build and install buildx`);
2022-04-17 17:22:03 +02:00
await buildx.build(inputs.version, dockerConfigHome, standalone);
2021-07-02 07:02:22 +02:00
core.endGroup();
2022-04-17 17:22:03 +02:00
} else if (!(await buildx.isAvailable(standalone)) || inputs.version) {
2021-07-02 07:02:22 +02:00
core.startGroup(`Download and install buildx`);
2022-04-17 17:22:03 +02:00
await buildx.install(inputs.version || 'latest', standalone ? context.tmpDir() : dockerConfigHome, standalone);
2020-10-20 22:29:53 +02:00
core.endGroup();
}
2022-04-17 17:22:03 +02:00
const buildxVersion = await buildx.getVersion(standalone);
await core.group(`Buildx version`, async () => {
const versionCmd = buildx.getCommand(['version'], standalone);
await exec.exec(versionCmd.commandLine, versionCmd.args, {
failOnStdErr: false
});
});
2022-03-21 13:43:41 +01:00
const builderName: string = inputs.driver == 'docker' ? 'default' : `builder-${uuid.v4()}`;
2021-04-23 18:14:38 +02:00
context.setOutput('name', builderName);
stateHelper.setBuilderName(builderName);
if (inputs.driver !== 'docker') {
2021-04-02 01:19:14 +02:00
core.startGroup(`Creating a new builder instance`);
2022-04-17 17:22:03 +02:00
const createArgs: Array<string> = ['create', '--name', builderName, '--driver', inputs.driver];
2021-07-02 07:02:22 +02:00
if (buildx.satisfies(buildxVersion, '>=0.3.0')) {
await context.asyncForEach(inputs.driverOpts, async driverOpt => {
createArgs.push('--driver-opt', driverOpt);
});
if (inputs.driver != 'remote' && inputs.buildkitdFlags) {
createArgs.push('--buildkitd-flags', inputs.buildkitdFlags);
}
2020-08-26 17:41:25 -07:00
}
if (inputs.use) {
2020-08-26 17:41:25 -07:00
createArgs.push('--use');
}
2020-09-08 15:52:09 +02:00
if (inputs.endpoint) {
createArgs.push(inputs.endpoint);
2020-09-06 16:37:52 +02:00
}
if (inputs.driver != 'remote') {
if (inputs.config) {
createArgs.push('--config', await buildx.getConfigFile(inputs.config));
} else if (inputs.configInline) {
createArgs.push('--config', await buildx.getConfigInline(inputs.configInline));
}
2021-04-21 18:37:54 +01:00
}
2022-04-17 17:22:03 +02:00
const createCmd = buildx.getCommand(createArgs, standalone);
await exec.exec(createCmd.commandLine, createCmd.args);
2020-10-20 22:29:53 +02:00
core.endGroup();
2021-04-02 01:19:14 +02:00
core.startGroup(`Booting builder`);
2022-04-17 17:22:03 +02:00
const bootstrapArgs: Array<string> = ['inspect', '--bootstrap'];
2021-07-02 07:02:22 +02:00
if (buildx.satisfies(buildxVersion, '>=0.4.0')) {
2021-01-04 19:03:58 +01:00
bootstrapArgs.push('--builder', builderName);
}
2022-04-17 17:22:03 +02:00
const bootstrapCmd = buildx.getCommand(bootstrapArgs, standalone);
await exec.exec(bootstrapCmd.commandLine, bootstrapCmd.args);
2020-10-20 22:29:53 +02:00
core.endGroup();
2020-08-26 17:41:25 -07:00
}
if (inputs.install) {
2022-04-17 17:22:03 +02:00
if (standalone) {
throw new Error(`Cannot set buildx as default builder without the Docker CLI`);
}
2021-04-02 01:19:14 +02:00
core.startGroup(`Setting buildx as default builder`);
await exec.exec('docker', ['buildx', 'install']);
2020-10-20 22:29:53 +02:00
core.endGroup();
}
2021-04-23 18:14:38 +02:00
core.startGroup(`Inspect builder`);
2022-04-17 17:22:03 +02:00
const builder = await buildx.inspect(builderName, standalone);
2021-04-23 18:14:38 +02:00
core.info(JSON.stringify(builder, undefined, 2));
context.setOutput('driver', builder.driver);
context.setOutput('endpoint', builder.node_endpoint);
context.setOutput('status', builder.node_status);
context.setOutput('flags', builder.node_flags);
context.setOutput('platforms', builder.node_platforms);
2020-10-20 22:29:53 +02:00
core.endGroup();
2021-04-23 22:08:40 +02:00
2022-04-17 17:22:03 +02:00
if (!standalone && inputs.driver == 'docker-container') {
2021-04-23 22:08:40 +02:00
stateHelper.setContainerName(`buildx_buildkit_${builder.node_name}`);
2021-04-28 18:08:43 +02:00
core.startGroup(`BuildKit version`);
core.info(await buildx.getBuildKitVersion(`buildx_buildkit_${builder.node_name}`));
core.endGroup();
2021-04-23 22:08:40 +02:00
}
if (core.isDebug() || builder.node_flags?.includes('--debug')) {
stateHelper.setDebug('true');
}
} catch (error) {
core.setFailed(error.message);
}
}
async function cleanup(): Promise<void> {
2021-04-23 22:08:40 +02:00
if (stateHelper.IsDebug && stateHelper.containerName.length > 0) {
core.startGroup(`BuildKit container logs`);
2021-06-23 16:11:52 +02:00
await exec
.getExecOutput('docker', ['logs', `${stateHelper.containerName}`], {
ignoreReturnCode: true
})
.then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
core.warning(res.stderr.trim());
}
});
2021-04-23 22:08:40 +02:00
core.endGroup();
}
if (stateHelper.builderName.length > 0) {
core.startGroup(`Removing builder`);
2022-04-17 17:22:03 +02:00
const rmCmd = buildx.getCommand(['rm', stateHelper.builderName], /true/i.test(stateHelper.standalone));
2021-06-23 16:11:52 +02:00
await exec
2022-04-17 17:22:03 +02:00
.getExecOutput(rmCmd.commandLine, rmCmd.args, {
2021-06-23 16:11:52 +02:00
ignoreReturnCode: true
})
.then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
core.warning(res.stderr.trim());
}
});
2021-04-23 22:08:40 +02:00
core.endGroup();
}
}
if (!stateHelper.IsPost) {
run();
} else {
cleanup();
}