@git.zone/tsdocker 1.2.43 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/cli.js +1 -1
  2. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  3. package/dist_ts/00_commitinfo_data.js +9 -0
  4. package/dist_ts/classes.dockerfile.d.ts +85 -0
  5. package/dist_ts/classes.dockerfile.js +366 -0
  6. package/dist_ts/classes.dockerregistry.d.ts +29 -0
  7. package/dist_ts/classes.dockerregistry.js +83 -0
  8. package/dist_ts/classes.registrystorage.d.ts +35 -0
  9. package/dist_ts/classes.registrystorage.js +76 -0
  10. package/dist_ts/classes.tsdockermanager.d.ts +53 -0
  11. package/dist_ts/classes.tsdockermanager.js +222 -0
  12. package/dist_ts/index.d.ts +1 -0
  13. package/dist_ts/index.js +4 -0
  14. package/dist_ts/interfaces/index.d.ts +68 -0
  15. package/dist_ts/interfaces/index.js +2 -0
  16. package/dist_ts/tsdocker.cli.d.ts +1 -0
  17. package/dist_ts/tsdocker.cli.js +179 -0
  18. package/dist_ts/tsdocker.config.d.ts +5 -0
  19. package/dist_ts/tsdocker.config.js +37 -0
  20. package/dist_ts/tsdocker.docker.d.ts +2 -0
  21. package/dist_ts/tsdocker.docker.js +145 -0
  22. package/dist_ts/tsdocker.logging.d.ts +3 -0
  23. package/dist_ts/tsdocker.logging.js +15 -0
  24. package/dist_ts/tsdocker.paths.d.ts +4 -0
  25. package/dist_ts/tsdocker.paths.js +13 -0
  26. package/dist_ts/tsdocker.plugins.d.ts +16 -0
  27. package/dist_ts/tsdocker.plugins.js +19 -0
  28. package/dist_ts/tsdocker.snippets.d.ts +5 -0
  29. package/dist_ts/tsdocker.snippets.js +26 -0
  30. package/npmextra.json +12 -6
  31. package/package.json +26 -21
  32. package/readme.hints.md +95 -26
  33. package/readme.md +32 -33
  34. package/ts/00_commitinfo_data.ts +1 -1
  35. package/ts/classes.dockerfile.ts +462 -0
  36. package/ts/classes.dockerregistry.ts +91 -0
  37. package/ts/classes.registrystorage.ts +83 -0
  38. package/ts/classes.tsdockermanager.ts +254 -0
  39. package/ts/index.ts +2 -2
  40. package/ts/interfaces/index.ts +70 -0
  41. package/ts/tsdocker.cli.ts +129 -16
  42. package/ts/tsdocker.config.ts +17 -10
  43. package/ts/tsdocker.docker.ts +6 -6
  44. package/ts/tsdocker.logging.ts +1 -1
  45. package/ts/tsdocker.paths.ts +6 -1
  46. package/ts/tsdocker.plugins.ts +2 -0
  47. package/ts/tsdocker.snippets.ts +5 -8
package/cli.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
  process.env.CLI_CALL = 'true';
