feat(cli): add global remote builder configuration and native SSH buildx nodes for multi-platform builds
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user