@git.zone/tsdeploy 0.2.0 → 0.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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.tsdeploy.d.ts +33 -1
- package/dist_ts/classes.tsdeploy.js +540 -11
- package/dist_ts/cli.js +60 -2
- package/dist_ts/plugins.d.ts +7 -1
- package/dist_ts/plugins.js +10 -2
- package/dist_ts/types.d.ts +80 -2
- package/package.json +4 -2
- package/readme.md +46 -8
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.tsdeploy.ts +626 -10
- package/ts/cli.ts +59 -1
- package/ts/plugins.ts +13 -1
- package/ts/types.ts +87 -2
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
const schemaVersion = 1;
|
|
3
3
|
const profileNameRegex = /^[a-zA-Z0-9._-]+$/;
|
|
4
|
+
const defaultPlatform = 'linux/amd64';
|
|
5
|
+
const defaultCloudlyRequestTimeoutMs = 30000;
|
|
6
|
+
const defaultCommandTimeoutMs = 30 * 60 * 1000;
|
|
7
|
+
const dockerCommandTimeoutMs = 60 * 60 * 1000;
|
|
8
|
+
const defaultMaxCommandOutputBytes = 1024 * 1024;
|
|
9
|
+
const defaultVerifyUrlTimeoutMs = 15000;
|
|
4
10
|
const normalizeProfileName = (profileArg) => {
|
|
5
11
|
const profile = profileArg.trim();
|
|
6
12
|
if (!profile || !profileNameRegex.test(profile)) {
|
|
@@ -29,9 +35,15 @@ export const redactProfile = (profileArg) => {
|
|
|
29
35
|
export class TsDeploy {
|
|
30
36
|
projectDir;
|
|
31
37
|
profileStore;
|
|
38
|
+
env;
|
|
39
|
+
commandRunner;
|
|
40
|
+
cloudlyRequest;
|
|
32
41
|
constructor(optionsArg = {}) {
|
|
33
42
|
this.projectDir = plugins.path.resolve(optionsArg.projectDir ?? process.cwd());
|
|
34
43
|
this.profileStore = this.createProfileStore(optionsArg);
|
|
44
|
+
this.env = optionsArg.env ?? process.env;
|
|
45
|
+
this.commandRunner = optionsArg.commandRunner ?? this.defaultCommandRunner;
|
|
46
|
+
this.cloudlyRequest = optionsArg.cloudlyRequest ?? this.defaultCloudlyRequest;
|
|
35
47
|
}
|
|
36
48
|
get projectLinkPath() {
|
|
37
49
|
return plugins.path.join(this.projectDir, '.nogit', 'tsdeploy.json');
|
|
@@ -145,7 +157,7 @@ export class TsDeploy {
|
|
|
145
157
|
warnings.push(`Profile "${activeProfile}" is not configured. Run tsdeploy login --profile ${activeProfile}.`);
|
|
146
158
|
}
|
|
147
159
|
if (profile && !profile.token) {
|
|
148
|
-
warnings.push(`Profile "${profile.name}" has no token.
|
|
160
|
+
warnings.push(`Profile "${profile.name}" has no token. Cloudly deploy requires a token or username/password at deploy time.`);
|
|
149
161
|
}
|
|
150
162
|
return {
|
|
151
163
|
projectDir: this.projectDir,
|
|
@@ -159,11 +171,19 @@ export class TsDeploy {
|
|
|
159
171
|
async buildPlan() {
|
|
160
172
|
const status = await this.getStatus();
|
|
161
173
|
const actions = [];
|
|
174
|
+
const canDeployCloudly = Boolean(status.projectLink?.serviceId && status.profile?.target === 'cloudly');
|
|
162
175
|
if (status.projectLink && status.profile) {
|
|
163
176
|
actions.push({
|
|
164
177
|
type: 'inspect',
|
|
165
178
|
title: 'Inspect linked deployment',
|
|
166
|
-
description: 'Resolve the linked Cloudly
|
|
179
|
+
description: 'Resolve the linked Cloudly service and registry target before deploying.',
|
|
180
|
+
});
|
|
181
|
+
actions.push({
|
|
182
|
+
type: canDeployCloudly ? 'deploy' : 'noop',
|
|
183
|
+
title: canDeployCloudly ? 'Deploy Cloudly workload image' : 'Deployment link incomplete or unsupported',
|
|
184
|
+
description: canDeployCloudly
|
|
185
|
+
? 'Run project checks, build and push the linked OCI image, and let Cloudly deployOnPush reconcile the service.'
|
|
186
|
+
: 'Cloudly workload deploy requires a serviceId; Onebox deployment mutations are not implemented yet.',
|
|
167
187
|
});
|
|
168
188
|
}
|
|
169
189
|
else {
|
|
@@ -173,16 +193,13 @@ export class TsDeploy {
|
|
|
173
193
|
description: 'Create a profile and project link before a deployment plan can inspect remote state.',
|
|
174
194
|
});
|
|
175
195
|
}
|
|
176
|
-
actions.push({
|
|
177
|
-
type: 'noop',
|
|
178
|
-
title: 'Deployment mutation disabled',
|
|
179
|
-
description: 'tsdeploy MVP does not install, update, or upgrade apps until Cloudly/Onebox deployment contracts are verified upstream.',
|
|
180
|
-
});
|
|
181
196
|
return {
|
|
182
197
|
schemaVersion,
|
|
183
198
|
projectDir: this.projectDir,
|
|
184
|
-
mutationAllowed:
|
|
185
|
-
summary:
|
|
199
|
+
mutationAllowed: canDeployCloudly,
|
|
200
|
+
summary: canDeployCloudly
|
|
201
|
+
? 'Cloudly workload deploy is available through registry push and deployOnPush reconciliation.'
|
|
202
|
+
: 'Safe planning only: no remote deployment mutations will be executed.',
|
|
186
203
|
profile: status.activeProfile,
|
|
187
204
|
deploymentId: status.projectLink?.deploymentId,
|
|
188
205
|
serviceId: status.projectLink?.serviceId,
|
|
@@ -206,7 +223,9 @@ export class TsDeploy {
|
|
|
206
223
|
{
|
|
207
224
|
name: 'remote-mutations',
|
|
208
225
|
ok: true,
|
|
209
|
-
message:
|
|
226
|
+
message: status.profile?.target === 'cloudly'
|
|
227
|
+
? 'Cloudly workload deployment is available with deploy-time Cloudly credentials.'
|
|
228
|
+
: 'Only Cloudly workload deployment is implemented currently.',
|
|
210
229
|
},
|
|
211
230
|
];
|
|
212
231
|
return {
|
|
@@ -215,5 +234,515 @@ export class TsDeploy {
|
|
|
215
234
|
warnings: status.warnings,
|
|
216
235
|
};
|
|
217
236
|
}
|
|
237
|
+
async deploy(optionsArg = {}) {
|
|
238
|
+
const status = await this.getStatus();
|
|
239
|
+
const projectLink = status.projectLink;
|
|
240
|
+
const profile = await this.getProfile(projectLink?.profile ?? status.activeProfile);
|
|
241
|
+
const steps = [];
|
|
242
|
+
const warnings = [];
|
|
243
|
+
const tag = optionsArg.tag || 'latest';
|
|
244
|
+
const platform = optionsArg.platform || defaultPlatform;
|
|
245
|
+
const waitSeconds = optionsArg.waitSeconds ?? 0;
|
|
246
|
+
if (!projectLink) {
|
|
247
|
+
throw new Error('No .nogit/tsdeploy.json project link found. Run tsdeploy link first.');
|
|
248
|
+
}
|
|
249
|
+
if (!projectLink.serviceId) {
|
|
250
|
+
throw new Error('Project link has no serviceId. Run tsdeploy link --serviceId <id>.');
|
|
251
|
+
}
|
|
252
|
+
if (!profile) {
|
|
253
|
+
throw new Error(`Profile "${projectLink.profile}" is not configured. Run tsdeploy login --profile ${projectLink.profile}.`);
|
|
254
|
+
}
|
|
255
|
+
if (profile.target !== 'cloudly') {
|
|
256
|
+
throw new Error(`Deploy target "${profile.target}" is not implemented. Only Cloudly workload deployment is supported.`);
|
|
257
|
+
}
|
|
258
|
+
const deploySecretValues = this.collectSecretValues(undefined, [
|
|
259
|
+
profile.token,
|
|
260
|
+
optionsArg.token,
|
|
261
|
+
optionsArg.password,
|
|
262
|
+
this.env.TSDEPLOY_TOKEN,
|
|
263
|
+
this.env.TSDEPLOY_CLOUDLY_PASSWORD,
|
|
264
|
+
this.env.CLOUDLY_PASSWORD,
|
|
265
|
+
]);
|
|
266
|
+
const localConfig = await this.readProjectSmartconfig();
|
|
267
|
+
const localImage = this.resolveLocalDockerImage(localConfig, tag);
|
|
268
|
+
let image = optionsArg.image || localImage;
|
|
269
|
+
if (optionsArg.dryRun) {
|
|
270
|
+
if (!image) {
|
|
271
|
+
image = '<resolved-from-cloudly-service-registry-target>';
|
|
272
|
+
warnings.push('Dry run did not contact Cloudly, so the final image URL was not resolved.');
|
|
273
|
+
}
|
|
274
|
+
steps.push({ name: 'cloudly-preflight', status: 'skipped', message: 'Dry run skipped Cloudly service validation.' });
|
|
275
|
+
steps.push({ name: 'checks', status: 'skipped', message: 'Dry run skipped project checks.' });
|
|
276
|
+
steps.push({ name: 'docker-buildx-push', status: 'skipped', message: `Dry run would push ${image}.` });
|
|
277
|
+
return {
|
|
278
|
+
schemaVersion,
|
|
279
|
+
projectDir: this.projectDir,
|
|
280
|
+
profile: profile.name,
|
|
281
|
+
serviceId: projectLink.serviceId,
|
|
282
|
+
deploymentId: projectLink.deploymentId,
|
|
283
|
+
dryRun: true,
|
|
284
|
+
image,
|
|
285
|
+
tag,
|
|
286
|
+
platform,
|
|
287
|
+
pushed: false,
|
|
288
|
+
triggered: false,
|
|
289
|
+
verified: false,
|
|
290
|
+
deployments: [],
|
|
291
|
+
steps,
|
|
292
|
+
warnings,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
const identity = await this.resolveCloudlyIdentity(profile, optionsArg);
|
|
296
|
+
steps.push({ name: 'cloudly-auth', status: 'passed', message: 'Cloudly identity resolved.' });
|
|
297
|
+
const service = await this.fireCloudlyRequest(profile.origin, 'getServiceById', { identity, serviceId: projectLink.serviceId }).then(response => response.service);
|
|
298
|
+
if (service.data.deployOnPush === false) {
|
|
299
|
+
throw new Error(`Service "${service.data.name}" has deployOnPush disabled; refusing to push an image that Cloudly will not deploy.`);
|
|
300
|
+
}
|
|
301
|
+
const registryTarget = await this.fireCloudlyRequest(profile.origin, 'getServiceRegistryTarget', { identity, serviceId: projectLink.serviceId, tag }).then(response => response.registryTarget);
|
|
302
|
+
if (!registryTarget.imageUrl) {
|
|
303
|
+
throw new Error('Cloudly did not return a registry target image URL for the linked service.');
|
|
304
|
+
}
|
|
305
|
+
if (optionsArg.image && optionsArg.image !== registryTarget.imageUrl) {
|
|
306
|
+
throw new Error(`Requested image "${optionsArg.image}" does not match Cloudly registry target "${registryTarget.imageUrl}".`);
|
|
307
|
+
}
|
|
308
|
+
image = registryTarget.imageUrl;
|
|
309
|
+
if (localImage && localImage !== image) {
|
|
310
|
+
warnings.push(`Local .smartconfig Docker image "${localImage}" differs from Cloudly registry target "${image}". Using Cloudly target.`);
|
|
311
|
+
}
|
|
312
|
+
steps.push({ name: 'cloudly-preflight', status: 'passed', message: `Validated service "${service.data.name}" and registry target.` });
|
|
313
|
+
if (!optionsArg.skipPush) {
|
|
314
|
+
await this.ensureCleanGitWorktree(steps, Boolean(optionsArg.allowDirty));
|
|
315
|
+
}
|
|
316
|
+
if (optionsArg.skipChecks) {
|
|
317
|
+
steps.push({ name: 'checks', status: 'skipped', message: 'Project checks skipped by option.' });
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
const checkCommand = await this.resolveProjectCheckCommand();
|
|
321
|
+
if (checkCommand) {
|
|
322
|
+
await this.runCheckedCommand({
|
|
323
|
+
command: checkCommand.command,
|
|
324
|
+
args: checkCommand.args,
|
|
325
|
+
cwd: this.projectDir,
|
|
326
|
+
env: this.env,
|
|
327
|
+
timeoutMs: defaultCommandTimeoutMs,
|
|
328
|
+
maxOutputBytes: defaultMaxCommandOutputBytes,
|
|
329
|
+
}, 'checks', steps, deploySecretValues);
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
steps.push({ name: 'checks', status: 'skipped', message: 'No test or build script found in package.json.' });
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
let digest;
|
|
336
|
+
if (optionsArg.skipPush) {
|
|
337
|
+
steps.push({ name: 'docker-buildx-push', status: 'skipped', message: 'Docker push skipped by option.' });
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
const buildEnv = await this.resolveDockerBuildEnv(localConfig);
|
|
341
|
+
const buildArgs = Object.keys(buildEnv.buildArgValues);
|
|
342
|
+
const dockerArgs = [
|
|
343
|
+
'buildx',
|
|
344
|
+
'build',
|
|
345
|
+
...(optionsArg.builder ? ['--builder', optionsArg.builder] : []),
|
|
346
|
+
'--platform',
|
|
347
|
+
platform,
|
|
348
|
+
'--provenance=false',
|
|
349
|
+
'--sbom=false',
|
|
350
|
+
...buildArgs.flatMap(buildArg => ['--build-arg', buildArg]),
|
|
351
|
+
'-t',
|
|
352
|
+
image,
|
|
353
|
+
'--push',
|
|
354
|
+
'.',
|
|
355
|
+
];
|
|
356
|
+
const commandResult = await this.runCheckedCommand({
|
|
357
|
+
command: 'docker',
|
|
358
|
+
args: dockerArgs,
|
|
359
|
+
cwd: this.projectDir,
|
|
360
|
+
env: {
|
|
361
|
+
...this.env,
|
|
362
|
+
...buildEnv.buildArgValues,
|
|
363
|
+
},
|
|
364
|
+
timeoutMs: dockerCommandTimeoutMs,
|
|
365
|
+
maxOutputBytes: defaultMaxCommandOutputBytes,
|
|
366
|
+
}, 'docker-buildx-push', steps, [...deploySecretValues, ...buildEnv.secretValues]);
|
|
367
|
+
digest = this.extractDigest(`${commandResult.stdout}\n${commandResult.stderr}`);
|
|
368
|
+
}
|
|
369
|
+
let deployments = await this.getCloudlyDeployments(profile.origin, identity, projectLink.serviceId);
|
|
370
|
+
if (waitSeconds > 0) {
|
|
371
|
+
deployments = await this.waitForHealthyDeployment(profile.origin, identity, projectLink.serviceId, waitSeconds);
|
|
372
|
+
}
|
|
373
|
+
let verifyStatus;
|
|
374
|
+
if (optionsArg.verifyUrl) {
|
|
375
|
+
verifyStatus = await this.verifyUrl(optionsArg.verifyUrl);
|
|
376
|
+
steps.push({
|
|
377
|
+
name: 'verify-url',
|
|
378
|
+
status: verifyStatus >= 200 && verifyStatus < 400 ? 'passed' : 'failed',
|
|
379
|
+
message: `${optionsArg.verifyUrl} returned HTTP ${verifyStatus}.`,
|
|
380
|
+
});
|
|
381
|
+
if (verifyStatus < 200 || verifyStatus >= 400) {
|
|
382
|
+
throw new Error(`Verification URL returned HTTP ${verifyStatus}: ${optionsArg.verifyUrl}`);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
return {
|
|
386
|
+
schemaVersion,
|
|
387
|
+
projectDir: this.projectDir,
|
|
388
|
+
profile: profile.name,
|
|
389
|
+
serviceId: projectLink.serviceId,
|
|
390
|
+
deploymentId: projectLink.deploymentId,
|
|
391
|
+
dryRun: false,
|
|
392
|
+
image,
|
|
393
|
+
tag,
|
|
394
|
+
platform,
|
|
395
|
+
pushed: !optionsArg.skipPush,
|
|
396
|
+
triggered: !optionsArg.skipPush,
|
|
397
|
+
verified: Boolean(optionsArg.verifyUrl && verifyStatus && verifyStatus >= 200 && verifyStatus < 400),
|
|
398
|
+
digest,
|
|
399
|
+
verifyStatus,
|
|
400
|
+
service: {
|
|
401
|
+
serviceId: service.id,
|
|
402
|
+
serviceName: service.data.name,
|
|
403
|
+
deployOnPush: true,
|
|
404
|
+
registryTarget: {
|
|
405
|
+
registryHost: registryTarget.registryHost,
|
|
406
|
+
repository: registryTarget.repository,
|
|
407
|
+
tag: registryTarget.tag,
|
|
408
|
+
imageUrl: registryTarget.imageUrl,
|
|
409
|
+
},
|
|
410
|
+
},
|
|
411
|
+
deployments,
|
|
412
|
+
steps,
|
|
413
|
+
warnings,
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
defaultCommandRunner = async (optionsArg) => {
|
|
417
|
+
return await new Promise((resolve, reject) => {
|
|
418
|
+
const timeoutMs = optionsArg.timeoutMs ?? defaultCommandTimeoutMs;
|
|
419
|
+
const maxOutputBytes = optionsArg.maxOutputBytes ?? defaultMaxCommandOutputBytes;
|
|
420
|
+
const child = plugins.childProcess.spawn(optionsArg.command, optionsArg.args, {
|
|
421
|
+
cwd: optionsArg.cwd,
|
|
422
|
+
env: {
|
|
423
|
+
...process.env,
|
|
424
|
+
...optionsArg.env,
|
|
425
|
+
},
|
|
426
|
+
detached: process.platform !== 'win32',
|
|
427
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
428
|
+
});
|
|
429
|
+
const stdoutChunks = [];
|
|
430
|
+
const stderrChunks = [];
|
|
431
|
+
let stdoutBytes = 0;
|
|
432
|
+
let stderrBytes = 0;
|
|
433
|
+
let stdoutTruncated = false;
|
|
434
|
+
let stderrTruncated = false;
|
|
435
|
+
let timedOut = false;
|
|
436
|
+
let timeoutRef;
|
|
437
|
+
let killTimeoutRef;
|
|
438
|
+
const appendOutput = (chunksArg, chunkArg, bytesArg) => {
|
|
439
|
+
const bytes = bytesArg + chunkArg.length;
|
|
440
|
+
const remainingBytes = maxOutputBytes - bytesArg;
|
|
441
|
+
if (remainingBytes > 0) {
|
|
442
|
+
chunksArg.push(chunkArg.subarray(0, remainingBytes));
|
|
443
|
+
}
|
|
444
|
+
return { bytes, truncated: bytes > maxOutputBytes };
|
|
445
|
+
};
|
|
446
|
+
child.stdout?.on('data', chunkArg => {
|
|
447
|
+
const result = appendOutput(stdoutChunks, Buffer.from(chunkArg), stdoutBytes);
|
|
448
|
+
stdoutBytes = result.bytes;
|
|
449
|
+
stdoutTruncated ||= result.truncated;
|
|
450
|
+
});
|
|
451
|
+
child.stderr?.on('data', chunkArg => {
|
|
452
|
+
const result = appendOutput(stderrChunks, Buffer.from(chunkArg), stderrBytes);
|
|
453
|
+
stderrBytes = result.bytes;
|
|
454
|
+
stderrTruncated ||= result.truncated;
|
|
455
|
+
});
|
|
456
|
+
const clearTimers = (clearKillTimerArg = true) => {
|
|
457
|
+
if (timeoutRef)
|
|
458
|
+
clearTimeout(timeoutRef);
|
|
459
|
+
if (clearKillTimerArg && killTimeoutRef)
|
|
460
|
+
clearTimeout(killTimeoutRef);
|
|
461
|
+
};
|
|
462
|
+
const killProcess = (signalArg) => {
|
|
463
|
+
if (process.platform !== 'win32' && child.pid) {
|
|
464
|
+
try {
|
|
465
|
+
process.kill(-child.pid, signalArg);
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
catch {
|
|
469
|
+
// Fall back to direct child termination below.
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
child.kill(signalArg);
|
|
473
|
+
};
|
|
474
|
+
timeoutRef = setTimeout(() => {
|
|
475
|
+
timedOut = true;
|
|
476
|
+
killProcess('SIGTERM');
|
|
477
|
+
killTimeoutRef = setTimeout(() => {
|
|
478
|
+
killProcess('SIGKILL');
|
|
479
|
+
}, 10000);
|
|
480
|
+
killTimeoutRef.unref?.();
|
|
481
|
+
}, timeoutMs);
|
|
482
|
+
timeoutRef.unref?.();
|
|
483
|
+
child.on('error', errorArg => {
|
|
484
|
+
clearTimers(!timedOut);
|
|
485
|
+
reject(errorArg);
|
|
486
|
+
});
|
|
487
|
+
child.on('close', exitCode => {
|
|
488
|
+
clearTimers(!timedOut);
|
|
489
|
+
if (stdoutTruncated) {
|
|
490
|
+
stdoutChunks.push(Buffer.from('\n[tsdeploy: stdout truncated]\n'));
|
|
491
|
+
}
|
|
492
|
+
if (stderrTruncated) {
|
|
493
|
+
stderrChunks.push(Buffer.from('\n[tsdeploy: stderr truncated]\n'));
|
|
494
|
+
}
|
|
495
|
+
if (timedOut) {
|
|
496
|
+
stderrChunks.push(Buffer.from(`\n[tsdeploy: command timed out after ${timeoutMs}ms]\n`));
|
|
497
|
+
}
|
|
498
|
+
resolve({
|
|
499
|
+
command: optionsArg.command,
|
|
500
|
+
args: optionsArg.args,
|
|
501
|
+
exitCode: timedOut ? 124 : exitCode ?? 1,
|
|
502
|
+
stdout: Buffer.concat(stdoutChunks).toString('utf8'),
|
|
503
|
+
stderr: Buffer.concat(stderrChunks).toString('utf8'),
|
|
504
|
+
});
|
|
505
|
+
});
|
|
506
|
+
});
|
|
507
|
+
};
|
|
508
|
+
defaultCloudlyRequest = async (originArg, methodArg, requestArg) => {
|
|
509
|
+
const controller = new AbortController();
|
|
510
|
+
const timeoutRef = setTimeout(() => controller.abort(), defaultCloudlyRequestTimeoutMs);
|
|
511
|
+
timeoutRef.unref?.();
|
|
512
|
+
try {
|
|
513
|
+
const response = await fetch(`${originArg.replace(/\/+$/, '')}/typedrequest`, {
|
|
514
|
+
method: 'POST',
|
|
515
|
+
headers: {
|
|
516
|
+
'content-type': 'application/json',
|
|
517
|
+
},
|
|
518
|
+
body: JSON.stringify({
|
|
519
|
+
method: methodArg,
|
|
520
|
+
request: requestArg,
|
|
521
|
+
response: {},
|
|
522
|
+
correlation: {
|
|
523
|
+
id: plugins.crypto.randomUUID(),
|
|
524
|
+
phase: 'request',
|
|
525
|
+
},
|
|
526
|
+
}),
|
|
527
|
+
signal: controller.signal,
|
|
528
|
+
});
|
|
529
|
+
if (!response.ok) {
|
|
530
|
+
await response.body?.cancel().catch(() => undefined);
|
|
531
|
+
throw new Error(`Cloudly request "${methodArg}" failed with HTTP ${response.status}.`);
|
|
532
|
+
}
|
|
533
|
+
const payload = await response.json();
|
|
534
|
+
if (payload.error) {
|
|
535
|
+
throw new plugins.typedrequest.TypedResponseError(payload.error.text, payload.error.data);
|
|
536
|
+
}
|
|
537
|
+
if (payload.retry) {
|
|
538
|
+
throw new Error(`Cloudly request "${methodArg}" requested retry after ${payload.retry.waitForMs}ms: ${payload.retry.reason}`);
|
|
539
|
+
}
|
|
540
|
+
return payload.response;
|
|
541
|
+
}
|
|
542
|
+
catch (error) {
|
|
543
|
+
if (error.name === 'AbortError') {
|
|
544
|
+
throw new Error(`Cloudly request "${methodArg}" timed out after ${defaultCloudlyRequestTimeoutMs}ms.`);
|
|
545
|
+
}
|
|
546
|
+
throw error;
|
|
547
|
+
}
|
|
548
|
+
finally {
|
|
549
|
+
clearTimeout(timeoutRef);
|
|
550
|
+
}
|
|
551
|
+
};
|
|
552
|
+
async fireCloudlyRequest(originArg, methodArg, requestArg) {
|
|
553
|
+
return await this.cloudlyRequest(originArg, methodArg, requestArg);
|
|
554
|
+
}
|
|
555
|
+
async resolveCloudlyIdentity(profileArg, optionsArg) {
|
|
556
|
+
const username = optionsArg.username || this.env.TSDEPLOY_CLOUDLY_USERNAME || this.env.CLOUDLY_USERNAME;
|
|
557
|
+
const password = optionsArg.password || this.env.TSDEPLOY_CLOUDLY_PASSWORD || this.env.CLOUDLY_PASSWORD;
|
|
558
|
+
if (username && password) {
|
|
559
|
+
const response = await this.fireCloudlyRequest(profileArg.origin, 'adminLoginWithUsernameAndPassword', { username, password });
|
|
560
|
+
return response.identity;
|
|
561
|
+
}
|
|
562
|
+
const token = optionsArg.token || this.env.TSDEPLOY_TOKEN || profileArg.token;
|
|
563
|
+
if (token) {
|
|
564
|
+
const response = await this.fireCloudlyRequest(profileArg.origin, 'getIdentityByToken', { token });
|
|
565
|
+
return response.identity;
|
|
566
|
+
}
|
|
567
|
+
throw new Error('Cloudly credentials are required for deploy. Provide --token, TSDEPLOY_TOKEN, profile token, or TSDEPLOY_CLOUDLY_USERNAME/TSDEPLOY_CLOUDLY_PASSWORD.');
|
|
568
|
+
}
|
|
569
|
+
async readProjectSmartconfig() {
|
|
570
|
+
try {
|
|
571
|
+
const raw = await plugins.fs.readFile(plugins.path.join(this.projectDir, '.smartconfig.json'), 'utf8');
|
|
572
|
+
return JSON.parse(raw);
|
|
573
|
+
}
|
|
574
|
+
catch (error) {
|
|
575
|
+
if (error.code === 'ENOENT')
|
|
576
|
+
return {};
|
|
577
|
+
throw error;
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
async readProjectPackageJson() {
|
|
581
|
+
try {
|
|
582
|
+
const raw = await plugins.fs.readFile(plugins.path.join(this.projectDir, 'package.json'), 'utf8');
|
|
583
|
+
return JSON.parse(raw);
|
|
584
|
+
}
|
|
585
|
+
catch (error) {
|
|
586
|
+
if (error.code === 'ENOENT')
|
|
587
|
+
return {};
|
|
588
|
+
throw error;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
resolveLocalDockerImage(configArg, tagArg) {
|
|
592
|
+
const dockerConfig = configArg['@git.zone/tsdocker'];
|
|
593
|
+
const registries = Array.isArray(dockerConfig?.registries) ? dockerConfig.registries : [];
|
|
594
|
+
const registryRepoMap = dockerConfig?.registryRepoMap ?? {};
|
|
595
|
+
const registryHost = registries[0] ?? Object.keys(registryRepoMap)[0];
|
|
596
|
+
const repository = registryHost ? registryRepoMap[registryHost] : undefined;
|
|
597
|
+
if (!registryHost || !repository)
|
|
598
|
+
return undefined;
|
|
599
|
+
return `${registryHost}/${repository}:${tagArg}`;
|
|
600
|
+
}
|
|
601
|
+
async resolveProjectCheckCommand() {
|
|
602
|
+
const packageJson = await this.readProjectPackageJson();
|
|
603
|
+
if (packageJson.scripts?.test) {
|
|
604
|
+
return { command: 'pnpm', args: ['test'] };
|
|
605
|
+
}
|
|
606
|
+
if (packageJson.scripts?.build) {
|
|
607
|
+
return { command: 'pnpm', args: ['run', 'build'] };
|
|
608
|
+
}
|
|
609
|
+
return undefined;
|
|
610
|
+
}
|
|
611
|
+
async ensureCleanGitWorktree(stepsArg, allowDirtyArg) {
|
|
612
|
+
if (allowDirtyArg) {
|
|
613
|
+
stepsArg.push({ name: 'git-worktree', status: 'skipped', message: 'Dirty worktree check skipped by option.' });
|
|
614
|
+
return;
|
|
615
|
+
}
|
|
616
|
+
const result = await this.commandRunner({
|
|
617
|
+
command: 'git',
|
|
618
|
+
args: ['status', '--porcelain'],
|
|
619
|
+
cwd: this.projectDir,
|
|
620
|
+
env: this.env,
|
|
621
|
+
timeoutMs: 30000,
|
|
622
|
+
maxOutputBytes: 128 * 1024,
|
|
623
|
+
});
|
|
624
|
+
if (result.exitCode !== 0) {
|
|
625
|
+
stepsArg.push({ name: 'git-worktree', status: 'failed', message: 'Git status check failed.' });
|
|
626
|
+
throw new Error('Refusing to deploy because the project is not a readable git working tree. Commit the project first or pass --allowDirty.');
|
|
627
|
+
}
|
|
628
|
+
const dirtyOutput = result.stdout.trim();
|
|
629
|
+
if (dirtyOutput) {
|
|
630
|
+
stepsArg.push({ name: 'git-worktree', status: 'failed', message: 'Uncommitted changes are present.' });
|
|
631
|
+
throw new Error(`Refusing to deploy with uncommitted changes:\n${dirtyOutput}\nCommit the project first or pass --allowDirty.`);
|
|
632
|
+
}
|
|
633
|
+
stepsArg.push({ name: 'git-worktree', status: 'passed', message: 'Git working tree is clean.' });
|
|
634
|
+
}
|
|
635
|
+
async resolveDockerBuildEnv(configArg) {
|
|
636
|
+
const dockerConfig = configArg['@git.zone/tsdocker'] ?? {};
|
|
637
|
+
const szciConfig = configArg['@ship.zone/szci'] ?? {};
|
|
638
|
+
const buildArgEnvMap = {
|
|
639
|
+
...(dockerConfig.buildArgEnvMap ?? {}),
|
|
640
|
+
...(szciConfig.dockerBuildargEnvMap ?? {}),
|
|
641
|
+
};
|
|
642
|
+
const buildArgValues = {};
|
|
643
|
+
const secretValues = [];
|
|
644
|
+
for (const [buildArg, envName] of Object.entries(buildArgEnvMap)) {
|
|
645
|
+
const value = this.env[envName];
|
|
646
|
+
if (!value) {
|
|
647
|
+
throw new Error(`Missing required Docker build arg environment value: ${envName}`);
|
|
648
|
+
}
|
|
649
|
+
buildArgValues[buildArg] = value;
|
|
650
|
+
secretValues.push(value);
|
|
651
|
+
}
|
|
652
|
+
return { buildArgValues, secretValues };
|
|
653
|
+
}
|
|
654
|
+
async runCheckedCommand(commandArg, stepNameArg, stepsArg, secretValuesArg) {
|
|
655
|
+
const result = await this.commandRunner(commandArg);
|
|
656
|
+
if (result.exitCode !== 0) {
|
|
657
|
+
stepsArg.push({ name: stepNameArg, status: 'failed', message: `${commandArg.command} exited with code ${result.exitCode}.` });
|
|
658
|
+
const output = this.redactText(`${result.stdout}\n${result.stderr}`, this.collectSecretValues(commandArg.env, secretValuesArg));
|
|
659
|
+
throw new Error(`${commandArg.command} failed with exit code ${result.exitCode}:\n${output}`.trim());
|
|
660
|
+
}
|
|
661
|
+
stepsArg.push({ name: stepNameArg, status: 'passed', message: `${commandArg.command} completed successfully.` });
|
|
662
|
+
return result;
|
|
663
|
+
}
|
|
664
|
+
collectSecretValues(envArg, additionalValuesArg = []) {
|
|
665
|
+
const values = new Set();
|
|
666
|
+
const addValue = (valueArg) => {
|
|
667
|
+
if (valueArg && valueArg.length >= 4)
|
|
668
|
+
values.add(valueArg);
|
|
669
|
+
};
|
|
670
|
+
for (const value of additionalValuesArg)
|
|
671
|
+
addValue(value);
|
|
672
|
+
if (envArg) {
|
|
673
|
+
for (const [key, value] of Object.entries(envArg)) {
|
|
674
|
+
if (/(token|password|secret|credential|private|auth|key)/i.test(key)) {
|
|
675
|
+
addValue(value);
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
return [...values];
|
|
680
|
+
}
|
|
681
|
+
redactText(textArg, secretValuesArg) {
|
|
682
|
+
let result = textArg;
|
|
683
|
+
for (const secret of secretValuesArg.filter(Boolean)) {
|
|
684
|
+
result = result.split(secret).join('[redacted]');
|
|
685
|
+
}
|
|
686
|
+
return result;
|
|
687
|
+
}
|
|
688
|
+
extractDigest(outputArg) {
|
|
689
|
+
const preferredPatterns = [
|
|
690
|
+
/pushing manifest for .+@(sha256:[a-f0-9]{64})/gi,
|
|
691
|
+
/exporting manifest list (sha256:[a-f0-9]{64})/gi,
|
|
692
|
+
/exporting manifest (sha256:[a-f0-9]{64})/gi,
|
|
693
|
+
];
|
|
694
|
+
for (const pattern of preferredPatterns) {
|
|
695
|
+
const matches = [...outputArg.matchAll(pattern)];
|
|
696
|
+
const digest = matches.at(-1)?.[1];
|
|
697
|
+
if (digest)
|
|
698
|
+
return digest;
|
|
699
|
+
}
|
|
700
|
+
return [...outputArg.matchAll(/sha256:[a-f0-9]{64}/gi)].at(-1)?.[0];
|
|
701
|
+
}
|
|
702
|
+
async getCloudlyDeployments(originArg, identityArg, serviceIdArg) {
|
|
703
|
+
const response = await this.fireCloudlyRequest(originArg, 'getDeploymentsByService', { identity: identityArg, serviceId: serviceIdArg });
|
|
704
|
+
return response.deployments.map(deployment => ({
|
|
705
|
+
deploymentId: deployment.id,
|
|
706
|
+
serviceId: deployment.serviceId,
|
|
707
|
+
serviceName: deployment.serviceName,
|
|
708
|
+
status: deployment.status,
|
|
709
|
+
healthStatus: deployment.healthStatus,
|
|
710
|
+
nodeName: deployment.nodeName,
|
|
711
|
+
version: deployment.version,
|
|
712
|
+
containerId: deployment.containerId,
|
|
713
|
+
deployedAt: deployment.deployedAt,
|
|
714
|
+
updatedAt: deployment.updatedAt,
|
|
715
|
+
}));
|
|
716
|
+
}
|
|
717
|
+
async waitForHealthyDeployment(originArg, identityArg, serviceIdArg, waitSecondsArg) {
|
|
718
|
+
const deadline = Date.now() + waitSecondsArg * 1000;
|
|
719
|
+
let deployments = [];
|
|
720
|
+
while (Date.now() <= deadline) {
|
|
721
|
+
deployments = await this.getCloudlyDeployments(originArg, identityArg, serviceIdArg);
|
|
722
|
+
if (deployments.some(deployment => deployment.status === 'running' && deployment.healthStatus === 'healthy')) {
|
|
723
|
+
return deployments;
|
|
724
|
+
}
|
|
725
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
726
|
+
}
|
|
727
|
+
throw new Error(`No healthy running deployment observed for service ${serviceIdArg} within ${waitSecondsArg}s.`);
|
|
728
|
+
}
|
|
729
|
+
async verifyUrl(urlArg) {
|
|
730
|
+
const controller = new AbortController();
|
|
731
|
+
const timeoutRef = setTimeout(() => controller.abort(), defaultVerifyUrlTimeoutMs);
|
|
732
|
+
timeoutRef.unref?.();
|
|
733
|
+
try {
|
|
734
|
+
const response = await fetch(urlArg, { method: 'HEAD', signal: controller.signal });
|
|
735
|
+
return response.status;
|
|
736
|
+
}
|
|
737
|
+
catch (error) {
|
|
738
|
+
if (error.name === 'AbortError') {
|
|
739
|
+
throw new Error(`Verification URL timed out after ${defaultVerifyUrlTimeoutMs}ms: ${urlArg}`);
|
|
740
|
+
}
|
|
741
|
+
throw error;
|
|
742
|
+
}
|
|
743
|
+
finally {
|
|
744
|
+
clearTimeout(timeoutRef);
|
|
745
|
+
}
|
|
746
|
+
}
|
|
218
747
|
}
|
|
219
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50c2RlcGxveS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMudHNkZXBsb3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFvQnhDLE1BQU0sYUFBYSxHQUFHLENBQVUsQ0FBQztBQUNqQyxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDO0FBRTdDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxVQUFrQixFQUFVLEVBQUU7SUFDMUQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLGlGQUFpRixDQUFDLENBQUM7SUFDckcsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUVGLE1BQU0sZUFBZSxHQUFHLENBQUMsU0FBaUIsRUFBbUIsRUFBRTtJQUM3RCxJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3RELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7QUFDbEUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxTQUFpQixFQUFVLEVBQUU7SUFDcEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0IsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0MsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENB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
|
|
748
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50c2RlcGxveS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMudHNkZXBsb3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUEwQ3hDLE1BQU0sYUFBYSxHQUFHLENBQVUsQ0FBQztBQUNqQyxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDO0FBQzdDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQztBQUN0QyxNQUFNLDhCQUE4QixHQUFHLEtBQUssQ0FBQztBQUM3QyxNQUFNLHVCQUF1QixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQy9DLE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDOUMsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2pELE1BQU0seUJBQXlCLEdBQUcsS0FBSyxDQUFDO0FBRXhDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxVQUFrQixFQUFVLEVBQUU7SUFDMUQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLGlGQUFpRixDQUFDLENBQUM7SUFDckcsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUVGLE1BQU0sZUFBZSxHQUFHLENBQUMsU0FBaUIsRUFBbUIsRUFBRTtJQUM3RCxJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3RELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7QUFDbEUs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
|