3
- require('./dist/index');
3
+ import('./dist_ts/index.js');
@@ -0,0 +1,8 @@
1
+ /**
2
+ * autocreated commitinfo by @push.rocks/commitinfo
3
+ */
4
+ export declare const commitinfo: {
5
+ name: string;
6
+ version: string;
7
+ description: string;
8
+ };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * autocreated commitinfo by @push.rocks/commitinfo
3
+ */
4
+ export const commitinfo = {
5
+ name: '@git.zone/tsdocker',
6
+ version: '1.4.0',
7
+ description: 'develop npm modules cross platform with docker'
8
+ };
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxvQkFBb0I7SUFDMUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLGdEQUFnRDtDQUM5RCxDQUFBIn0=
@@ -0,0 +1,85 @@
1
+ import { DockerRegistry } from './classes.dockerregistry.js';
2
+ import type { IDockerfileOptions } from './interfaces/index.js';
3
+ import type { TsDockerManager } from './classes.tsdockermanager.js';
4
+ /**
5
+ * Class Dockerfile represents a Dockerfile on disk
6
+ */
7
+ export declare class Dockerfile {
8
+ /**
9
+ * Creates instances of class Dockerfile for all Dockerfiles in cwd
10
+ */
11
+ static readDockerfiles(managerRef: TsDockerManager): Promise<Dockerfile[]>;
12
+ /**
13
+ * Sorts Dockerfiles into a build order based on dependencies (topological sort)
14
+ */
15
+ static sortDockerfiles(dockerfiles: Dockerfile[]): Promise<Dockerfile[]>;
16
+ /**
17
+ * Maps local Dockerfiles dependencies to the corresponding Dockerfile class instances
18
+ */
19
+ static mapDockerfiles(sortedDockerfileArray: Dockerfile[]): Promise<Dockerfile[]>;
20
+ /**
21
+ * Builds the corresponding real docker image for each Dockerfile class instance
22
+ */
23
+ static buildDockerfiles(sortedArrayArg: Dockerfile[]): Promise<Dockerfile[]>;
24
+ /**
25
+ * Tests all Dockerfiles by calling Dockerfile.test()
26
+ */
27
+ static testDockerfiles(sortedArrayArg: Dockerfile[]): Promise<Dockerfile[]>;
28
+ /**
29
+ * Returns a version for a docker file
30
+ * Dockerfile_latest -> latest
31
+ * Dockerfile_v1.0.0 -> v1.0.0
32
+ * Dockerfile -> latest
33
+ */
34
+ static dockerFileVersion(dockerfileInstanceArg: Dockerfile, dockerfileNameArg: string): string;
35
+ /**
36
+ * Extracts the base image from a Dockerfile content
37
+ * Handles ARG substitution for variable base images
38
+ */
39
+ static dockerBaseImage(dockerfileContentArg: string): string;
40
+ /**
41
+ * Substitutes variables in a string, supporting default values like ${VAR:-default}
42
+ */
43
+ private static substituteVariables;
44
+ /**
45
+ * Returns the docker tag string for a given registry and repo
46
+ */
47
+ static getDockerTagString(managerRef: TsDockerManager, registryArg: string, repoArg: string, versionArg: string, suffixArg?: string): string;
48
+ /**
49
+ * Gets build args from environment variable mapping
50
+ */
51
+ static getDockerBuildArgs(managerRef: TsDockerManager): Promise<string>;
52
+ managerRef: TsDockerManager;
53
+ filePath: string;
54
+ repo: string;
55
+ version: string;
56
+ cleanTag: string;
57
+ buildTag: string;
58
+ pushTag: string;
59
+ containerName: string;
60
+ content: string;
61
+ baseImage: string;
62
+ localBaseImageDependent: boolean;
63
+ localBaseDockerfile: Dockerfile;
64
+ constructor(managerRefArg: TsDockerManager, options: IDockerfileOptions);
65
+ /**
66
+ * Builds the Dockerfile
67
+ */
68
+ build(): Promise<void>;
69
+ /**
70
+ * Pushes the Dockerfile to a registry
71
+ */
72
+ push(dockerRegistryArg: DockerRegistry, versionSuffix?: string): Promise<void>;
73
+ /**
74
+ * Pulls the Dockerfile from a registry
75
+ */
76
+ pull(registryArg: DockerRegistry, versionSuffixArg?: string): Promise<void>;
77
+ /**
78
+ * Tests the Dockerfile by running a test script if it exists
79
+ */
80
+ test(): Promise<void>;
81
+ /**
82
+ * Gets the ID of a built Docker image
83
+ */
84
+ getId(): Promise<string>;
85
+ }
@@ -0,0 +1,366 @@
1
+ import * as plugins from './tsdocker.plugins.js';
2
+ import * as paths from './tsdocker.paths.js';
3
+ import { logger } from './tsdocker.logging.js';
4
+ import { DockerRegistry } from './classes.dockerregistry.js';
5
+ const smartshellInstance = new plugins.smartshell.Smartshell({
6
+ executor: 'bash',
7
+ });
8
+ /**
9
+ * Class Dockerfile represents a Dockerfile on disk
10
+ */
11
+ export class Dockerfile {
12
+ // STATIC METHODS
13
+ /**
14
+ * Creates instances of class Dockerfile for all Dockerfiles in cwd
15
+ */
16
+ static async readDockerfiles(managerRef) {
17
+ const entries = await plugins.smartfs.directory(paths.cwd).filter('Dockerfile*').list();
18
+ const fileTree = entries
19
+ .filter(entry => entry.isFile)
20
+ .map(entry => plugins.path.join(paths.cwd, entry.name));
21
+ const readDockerfilesArray = [];
22
+ logger.log('info', `found ${fileTree.length} Dockerfiles:`);
23
+ console.log(fileTree);
24
+ for (const dockerfilePath of fileTree) {
25
+ const myDockerfile = new Dockerfile(managerRef, {
26
+ filePath: dockerfilePath,
27
+ read: true,
28
+ });
29
+ readDockerfilesArray.push(myDockerfile);
30
+ }
31
+ return readDockerfilesArray;
32
+ }
33
+ /**
34
+ * Sorts Dockerfiles into a build order based on dependencies (topological sort)
35
+ */
36
+ static async sortDockerfiles(dockerfiles) {
37
+ logger.log('info', 'Sorting Dockerfiles based on dependencies...');
38
+ // Map from cleanTag to Dockerfile instance for quick lookup
39
+ const tagToDockerfile = new Map();
40
+ dockerfiles.forEach((dockerfile) => {
41
+ tagToDockerfile.set(dockerfile.cleanTag, dockerfile);
42
+ });
43
+ // Build the dependency graph
44
+ const graph = new Map();
45
+ dockerfiles.forEach((dockerfile) => {
46
+ const dependencies = [];
47
+ const baseImage = dockerfile.baseImage;
48
+ // Check if the baseImage is among the local Dockerfiles
49
+ if (tagToDockerfile.has(baseImage)) {
50
+ const baseDockerfile = tagToDockerfile.get(baseImage);
51
+ dependencies.push(baseDockerfile);
52
+ dockerfile.localBaseImageDependent = true;
53
+ dockerfile.localBaseDockerfile = baseDockerfile;
54
+ }
55
+ graph.set(dockerfile, dependencies);
56
+ });
57
+ // Perform topological sort
58
+ const sortedDockerfiles = [];
59
+ const visited = new Set();
60
+ const tempMarked = new Set();
61
+ const visit = (dockerfile) => {
62
+ if (tempMarked.has(dockerfile)) {
63
+ throw new Error(`Circular dependency detected involving ${dockerfile.cleanTag}`);
64
+ }
65
+ if (!visited.has(dockerfile)) {
66
+ tempMarked.add(dockerfile);
67
+ const dependencies = graph.get(dockerfile) || [];
68
+ dependencies.forEach((dep) => visit(dep));
69
+ tempMarked.delete(dockerfile);
70
+ visited.add(dockerfile);
71
+ sortedDockerfiles.push(dockerfile);
72
+ }
73
+ };
74
+ try {
75
+ dockerfiles.forEach((dockerfile) => {
76
+ if (!visited.has(dockerfile)) {
77
+ visit(dockerfile);
78
+ }
79
+ });
80
+ }
81
+ catch (error) {
82
+ logger.log('error', error.message);
83
+ throw error;
84
+ }
85
+ // Log the sorted order
86
+ sortedDockerfiles.forEach((dockerfile, index) => {
87
+ logger.log('info', `Build order ${index + 1}: ${dockerfile.cleanTag} with base image ${dockerfile.baseImage}`);
88
+ });
89
+ return sortedDockerfiles;
90
+ }
91
+ /**
92
+ * Maps local Dockerfiles dependencies to the corresponding Dockerfile class instances
93
+ */
94
+ static async mapDockerfiles(sortedDockerfileArray) {
95
+ sortedDockerfileArray.forEach((dockerfileArg) => {
96
+ if (dockerfileArg.localBaseImageDependent) {
97
+ sortedDockerfileArray.forEach((dockfile2) => {
98
+ if (dockfile2.cleanTag === dockerfileArg.baseImage) {
99
+ dockerfileArg.localBaseDockerfile = dockfile2;
100
+ }
101
+ });
102
+ }
103
+ });
104
+ return sortedDockerfileArray;
105
+ }
106
+ /**
107
+ * Builds the corresponding real docker image for each Dockerfile class instance
108
+ */
109
+ static async buildDockerfiles(sortedArrayArg) {
110
+ for (const dockerfileArg of sortedArrayArg) {
111
+ await dockerfileArg.build();
112
+ }
113
+ return sortedArrayArg;
114
+ }
115
+ /**
116
+ * Tests all Dockerfiles by calling Dockerfile.test()
117
+ */
118
+ static async testDockerfiles(sortedArrayArg) {
119
+ for (const dockerfileArg of sortedArrayArg) {
120
+ await dockerfileArg.test();
121
+ }
122
+ return sortedArrayArg;
123
+ }
124
+ /**
125
+ * Returns a version for a docker file
126
+ * Dockerfile_latest -> latest
127
+ * Dockerfile_v1.0.0 -> v1.0.0
128
+ * Dockerfile -> latest
129
+ */
130
+ static dockerFileVersion(dockerfileInstanceArg, dockerfileNameArg) {
131
+ let versionString;
132
+ const versionRegex = /Dockerfile_(.+)$/;
133
+ const regexResultArray = versionRegex.exec(dockerfileNameArg);
134
+ if (regexResultArray && regexResultArray.length === 2) {
135
+ versionString = regexResultArray[1];
136
+ }
137
+ else {
138
+ versionString = 'latest';
139
+ }
140
+ // Replace ##version## placeholder with actual package version if available
141
+ if (dockerfileInstanceArg.managerRef?.projectInfo?.npm?.version) {
142
+ versionString = versionString.replace('##version##', dockerfileInstanceArg.managerRef.projectInfo.npm.version);
143
+ }
144
+ return versionString;
145
+ }
146
+ /**
147
+ * Extracts the base image from a Dockerfile content
148
+ * Handles ARG substitution for variable base images
149
+ */
150
+ static dockerBaseImage(dockerfileContentArg) {
151
+ const lines = dockerfileContentArg.split(/\r?\n/);
152
+ const args = {};
153
+ for (const line of lines) {
154
+ const trimmedLine = line.trim();
155
+ // Skip empty lines and comments
156
+ if (trimmedLine === '' || trimmedLine.startsWith('#')) {
157
+ continue;
158
+ }
159
+ // Match ARG instructions
160
+ const argMatch = trimmedLine.match(/^ARG\s+([^\s=]+)(?:=(.*))?$/i);
161
+ if (argMatch) {
162
+ const argName = argMatch[1];
163
+ const argValue = argMatch[2] !== undefined ? argMatch[2] : process.env[argName] || '';
164
+ args[argName] = argValue;
165
+ continue;
166
+ }
167
+ // Match FROM instructions
168
+ const fromMatch = trimmedLine.match(/^FROM\s+(.+?)(?:\s+AS\s+[^\s]+)?$/i);
169
+ if (fromMatch) {
170
+ let baseImage = fromMatch[1].trim();
171
+ // Substitute variables in the base image name
172
+ baseImage = Dockerfile.substituteVariables(baseImage, args);
173
+ return baseImage;
174
+ }
175
+ }
176
+ throw new Error('No FROM instruction found in Dockerfile');
177
+ }
178
+ /**
179
+ * Substitutes variables in a string, supporting default values like ${VAR:-default}
180
+ */
181
+ static substituteVariables(str, vars) {
182
+ return str.replace(/\${([^}:]+)(:-([^}]+))?}/g, (_, varName, __, defaultValue) => {
183
+ if (vars[varName] !== undefined) {
184
+ return vars[varName];
185
+ }
186
+ else if (defaultValue !== undefined) {
187
+ return defaultValue;
188
+ }
189
+ else {
190
+ return '';
191
+ }
192
+ });
193
+ }
194
+ /**
195
+ * Returns the docker tag string for a given registry and repo
196
+ */
197
+ static getDockerTagString(managerRef, registryArg, repoArg, versionArg, suffixArg) {
198
+ // Determine whether the repo should be mapped according to the registry
199
+ const config = managerRef.config;
200
+ const mappedRepo = config.registryRepoMap?.[registryArg];
201
+ const repo = mappedRepo || repoArg;
202
+ // Determine whether the version contains a suffix
203
+ let version = versionArg;
204
+ if (suffixArg) {
205
+ version = versionArg + '_' + suffixArg;
206
+ }
207
+ const tagString = `${registryArg}/${repo}:${version}`;
208
+ return tagString;
209
+ }
210
+ /**
211
+ * Gets build args from environment variable mapping
212
+ */
213
+ static async getDockerBuildArgs(managerRef) {
214
+ logger.log('info', 'checking for env vars to be supplied to the docker build');
215
+ let buildArgsString = '';
216
+ const config = managerRef.config;
217
+ if (config.buildArgEnvMap) {
218
+ for (const dockerArgKey of Object.keys(config.buildArgEnvMap)) {
219
+ const dockerArgOuterEnvVar = config.buildArgEnvMap[dockerArgKey];
220
+ logger.log('note', `docker ARG "${dockerArgKey}" maps to outer env var "${dockerArgOuterEnvVar}"`);
221
+ const targetValue = process.env[dockerArgOuterEnvVar];
222
+ if (targetValue) {
223
+ buildArgsString = `${buildArgsString} --build-arg ${dockerArgKey}="${targetValue}"`;
224
+ }
225
+ }
226
+ }
227
+ return buildArgsString;
228
+ }
229
+ // INSTANCE PROPERTIES
230
+ managerRef;
231
+ filePath;
232
+ repo;
233
+ version;
234
+ cleanTag;
235
+ buildTag;
236
+ pushTag;
237
+ containerName;
238
+ content;
239
+ baseImage;
240
+ localBaseImageDependent;
241
+ localBaseDockerfile;
242
+ constructor(managerRefArg, options) {
243
+ this.managerRef = managerRefArg;
244
+ this.filePath = options.filePath;
245
+ // Build repo name from project info or directory name
246
+ const projectInfo = this.managerRef.projectInfo;
247
+ if (projectInfo?.npm?.name) {
248
+ // Use package name, removing scope if present
249
+ const packageName = projectInfo.npm.name.replace(/^@[^/]+\//, '');
250
+ this.repo = packageName;
251
+ }
252
+ else {
253
+ // Fallback to directory name
254
+ this.repo = plugins.path.basename(paths.cwd);
255
+ }
256
+ this.version = Dockerfile.dockerFileVersion(this, plugins.path.parse(this.filePath).base);
257
+ this.cleanTag = this.repo + ':' + this.version;
258
+ this.buildTag = this.cleanTag;
259
+ this.containerName = 'dockerfile-' + this.version;
260
+ if (options.filePath && options.read) {
261
+ const fs = require('fs');
262
+ this.content = fs.readFileSync(plugins.path.resolve(options.filePath), 'utf-8');
263
+ }
264
+ else if (options.fileContents) {
265
+ this.content = options.fileContents;
266
+ }
267
+ this.baseImage = Dockerfile.dockerBaseImage(this.content);
268
+ this.localBaseImageDependent = false;
269
+ }
270
+ /**
271
+ * Builds the Dockerfile
272
+ */
273
+ async build() {
274
+ logger.log('info', 'now building Dockerfile for ' + this.cleanTag);
275
+ const buildArgsString = await Dockerfile.getDockerBuildArgs(this.managerRef);
276
+ const config = this.managerRef.config;
277
+ let buildCommand;
278
+ // Check if multi-platform build is needed
279
+ if (config.platforms && config.platforms.length > 1) {
280
+ // Multi-platform build using buildx
281
+ const platformString = config.platforms.join(',');
282
+ buildCommand = `docker buildx build --platform ${platformString} -t ${this.buildTag} -f ${this.filePath} ${buildArgsString} .`;
283
+ if (config.push) {
284
+ buildCommand += ' --push';
285
+ }
286
+ else {
287
+ buildCommand += ' --load';
288
+ }
289
+ }
290
+ else {
291
+ // Standard build
292
+ const versionLabel = this.managerRef.projectInfo?.npm?.version || 'unknown';
293
+ buildCommand = `docker build --label="version=${versionLabel}" -t ${this.buildTag} -f ${this.filePath} ${buildArgsString} .`;
294
+ }
295
+ const result = await smartshellInstance.exec(buildCommand);
296
+ if (result.exitCode !== 0) {
297
+ logger.log('error', `Build failed for ${this.cleanTag}`);
298
+ console.log(result.stdout);
299
+ throw new Error(`Build failed for ${this.cleanTag}`);
300
+ }
301
+ logger.log('ok', `Built ${this.cleanTag}`);
302
+ }
303
+ /**
304
+ * Pushes the Dockerfile to a registry
305
+ */
306
+ async push(dockerRegistryArg, versionSuffix) {
307
+ this.pushTag = Dockerfile.getDockerTagString(this.managerRef, dockerRegistryArg.registryUrl, this.repo, this.version, versionSuffix);
308
+ await smartshellInstance.exec(`docker tag ${this.buildTag} ${this.pushTag}`);
309
+ const pushResult = await smartshellInstance.exec(`docker push ${this.pushTag}`);
310
+ if (pushResult.exitCode !== 0) {
311
+ logger.log('error', `Push failed for ${this.pushTag}`);
312
+ throw new Error(`Push failed for ${this.pushTag}`);
313
+ }
314
+ // Get image digest
315
+ const inspectResult = await smartshellInstance.exec(`docker inspect --format="{{index .RepoDigests 0}}" ${this.pushTag}`);
316
+ if (inspectResult.exitCode === 0 && inspectResult.stdout.includes('@')) {
317
+ const imageDigest = inspectResult.stdout.split('@')[1]?.trim();
318
+ console.log(`The image ${this.pushTag} has digest ${imageDigest}`);
319
+ }
320
+ logger.log('ok', `Pushed ${this.pushTag}`);
321
+ }
322
+ /**
323
+ * Pulls the Dockerfile from a registry
324
+ */
325
+ async pull(registryArg, versionSuffixArg) {
326
+ const pullTag = Dockerfile.getDockerTagString(this.managerRef, registryArg.registryUrl, this.repo, this.version, versionSuffixArg);
327
+ await smartshellInstance.exec(`docker pull ${pullTag}`);
328
+ await smartshellInstance.exec(`docker tag ${pullTag} ${this.buildTag}`);
329
+ logger.log('ok', `Pulled and tagged ${pullTag} as ${this.buildTag}`);
330
+ }
331
+ /**
332
+ * Tests the Dockerfile by running a test script if it exists
333
+ */
334
+ async test() {
335
+ const testDir = this.managerRef.config.testDir || plugins.path.join(paths.cwd, 'test');
336
+ const testFile = plugins.path.join(testDir, 'test_' + this.version + '.sh');
337
+ const fs = require('fs');
338
+ const testFileExists = fs.existsSync(testFile);
339
+ if (testFileExists) {
340
+ logger.log('info', `Running tests for ${this.cleanTag}`);
341
+ // Run tests in container
342
+ await smartshellInstance.exec(`docker run --name tsdocker_test_container --entrypoint="bash" ${this.buildTag} -c "mkdir /tsdocker_test"`);
343
+ await smartshellInstance.exec(`docker cp ${testFile} tsdocker_test_container:/tsdocker_test/test.sh`);
344
+ await smartshellInstance.exec(`docker commit tsdocker_test_container tsdocker_test_image`);
345
+ const testResult = await smartshellInstance.exec(`docker run --entrypoint="bash" tsdocker_test_image -x /tsdocker_test/test.sh`);
346
+ // Cleanup
347
+ await smartshellInstance.exec(`docker rm tsdocker_test_container`);
348
+ await smartshellInstance.exec(`docker rmi --force tsdocker_test_image`);
349
+ if (testResult.exitCode !== 0) {
350
+ throw new Error(`Tests failed for ${this.cleanTag}`);
351
+ }
352
+ logger.log('ok', `Tests passed for ${this.cleanTag}`);
353
+ }
354
+ else {
355
+ logger.log('warn', `Skipping tests for ${this.cleanTag} because no test file was found at ${testFile}`);
356
+ }
357
+ }
358
+ /**
359
+ * Gets the ID of a built Docker image
360
+ */
361
+ async getId() {
362
+ const result = await smartshellInstance.exec('docker inspect --type=image --format="{{.Id}}" ' + this.buildTag);
363
+ return result.stdout.trim();
364
+ }
365
+ }
366
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kb2NrZXJmaWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5kb2NrZXJmaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxLQUFLLEtBQUssTUFBTSxxQkFBcUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBSTdELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztJQUMzRCxRQUFRLEVBQUUsTUFBTTtDQUNqQixDQUFDLENBQUM7QUFFSDs7R0FFRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBQ3JCLGlCQUFpQjtJQUVqQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFVBQTJCO1FBQzdELE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4RixNQUFNLFFBQVEsR0FBRyxPQUFPO2FBQ3JCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7YUFDN0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUUxRCxNQUFNLG9CQUFvQixHQUFpQixFQUFFLENBQUM7UUFDOUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxRQUFRLENBQUMsTUFBTSxlQUFlLENBQUMsQ0FB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
@@ -0,0 +1,29 @@
1
+ import type { IDockerRegistryOptions } from './interfaces/index.js';
2
+ /**
3
+ * Represents a Docker registry with authentication capabilities
4
+ */
5
+ export declare class DockerRegistry {
6
+ registryUrl: string;
7
+ username: string;
8
+ password: string;
9
+ constructor(optionsArg: IDockerRegistryOptions);
10
+ /**
11
+ * Creates a DockerRegistry instance from a pipe-delimited environment string
12
+ * Format: "registryUrl|username|password"
13
+ */
14
+ static fromEnvString(envString: string): DockerRegistry;
15
+ /**
16
+ * Creates a DockerRegistry from environment variables
17
+ * Looks for DOCKER_REGISTRY, DOCKER_REGISTRY_USER, DOCKER_REGISTRY_PASSWORD
18
+ * Or for a specific registry: DOCKER_REGISTRY_<NAME>, etc.
19
+ */
20
+ static fromEnv(registryName?: string): DockerRegistry | null;
21
+ /**
22
+ * Logs in to the Docker registry
23
+ */
24
+ login(): Promise<void>;
25
+ /**
26
+ * Logs out from the Docker registry
27
+ */
28
+ logout(): Promise<void>;
29
+ }
@@ -0,0 +1,83 @@
1
+ import * as plugins from './tsdocker.plugins.js';
2
+ import { logger } from './tsdocker.logging.js';
3
+ const smartshellInstance = new plugins.smartshell.Smartshell({
4
+ executor: 'bash',
5
+ });
6
+ /**
7
+ * Represents a Docker registry with authentication capabilities
8
+ */
9
+ export class DockerRegistry {
10
+ registryUrl;
11
+ username;
12
+ password;
13
+ constructor(optionsArg) {
14
+ this.registryUrl = optionsArg.registryUrl;
15
+ this.username = optionsArg.username;
16
+ this.password = optionsArg.password;
17
+ logger.log('info', `created DockerRegistry for ${this.registryUrl}`);
18
+ }
19
+ /**
20
+ * Creates a DockerRegistry instance from a pipe-delimited environment string
21
+ * Format: "registryUrl|username|password"
22
+ */
23
+ static fromEnvString(envString) {
24
+ const dockerRegexResultArray = envString.split('|');
25
+ if (dockerRegexResultArray.length !== 3) {
26
+ logger.log('error', 'malformed docker env var...');
27
+ throw new Error('malformed docker env var, expected format: registryUrl|username|password');
28
+ }
29
+ const registryUrl = dockerRegexResultArray[0].replace('https://', '').replace('http://', '');
30
+ const username = dockerRegexResultArray[1];
31
+ const password = dockerRegexResultArray[2];
32
+ return new DockerRegistry({
33
+ registryUrl: registryUrl,
34
+ username: username,
35
+ password: password,
36
+ });
37
+ }
38
+ /**
39
+ * Creates a DockerRegistry from environment variables
40
+ * Looks for DOCKER_REGISTRY, DOCKER_REGISTRY_USER, DOCKER_REGISTRY_PASSWORD
41
+ * Or for a specific registry: DOCKER_REGISTRY_<NAME>, etc.
42
+ */
43
+ static fromEnv(registryName) {
44
+ const prefix = registryName ? `DOCKER_REGISTRY_${registryName.toUpperCase()}_` : 'DOCKER_REGISTRY_';
45
+ const registryUrl = process.env[`${prefix}URL`] || process.env['DOCKER_REGISTRY'];
46
+ const username = process.env[`${prefix}USER`] || process.env['DOCKER_REGISTRY_USER'];
47
+ const password = process.env[`${prefix}PASSWORD`] || process.env['DOCKER_REGISTRY_PASSWORD'];
48
+ if (!registryUrl || !username || !password) {
49
+ return null;
50
+ }
51
+ return new DockerRegistry({
52
+ registryUrl: registryUrl.replace('https://', '').replace('http://', ''),
53
+ username,
54
+ password,
55
+ });
56
+ }
57
+ /**
58
+ * Logs in to the Docker registry
59
+ */
60
+ async login() {
61
+ if (this.registryUrl === 'docker.io') {
62
+ await smartshellInstance.exec(`docker login -u ${this.username} -p ${this.password}`);
63
+ logger.log('info', 'Logged in to standard docker hub');
64
+ }
65
+ else {
66
+ await smartshellInstance.exec(`docker login -u ${this.username} -p ${this.password} ${this.registryUrl}`);
67
+ }
68
+ logger.log('ok', `docker authenticated for ${this.registryUrl}!`);
69
+ }
70
+ /**
71
+ * Logs out from the Docker registry
72
+ */
73
+ async logout() {
74
+ if (this.registryUrl === 'docker.io') {
75
+ await smartshellInstance.exec('docker logout');
76
+ }
77
+ else {
78
+ await smartshellInstance.exec(`docker logout ${this.registryUrl}`);
79
+ }
80
+ logger.log('info', `logged out from ${this.registryUrl}`);
81
+ }
82
+ }
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kb2NrZXJyZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuZG9ja2VycmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHL0MsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO0lBQzNELFFBQVEsRUFBRSxNQUFNO0NBQ2pCLENBQUMsQ0FBQztBQUVIOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFDbEIsV0FBVyxDQUFTO0lBQ3BCLFFBQVEsQ0FBUztJQUNqQixRQUFRLENBQVM7SUFFeEIsWUFBWSxVQUFrQztRQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDMUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSw4QkFBOEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBaUI7UUFDM0MsTUFBTSxzQkFBc0IsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELElBQUksc0JBQXNCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLDZCQUE2QixDQUFDLENBQUM7WUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQywwRUFBMEUsQ0FBQyxDQUFDO1FBQzlGLENBQUM7UUFDRCxNQUFNLFdBQVcsR0FB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
@@ -0,0 +1,35 @@
1
+ import * as plugins from './tsdocker.plugins.js';
2
+ import { DockerRegistry } from './classes.dockerregistry.js';
3
+ /**
4
+ * Storage class for managing multiple Docker registries
5
+ */
6
+ export declare class RegistryStorage {
7
+ objectMap: plugins.lik.ObjectMap<DockerRegistry>;
8
+ constructor();
9
+ /**
10
+ * Adds a registry to the storage
11
+ */
12
+ addRegistry(registryArg: DockerRegistry): void;
13
+ /**
14
+ * Gets a registry by its URL
15
+ */
16
+ getRegistryByUrl(registryUrlArg: string): DockerRegistry | undefined;
17
+ /**
18
+ * Gets all registries
19
+ */
20
+ getAllRegistries(): DockerRegistry[];
21
+ /**
22
+ * Logs in to all registries
23
+ */
24
+ loginAll(): Promise<void>;
25
+ /**
26
+ * Logs out from all registries
27
+ */
28
+ logoutAll(): Promise<void>;
29
+ /**
30
+ * Loads registries from environment variables
31
+ * Looks for DOCKER_REGISTRY_1, DOCKER_REGISTRY_2, etc. (pipe-delimited format)
32
+ * Or individual registries like DOCKER_REGISTRY_GITLAB_URL, etc.
33
+ */
34
+ loadFromEnv(): void;
35
+ }