Files
szci/ts/manager.docker/index.ts

79 lines
2.2 KiB
TypeScript

import { logger } from '../szci.logging.ts';
import { bash } from '../szci.bash.ts';
import { Szci } from '../szci.classes.szci.ts';
export class SzciDockerManager {
public szciRef: Szci;
constructor(szciArg: Szci) {
this.szciRef = szciArg;
}
/**
* Bridges SZCI_LOGIN_DOCKER* env vars to DOCKER_REGISTRY_N format for tsdocker,
* and handles GitLab CI registry auto-login.
*/
private bridgeEnvVars() {
const env = Deno.env.toObject();
// Bridge GitLab CI registry as DOCKER_REGISTRY_0
if (env['GITLAB_CI']) {
const ciJobToken = env['CI_JOB_TOKEN'];
if (!ciJobToken) {
logger.log('error', 'Running in GitLab CI, but no CI_JOB_TOKEN found!');
Deno.exit(1);
}
Deno.env.set('DOCKER_REGISTRY_0', `registry.gitlab.com|gitlab-ci-token|${ciJobToken}`);
}
// Bridge SZCI_LOGIN_DOCKER* → DOCKER_REGISTRY_N
let registryIndex = 1;
const sortedKeys = Object.keys(env)
.filter((key) => key.startsWith('SZCI_LOGIN_DOCKER'))
.sort();
for (const key of sortedKeys) {
Deno.env.set(`DOCKER_REGISTRY_${registryIndex}`, env[key]);
registryIndex++;
}
}
/**
* Handle cli input by bridging env vars and delegating to tsdocker.
*/
public handleCli = async (argvArg: any) => {
if (argvArg._.length < 2) {
logger.log(
'info',
`>>szci docker ...<< cli arguments invalid... Please read the documentation.`
);
return;
}
this.bridgeEnvVars();
const action: string = argvArg._[1];
const extraArgs = argvArg._.slice(2).join(' ');
switch (action) {
case 'build':
await bash(`npx @git.zone/tsdocker build ${extraArgs}`.trim());
break;
case 'login':
case 'prepare':
await bash(`npx @git.zone/tsdocker login ${extraArgs}`.trim());
break;
case 'test':
await bash(`npx @git.zone/tsdocker test ${extraArgs}`.trim());
break;
case 'push':
await bash(`npx @git.zone/tsdocker push ${extraArgs}`.trim());
break;
case 'pull':
await bash(`npx @git.zone/tsdocker pull ${extraArgs}`.trim());
break;
default:
logger.log('error', `>>szci docker ...<< action >>${action}<< not supported`);
}
};
}