Use BuildPulse config

This commit is contained in:
Sid Dange 2025-02-20 10:37:40 -05:00
parent afeb29a6e0
commit 66bd59d4e8
10 changed files with 9110 additions and 2466 deletions

View file

@ -1,16 +1,21 @@
import * as crypto from 'crypto';
import * as core from '@actions/core';
import * as TOML from '@iarna/toml';
import {Docker} from '@docker/actions-toolkit/lib/docker/docker';
import {Util} from '@docker/actions-toolkit/lib/util';
import {Toolkit} from '@docker/actions-toolkit/lib/toolkit';
import {Node} from '@docker/actions-toolkit/lib/types/buildx/builder';
import path from 'path';
import * as fs from 'fs';
export const builderNodeEnvPrefix = 'BUILDER_NODE';
const defaultBuildkitdFlags = '--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host';
export interface Inputs {
buildpulseBuilder: string;
version: string;
name: string;
driver: string;
@ -29,8 +34,9 @@ export interface Inputs {
export async function getInputs(): Promise<Inputs> {
return {
buildpulseBuilder: core.getInput('buildpulse-builder'),
version: core.getInput('version'),
name: await getBuilderName(core.getInput('driver') || 'docker-container'),
name: core.getInput('name') || (await getBuilderName(core.getInput('driver') || 'docker-container')),
driver: core.getInput('driver') || 'docker-container',
driverOpts: Util.getInputList('driver-opts', {ignoreComma: true, quote: false}),
buildkitdFlags: core.getInput('buildkitd-flags'),
@ -51,11 +57,23 @@ export async function getBuilderName(driver: string): Promise<string> {
}
export async function getCreateArgs(inputs: Inputs, toolkit: Toolkit): Promise<Array<string>> {
const args: Array<string> = ['create', '--name', inputs.name, '--driver', inputs.driver];
const remoteBuilderEnabled = inputs.buildpulseBuilder && inputs.buildpulseBuilder.length > 0;
// if remote builder is enabled, use 'kubernetes' driver
const driverInput = remoteBuilderEnabled ? 'kubernetes' : inputs.driver;
const args: Array<string> = ['create', '--name', inputs.name, '--driver', driverInput];
if (await toolkit.buildx.versionSatisfies('>=0.3.0')) {
await Util.asyncForEach(inputs.driverOpts, async (driverOpt: string) => {
args.push('--driver-opt', driverOpt);
});
// if remote builder is enabled, specify which runner type to use
if (remoteBuilderEnabled) {
const arch = inputs.buildpulseBuilder.includes('arm64') ? 'arm64' : 'x64';
const remoteBuilderDriverOpt = `nodeselector=eks.amazonaws.com/nodegroup=eks-nodegroup-${inputs.buildpulseBuilder},namespace=${inputs.buildpulseBuilder},image=796224758921.dkr.ecr.us-east-1.amazonaws.com/moby/buildkit:buildx-stable-1-${arch}`;
args.push('--driver-opt', remoteBuilderDriverOpt);
}
if (inputs.buildkitdFlags) {
args.push('--buildkitd-flags', inputs.buildkitdFlags);
} else if (driverSupportsBuildkitdFlags(inputs.driver)) {
@ -68,17 +86,53 @@ export async function getCreateArgs(inputs: Inputs, toolkit: Toolkit): Promise<A
if (inputs.use) {
args.push('--use');
}
// modify BuildKit config to include local registry
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));
const newBuildkitConfigPath = await addClusterLocalRegistryConfigFile(inputs.buildkitdConfig);
args.push('--config', toolkit.buildkit.config.resolveFromFile(newBuildkitConfigPath));
} else {
const startingConfig = inputs.buildkitdConfigInline || '';
const newBuildKitToml = addClusterLocalRegistryConfig(startingConfig);
args.push('--config', toolkit.buildkit.config.resolveFromString(newBuildKitToml));
}
if (inputs.endpoint) {
args.push(inputs.endpoint);
}
return args;
}
async function addClusterLocalRegistryConfigFile(buildkitConfigPath: string): Promise<string> {
const configDir = path.dirname(buildkitConfigPath);
const newBuildkitConfigPath = path.join(configDir, 'buildpulse_buildkit.toml');
const buildkitConfigContent = await fs.promises.readFile(buildkitConfigPath, 'utf-8');
const newBuildkitConfigContent = addClusterLocalRegistryConfig(buildkitConfigContent);
await fs.promises.writeFile(newBuildkitConfigPath, newBuildkitConfigContent);
return newBuildkitConfigPath;
}
function addClusterLocalRegistryConfig(buildkitConfig: string): string {
const inlineToml = TOML.parse(buildkitConfig);
if (!inlineToml['registry']) {
inlineToml['registry'] = {};
}
const buildpulseDockerRegistry = process.env.BP_DOCKER_REGISTRY;
if (buildpulseDockerRegistry && buildpulseDockerRegistry.length && !inlineToml['registry'][buildpulseDockerRegistry]) {
inlineToml['registry'][buildpulseDockerRegistry] = {
http: true,
insecure: true
};
}
return TOML.stringify(inlineToml);
}
export async function getAppendArgs(inputs: Inputs, node: Node, toolkit: Toolkit): Promise<Array<string>> {
const args: Array<string> = ['create', '--name', inputs.name, '--append'];
if (node.name) {