feat(cli): add global remote builder configuration and native SSH buildx nodes for multi-platform builds

This commit is contained in:
2026-03-15 20:15:12 +00:00
parent 732e9e5cac
commit 3e0eb5e198
11 changed files with 2904 additions and 3099 deletions

View File

@@ -7,6 +7,7 @@ import * as ConfigModule from './tsdocker.config.js';
import { logger, ora } from './tsdocker.logging.js';
import { TsDockerManager } from './classes.tsdockermanager.js';
import { DockerContext } from './classes.dockercontext.js';
import { GlobalConfig } from './classes.globalconfig.js';
import type { IBuildCommandOptions } from './interfaces/index.js';
import { commitinfo } from './00_commitinfo_data.js';
@@ -33,6 +34,7 @@ COMMANDS
test [flags] Build and run container test scripts
login Authenticate with configured registries
list List discovered Dockerfiles
config <subcommand> [flags] Manage global tsdocker configuration
clean [-y] [--all] Interactive Docker resource cleanup
BUILD / PUSH OPTIONS
@@ -52,6 +54,17 @@ CLEAN OPTIONS
-y Auto-confirm all prompts
--all Include all images and volumes (not just dangling)
CONFIG SUBCOMMANDS
add-builder Add a remote builder node
--name=<n> Builder name (e.g. arm64-builder)
--host=<h> SSH host (e.g. user@192.168.1.100)
--platform=<p> Platform (e.g. linux/arm64)
--ssh-key=<path> SSH key path (optional)
remove-builder Remove a remote builder by name
--name=<n> Builder name to remove
list-builders List all configured remote builders
show Show full global config
CONFIGURATION
Configure via npmextra.json under the "@git.zone/tsdocker" key:
@@ -62,12 +75,17 @@ CONFIGURATION
push Boolean, auto-push after build
testDir Directory containing test_*.sh scripts
Global config is stored at ~/.git.zone/tsdocker/config.json
and managed via the "config" command.
EXAMPLES
tsdocker build
tsdocker build Dockerfile_app --platform=linux/arm64
tsdocker push --registry=ghcr.io
tsdocker test --verbose
tsdocker clean -y --all
tsdocker config add-builder --name=arm64 --host=user@host --platform=linux/arm64
tsdocker config list-builders
`;
console.log(manPage);
};
@@ -280,6 +298,76 @@ export let run = () => {
}
});
/**
* Manage global tsdocker configuration (remote builders, etc.)
* Usage: tsdocker config <subcommand> [--name=...] [--host=...] [--platform=...] [--ssh-key=...]
*/
tsdockerCli.addCommand('config').subscribe(async argvArg => {
try {
const subcommand = argvArg._[1] as string;
switch (subcommand) {
case 'add-builder': {
const name = argvArg.name as string;
const host = argvArg.host as string;
const platform = argvArg.platform as string;
const sshKeyPath = argvArg['ssh-key'] as string | undefined;
if (!name || !host || !platform) {
logger.log('error', 'Required: --name, --host, --platform');
logger.log('info', 'Usage: tsdocker config add-builder --name=arm64-builder --host=user@host --platform=linux/arm64 [--ssh-key=~/.ssh/id_ed25519]');
process.exit(1);
}
GlobalConfig.addBuilder({ name, host, platform, sshKeyPath });
logger.log('success', `Remote builder "${name}" configured: ${platform} via ssh://${host}`);
break;
}
case 'remove-builder': {
const name = argvArg.name as string;
if (!name) {
logger.log('error', 'Required: --name');
logger.log('info', 'Usage: tsdocker config remove-builder --name=arm64-builder');
process.exit(1);
}
GlobalConfig.removeBuilder(name);
logger.log('success', `Remote builder "${name}" removed`);
break;
}
case 'list-builders': {
const builders = GlobalConfig.getBuilders();
if (builders.length === 0) {
logger.log('info', 'No remote builders configured');
} else {
logger.log('info', `${builders.length} remote builder(s):`);
for (const b of builders) {
const keyInfo = b.sshKeyPath ? ` (key: ${b.sshKeyPath})` : '';
logger.log('info', ` ${b.name}: ${b.platform} via ssh://${b.host}${keyInfo}`);
}
}
break;
}
case 'show': {
const config = GlobalConfig.load();
logger.log('info', `Config file: ${GlobalConfig.getConfigPath()}`);
console.log(JSON.stringify(config, null, 2));
break;
}
default:
logger.log('error', `Unknown config subcommand: ${subcommand || '(none)'}`);
logger.log('info', 'Available: add-builder, remove-builder, list-builders, show');
process.exit(1);
}
} catch (err) {
logger.log('error', `Config failed: ${(err as Error).message}`);
process.exit(1);
}
});
tsdockerCli.addCommand('clean').subscribe(async argvArg => {
try {
const autoYes = !!argvArg.y;