feat(cli/buildx): add pull control for builds and isolate buildx builders per project

This commit is contained in:
2026-03-19 10:18:10 +00:00
parent 3e4558abc5
commit 8cf8e43e59
7 changed files with 41 additions and 18 deletions

View File

@@ -4,6 +4,7 @@ import { logger } from './tsdocker.logging.js';
export interface ISessionConfig {
sessionId: string;
projectHash: string;
registryPort: number;
registryHost: string;
registryContainerName: string;
@@ -17,8 +18,8 @@ export interface ISessionConfig {
* Generates unique ports, container names, and builder names so that
* concurrent CI jobs on the same Docker host don't collide.
*
* In local (non-CI) dev the builder suffix is empty, preserving the
* persistent builder behavior.
* In local (non-CI) dev the builder suffix contains a project hash so
* that concurrent runs in different project directories use separate builders.
*/
export class TsDockerSession {
public config: ISessionConfig;
@@ -34,16 +35,18 @@ export class TsDockerSession {
public static async create(): Promise<TsDockerSession> {
const sessionId =
process.env.TSDOCKER_SESSION_ID || crypto.randomBytes(4).toString('hex');
const projectHash = crypto.createHash('sha256').update(process.cwd()).digest('hex').substring(0, 8);
const registryPort = await TsDockerSession.allocatePort();
const registryHost = `localhost:${registryPort}`;
const registryContainerName = `tsdocker-registry-${sessionId}`;
const { isCI, ciSystem } = TsDockerSession.detectCI();
const builderSuffix = isCI ? `-${sessionId}` : '';
const builderSuffix = isCI ? `-${projectHash}-${sessionId}` : `-${projectHash}`;
const config: ISessionConfig = {
sessionId,
projectHash,
registryPort,
registryHost,
registryContainerName,
@@ -99,9 +102,10 @@ export class TsDockerSession {
logger.log('info', '=== TSDOCKER SESSION ===');
logger.log('info', `Session ID: ${c.sessionId}`);
logger.log('info', `Registry: ${c.registryHost} (container: ${c.registryContainerName})`);
logger.log('info', `Project hash: ${c.projectHash}`);
logger.log('info', `Builder suffix: ${c.builderSuffix}`);
if (c.isCI) {
logger.log('info', `CI detected: ${c.ciSystem}`);
logger.log('info', `Builder suffix: ${c.builderSuffix}`);
}
}
}