@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.
- package/cli.js +1 -1
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.dockerfile.d.ts +85 -0
- package/dist_ts/classes.dockerfile.js +366 -0
- package/dist_ts/classes.dockerregistry.d.ts +29 -0
- package/dist_ts/classes.dockerregistry.js +83 -0
- package/dist_ts/classes.registrystorage.d.ts +35 -0
- package/dist_ts/classes.registrystorage.js +76 -0
- package/dist_ts/classes.tsdockermanager.d.ts +53 -0
- package/dist_ts/classes.tsdockermanager.js +222 -0
- package/dist_ts/index.d.ts +1 -0
- package/dist_ts/index.js +4 -0
- package/dist_ts/interfaces/index.d.ts +68 -0
- package/dist_ts/interfaces/index.js +2 -0
- package/dist_ts/tsdocker.cli.d.ts +1 -0
- package/dist_ts/tsdocker.cli.js +179 -0
- package/dist_ts/tsdocker.config.d.ts +5 -0
- package/dist_ts/tsdocker.config.js +37 -0
- package/dist_ts/tsdocker.docker.d.ts +2 -0
- package/dist_ts/tsdocker.docker.js +145 -0
- package/dist_ts/tsdocker.logging.d.ts +3 -0
- package/dist_ts/tsdocker.logging.js +15 -0
- package/dist_ts/tsdocker.paths.d.ts +4 -0
- package/dist_ts/tsdocker.paths.js +13 -0
- package/dist_ts/tsdocker.plugins.d.ts +16 -0
- package/dist_ts/tsdocker.plugins.js +19 -0
- package/dist_ts/tsdocker.snippets.d.ts +5 -0
- package/dist_ts/tsdocker.snippets.js +26 -0
- package/npmextra.json +12 -6
- package/package.json +26 -21
- package/readme.hints.md +95 -26
- package/readme.md +32 -33
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dockerfile.ts +462 -0
- package/ts/classes.dockerregistry.ts +91 -0
- package/ts/classes.registrystorage.ts +83 -0
- package/ts/classes.tsdockermanager.ts +254 -0
- package/ts/index.ts +2 -2
- package/ts/interfaces/index.ts +70 -0
- package/ts/tsdocker.cli.ts +129 -16
- package/ts/tsdocker.config.ts +17 -10
- package/ts/tsdocker.docker.ts +6 -6
- package/ts/tsdocker.logging.ts +1 -1
- package/ts/tsdocker.paths.ts +6 -1
- package/ts/tsdocker.plugins.ts +2 -0
- package/ts/tsdocker.snippets.ts +5 -8
package/cli.js
CHANGED
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kb2NrZXJmaWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5kb2NrZXJmaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxLQUFLLEtBQUssTUFBTSxxQkFBcUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBSTdELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztJQUMzRCxRQUFRLEVBQUUsTUFBTTtDQUNqQixDQUFDLENBQUM7QUFFSDs7R0FFRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBQ3JCLGlCQUFpQjtJQUVqQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFVBQTJCO1FBQzdELE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4RixNQUFNLFFBQVEsR0FBRyxPQUFPO2FBQ3JCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7YUFDN0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUUxRCxNQUFNLG9CQUFvQixHQUFpQixFQUFFLENBQUM7UUFDOUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxRQUFRLENBQUMsTUFBTSxlQUFlLENBQUMsQ0FBQztRQUM1RCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXRCLEtBQUssTUFBTSxjQUFjLElBQUksUUFBUSxFQUFFLENBQUM7WUFDdEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFO2dCQUM5QyxRQUFRLEVBQUUsY0FBYztnQkFDeEIsSUFBSSxFQUFFLElBQUk7YUFDWCxDQUFDLENBQUM7WUFDSCxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUVELE9BQU8sb0JBQW9CLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsV0FBeUI7UUFDM0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsOENBQThDLENBQUMsQ0FBQztRQUVuRSw0REFBNEQ7UUFDNUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7UUFDdEQsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ2pDLGVBQWUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztRQUVILDZCQUE2QjtRQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBNEIsQ0FBQztRQUNsRCxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDakMsTUFBTSxZQUFZLEdBQWlCLEVBQUUsQ0FBQztZQUN0QyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO1lBRXZDLHdEQUF3RDtZQUN4RCxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUUsQ0FBQztnQkFDdkQsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDbEMsVUFBVSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQztnQkFDMUMsVUFBVSxDQUFDLG1CQUFtQixHQUFHLGNBQWMsQ0FBQztZQUNsRCxDQUFDO1lBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFFSCwyQkFBMkI7UUFDM0IsTUFBTSxpQkFBaUIsR0FBaUIsRUFBRSxDQUFDO1FBQzNDLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFjLENBQUM7UUFDdEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQWMsQ0FBQztRQUV6QyxNQUFNLEtBQUssR0FBRyxDQUFDLFVBQXNCLEVBQUUsRUFBRTtZQUN2QyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDbkYsQ0FBQztZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzNCLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNqRCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDMUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDeEIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixJQUFJLENBQUM7WUFDSCxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7b0JBQzdCLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDcEIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRyxLQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUMsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUM5QyxNQUFNLENBQUMsR0FBRyxDQUNSLE1BQU0sRUFDTixlQUFlLEtBQUssR0FBRyxDQUFDLEtBQUssVUFBVSxDQUFDLFFBQVEsb0JBQW9CLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FDM0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxxQkFBbUM7UUFDcEUscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDOUMsSUFBSSxhQUFhLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztnQkFDMUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBcUIsRUFBRSxFQUFFO29CQUN0RCxJQUFJLFNBQVMsQ0FBQyxRQUFRLEtBQUssYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNuRCxhQUFhLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO29CQUNoRCxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxxQkFBcUIsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGNBQTRCO1FBQy9ELEtBQUssTUFBTSxhQUFhLElBQUksY0FBYyxFQUFFLENBQUM7WUFDM0MsTUFBTSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLGNBQTRCO1FBQzlELEtBQUssTUFBTSxhQUFhLElBQUksY0FBYyxFQUFFLENBQUM7WUFDM0MsTUFBTSxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0IsQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FDN0IscUJBQWlDLEVBQ2pDLGlCQUF5QjtRQUV6QixJQUFJLGFBQXFCLENBQUM7UUFDMUIsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUM7UUFDeEMsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUQsSUFBSSxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEQsYUFBYSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7YUFBTSxDQUFDO1lBQ04sYUFBYSxHQUFHLFFBQVEsQ0FBQztRQUMzQixDQUFDO1FBRUQsMkVBQTJFO1FBQzNFLElBQUkscUJBQXFCLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDaEUsYUFBYSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQ25DLGFBQWEsRUFDYixxQkFBcUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQ3pELENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxlQUFlLENBQUMsb0JBQTRCO1FBQ3hELE1BQU0sS0FBSyxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRCxNQUFNLElBQUksR0FBOEIsRUFBRSxDQUFDO1FBRTNDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBRWhDLGdDQUFnQztZQUNoQyxJQUFJLFdBQVcsS0FBSyxFQUFFLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN0RCxTQUFTO1lBQ1gsQ0FBQztZQUVELHlCQUF5QjtZQUN6QixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7WUFDbkUsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3RGLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUM7Z0JBQ3pCLFNBQVM7WUFDWCxDQUFDO1lBRUQsMEJBQTBCO1lBQzFCLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztZQUMxRSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLElBQUksU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFFcEMsOENBQThDO2dCQUM5QyxTQUFTLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFFNUQsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOztPQUVHO0lBQ0ssTUFBTSxDQUFDLG1CQUFtQixDQUFDLEdBQVcsRUFBRSxJQUErQjtRQUM3RSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRTtZQUMvRSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDaEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkIsQ0FBQztpQkFBTSxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDdEMsT0FBTyxZQUFZLENBQUM7WUFDdEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGtCQUFrQixDQUM5QixVQUEyQixFQUMzQixXQUFtQixFQUNuQixPQUFlLEVBQ2YsVUFBa0IsRUFDbEIsU0FBa0I7UUFFbEIsd0VBQXdFO1FBQ3hFLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDakMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sSUFBSSxHQUFHLFVBQVUsSUFBSSxPQUFPLENBQUM7UUFFbkMsa0RBQWtEO1FBQ2xELElBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQztRQUN6QixJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsT0FBTyxHQUFHLFVBQVUsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxHQUFHLFdBQVcsSUFBSSxJQUFJLElBQUksT0FBTyxFQUFFLENBQUM7UUFDdEQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxVQUEyQjtRQUNoRSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSwwREFBMEQsQ0FBQyxDQUFDO1FBQy9FLElBQUksZUFBZSxHQUFXLEVBQUUsQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBRWpDLElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzFCLEtBQUssTUFBTSxZQUFZLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDOUQsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUNqRSxNQUFNLENBQUMsR0FBRyxDQUNSLE1BQU0sRUFDTixlQUFlLFlBQVksNEJBQTRCLG9CQUFvQixHQUFHLENBQy9FLENBQUM7Z0JBQ0YsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUNoQixlQUFlLEdBQUcsR0FBRyxlQUFlLGdCQUFnQixZQUFZLEtBQUssV0FBVyxHQUFHLENBQUM7Z0JBQ3RGLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxzQkFBc0I7SUFDZixVQUFVLENBQWtCO0lBQzVCLFFBQVEsQ0FBVTtJQUNsQixJQUFJLENBQVM7SUFDYixPQUFPLENBQVM7SUFDaEIsUUFBUSxDQUFTO0lBQ2pCLFFBQVEsQ0FBUztJQUNqQixPQUFPLENBQVU7SUFDakIsYUFBYSxDQUFTO0lBQ3RCLE9BQU8sQ0FBVTtJQUNqQixTQUFTLENBQVM7SUFDbEIsdUJBQXVCLENBQVU7SUFDakMsbUJBQW1CLENBQWM7SUFFeEMsWUFBWSxhQUE4QixFQUFFLE9BQTJCO1FBQ3JFLElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVMsQ0FBQztRQUVsQyxzREFBc0Q7UUFDdEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDaEQsSUFBSSxXQUFXLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzNCLDhDQUE4QztZQUM5QyxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO1FBQzFCLENBQUM7YUFBTSxDQUFDO1lBQ04sNkJBQTZCO1lBQzdCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFGLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUVsRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JDLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xGLENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDdEMsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsS0FBSztRQUNoQixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSw4QkFBOEIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkUsTUFBTSxlQUFlLEdBQUcsTUFBTSxVQUFVLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBRXRDLElBQUksWUFBb0IsQ0FBQztRQUV6QiwwQ0FBMEM7UUFDMUMsSUFBSSxNQUFNLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BELG9DQUFvQztZQUNwQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsRCxZQUFZLEdBQUcsa0NBQWtDLGNBQWMsT0FBTyxJQUFJLENBQUMsUUFBUSxPQUFPLElBQUksQ0FBQyxRQUFRLElBQUksZUFBZSxJQUFJLENBQUM7WUFFL0gsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2hCLFlBQVksSUFBSSxTQUFTLENBQUM7WUFDNUIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFlBQVksSUFBSSxTQUFTLENBQUM7WUFDNUIsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04saUJBQWlCO1lBQ2pCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxPQUFPLElBQUksU0FBUyxDQUFDO1lBQzVFLFlBQVksR0FBRyxpQ0FBaUMsWUFBWSxRQUFRLElBQUksQ0FBQyxRQUFRLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxlQUFlLElBQUksQ0FBQztRQUMvSCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0QsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLG9CQUFvQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN6RCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQyxFQUFFLGFBQXNCO1FBQ3pFLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLGtCQUFrQixDQUMxQyxJQUFJLENBQUMsVUFBVSxFQUNmLGlCQUFpQixDQUFDLFdBQVcsRUFDN0IsSUFBSSxDQUFDLElBQUksRUFDVCxJQUFJLENBQUMsT0FBTyxFQUNaLGFBQWEsQ0FDZCxDQUFDO1FBRUYsTUFBTSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sVUFBVSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFFaEYsSUFBSSxVQUFVLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLG1CQUFtQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN2RCxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBRUQsbUJBQW1CO1FBQ25CLE1BQU0sYUFBYSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsSUFBSSxDQUNqRCxzREFBc0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUNyRSxDQUFDO1FBRUYsSUFBSSxhQUFhLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQy9ELE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLENBQUMsT0FBTyxlQUFlLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFVBQVUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLElBQUksQ0FBQyxXQUEyQixFQUFFLGdCQUF5QjtRQUN0RSxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsa0JBQWtCLENBQzNDLElBQUksQ0FBQyxVQUFVLEVBQ2YsV0FBVyxDQUFDLFdBQVcsRUFDdkIsSUFBSSxDQUFDLElBQUksRUFDVCxJQUFJLENBQUMsT0FBTyxFQUNaLGdCQUFnQixDQUNqQixDQUFDO1FBRUYsTUFBTSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sa0JBQWtCLENBQUMsSUFBSSxDQUFDLGNBQWMsT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRXhFLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLHFCQUFxQixPQUFPLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLElBQUk7UUFDZixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN2RixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFFNUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFL0MsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxxQkFBcUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFFekQseUJBQXlCO1lBQ3pCLE1BQU0sa0JBQWtCLENBQUMsSUFBSSxDQUMzQixpRUFBaUUsSUFBSSxDQUFDLFFBQVEsNEJBQTRCLENBQzNHLENBQUM7WUFDRixNQUFNLGtCQUFrQixDQUFDLElBQUksQ0FBQyxhQUFhLFFBQVEsaURBQWlELENBQUMsQ0FBQztZQUN0RyxNQUFNLGtCQUFrQixDQUFDLElBQUksQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1lBRTNGLE1BQU0sVUFBVSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsSUFBSSxDQUM5Qyw4RUFBOEUsQ0FDL0UsQ0FBQztZQUVGLFVBQVU7WUFDVixNQUFNLGtCQUFrQixDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1lBQ25FLE1BQU0sa0JBQWtCLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7WUFFeEUsSUFBSSxVQUFVLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN2RCxDQUFDO1lBRUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsc0JBQXNCLElBQUksQ0FBQyxRQUFRLHNDQUFzQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzFHLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsS0FBSztRQUNoQixNQUFNLE1BQU0sR0FBRyxNQUFNLGtCQUFrQixDQUFDLElBQUksQ0FDMUMsaURBQWlELEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FDbEUsQ0FBQztRQUNGLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM5QixDQUFDO0NBQ0YifQ==
|
|
@@ -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
|
+
}
|