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

133 lines
4.7 KiB
TypeScript
Raw Permalink Normal View History

2024-10-07 14:16:41 +02:00
import * as crypto from 'crypto';
import * as core from '@actions/core';
2024-07-03 23:10:05 +02:00
2023-03-08 19:12:49 +01:00
import {Docker} from '@docker/actions-toolkit/lib/docker/docker';
2023-02-19 02:12:29 +01:00
import {Util} from '@docker/actions-toolkit/lib/util';
import {Toolkit} from '@docker/actions-toolkit/lib/toolkit';
2024-07-03 23:10:05 +02:00
import {Node} from '@docker/actions-toolkit/lib/types/buildx/builder';
2023-02-19 02:12:29 +01:00
export const builderNodeEnvPrefix = 'BUILDER_NODE';
2024-10-02 11:36:15 +02:00
const defaultBuildkitdFlags = '--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host';
2021-09-03 22:21:20 +02:00
export interface Inputs {
version: string;
name: string;
driver: string;
driverOpts: string[];
buildkitdFlags: string;
2024-03-01 08:57:18 +01:00
buildkitdConfig: string;
buildkitdConfigInline: string;
2022-09-22 11:54:00 +02:00
platforms: string[];
install: boolean;
use: boolean;
2020-09-08 15:52:09 +02:00
endpoint: string;
2022-09-19 11:34:47 +02:00
append: string;
cacheBinary: boolean;
cleanup: boolean;
}
export async function getInputs(): Promise<Inputs> {
return {
version: core.getInput('version'),
name: await getBuilderName(core.getInput('driver') || 'docker-container'),
driver: core.getInput('driver') || 'docker-container',
2023-02-19 02:12:29 +01:00
driverOpts: Util.getInputList('driver-opts', {ignoreComma: true, quote: false}),
2024-10-02 11:36:15 +02:00
buildkitdFlags: core.getInput('buildkitd-flags'),
2023-02-19 02:12:29 +01:00
platforms: Util.getInputList('platforms'),
2021-06-23 15:43:25 +02:00
install: core.getBooleanInput('install'),
use: core.getBooleanInput('use'),
2021-04-21 18:37:54 +01:00
endpoint: core.getInput('endpoint'),
2024-03-01 08:57:18 +01:00
buildkitdConfig: core.getInput('buildkitd-config') || core.getInput('config'),
buildkitdConfigInline: core.getInput('buildkitd-config-inline') || core.getInput('config-inline'),
append: core.getInput('append'),
cacheBinary: core.getBooleanInput('cache-binary'),
cleanup: core.getBooleanInput('cleanup')
};
}
export async function getBuilderName(driver: string): Promise<string> {
2024-10-07 14:16:41 +02:00
return driver == 'docker' ? await Docker.context() : `builder-${crypto.randomUUID()}`;
}
2023-02-19 02:12:29 +01:00
export async function getCreateArgs(inputs: Inputs, toolkit: Toolkit): Promise<Array<string>> {
const args: Array<string> = ['create', '--name', inputs.name, '--driver', inputs.driver];
2023-02-19 02:12:29 +01:00
if (await toolkit.buildx.versionSatisfies('>=0.3.0')) {
2024-10-02 11:36:15 +02:00
await Util.asyncForEach(inputs.driverOpts, async (driverOpt: string) => {
args.push('--driver-opt', driverOpt);
});
2024-10-02 11:36:15 +02:00
if (inputs.buildkitdFlags) {
args.push('--buildkitd-flags', inputs.buildkitdFlags);
2024-10-02 11:36:15 +02:00
} else if (driverSupportsBuildkitdFlags(inputs.driver)) {
args.push('--buildkitd-flags', defaultBuildkitdFlags);
}
}
2022-09-22 11:54:00 +02:00
if (inputs.platforms.length > 0) {
args.push('--platform', inputs.platforms.join(','));
}
if (inputs.use) {
args.push('--use');
}
2024-10-02 11:36:15 +02:00
if (inputs.buildkitdConfig) {
args.push('--config', toolkit.buildkit.config.resolveFromFile(inputs.buildkitdConfig));
} else if (inputs.buildkitdConfigInline) {
args.push('--config', toolkit.buildkit.config.resolveFromString(inputs.buildkitdConfigInline));
}
if (inputs.endpoint) {
args.push(inputs.endpoint);
}
return args;
}
2023-02-19 02:12:29 +01:00
export async function getAppendArgs(inputs: Inputs, node: Node, toolkit: Toolkit): Promise<Array<string>> {
2022-09-19 11:34:47 +02:00
const args: Array<string> = ['create', '--name', inputs.name, '--append'];
if (node.name) {
args.push('--node', node.name);
} else if (inputs.driver == 'kubernetes' && (await toolkit.buildx.versionSatisfies('<0.11.0'))) {
2024-10-07 14:16:41 +02:00
args.push('--node', `node-${crypto.randomUUID()}`);
2022-09-19 11:34:47 +02:00
}
2023-02-19 02:12:29 +01:00
if (node['driver-opts'] && (await toolkit.buildx.versionSatisfies('>=0.3.0'))) {
2024-10-02 11:36:15 +02:00
await Util.asyncForEach(node['driver-opts'], async (driverOpt: string) => {
2022-09-19 11:34:47 +02:00
args.push('--driver-opt', driverOpt);
});
2024-10-02 11:36:15 +02:00
if (node['buildkitd-flags']) {
2022-09-19 11:34:47 +02:00
args.push('--buildkitd-flags', node['buildkitd-flags']);
2024-10-02 11:36:15 +02:00
} else if (driverSupportsBuildkitdFlags(inputs.driver)) {
args.push('--buildkitd-flags', defaultBuildkitdFlags);
2022-09-19 11:34:47 +02:00
}
}
if (node.platforms) {
args.push('--platform', node.platforms);
}
if (node.endpoint) {
args.push(node.endpoint);
}
return args;
}
2023-02-19 02:12:29 +01:00
export async function getInspectArgs(inputs: Inputs, toolkit: Toolkit): Promise<Array<string>> {
const args: Array<string> = ['inspect', '--bootstrap'];
2023-02-19 02:12:29 +01:00
if (await toolkit.buildx.versionSatisfies('>=0.4.0')) {
args.push('--builder', inputs.name);
}
return args;
}
2024-10-02 11:36:15 +02:00
function driverSupportsBuildkitdFlags(driver: string): boolean {
return driver == '' || driver == 'docker-container' || driver == 'docker' || driver == 'kubernetes';
}
export function getVersion(inputs: Inputs): string {
const version = inputs.version;
if (inputs.driver === 'cloud') {
if (!version || version === 'latest') {
return 'cloud:latest';
}
if (version.startsWith('cloud:') || version.startsWith('lab:')) {
return version;
}
return `cloud:${version}`;
}
return version;
}