@git.zone/cli 6.0.1 → 6.1.1
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/helpers.workflow.d.ts +2 -0
- package/dist_ts/helpers.workflow.js +96 -25
- package/dist_ts/mod_config/index.js +176 -88
- package/dist_ts/mod_release/classes.releasejournal.d.ts +60 -10
- package/dist_ts/mod_release/classes.releasejournal.js +513 -21
- package/dist_ts/mod_release/helpers.releasepublication.d.ts +5 -3
- package/dist_ts/mod_release/helpers.releasepublication.js +390 -13
- package/dist_ts/mod_release/helpers.tsdockerprotocol.d.ts +60 -0
- package/dist_ts/mod_release/helpers.tsdockerprotocol.js +442 -0
- package/dist_ts/mod_release/index.d.ts +1 -1
- package/dist_ts/mod_release/index.js +101 -19
- package/dist_ts/plugins.d.ts +5 -1
- package/dist_ts/plugins.js +5 -2
- package/package.json +2 -1
- package/readme.hints.md +43 -17
- package/readme.md +83 -75
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/helpers.workflow.ts +191 -49
- package/ts/mod_config/index.ts +320 -146
- package/ts/mod_release/classes.releasejournal.ts +939 -70
- package/ts/mod_release/helpers.releasepublication.ts +786 -49
- package/ts/mod_release/helpers.tsdockerprotocol.ts +806 -0
- package/ts/mod_release/index.ts +231 -74
- package/ts/plugins.ts +20 -0
package/ts/mod_release/index.ts
CHANGED
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
readPendingChangelog,
|
|
10
10
|
} from "../helpers.changelog.js";
|
|
11
11
|
import {
|
|
12
|
+
resolveReleaseDockerConfiguration,
|
|
12
13
|
resolveReleaseWorkflow,
|
|
13
14
|
resolveReleaseResumeConfiguration,
|
|
14
15
|
type IResolvedReleaseResumeConfiguration,
|
|
@@ -27,13 +28,16 @@ import {
|
|
|
27
28
|
} from "./helpers.releasebranch.js";
|
|
28
29
|
import {
|
|
29
30
|
ReleaseJournalStore,
|
|
31
|
+
createInitialReleaseDockerJournal,
|
|
30
32
|
createInitialTargetStatus,
|
|
31
33
|
finalizeJournalCompletion,
|
|
32
34
|
normalizeReleaseGitRemoteName,
|
|
33
35
|
normalizeReleaseVersion,
|
|
34
36
|
resolveGitCommonDirectory,
|
|
35
37
|
type IReleaseArtifact,
|
|
36
|
-
type
|
|
38
|
+
type TReleaseJournal,
|
|
39
|
+
type IReleaseJournalV1,
|
|
40
|
+
type IReleaseJournalV2,
|
|
37
41
|
} from "./classes.releasejournal.js";
|
|
38
42
|
import {
|
|
39
43
|
assertNoLegacyNpmPublisher,
|
|
@@ -44,6 +48,13 @@ import {
|
|
|
44
48
|
verifyStoredNpmArtifact,
|
|
45
49
|
} from "./helpers.npmartifact.js";
|
|
46
50
|
import { executeReleasePublication } from "./helpers.releasepublication.js";
|
|
51
|
+
import {
|
|
52
|
+
TsdockerReleaseClient,
|
|
53
|
+
canonicalReleaseJson,
|
|
54
|
+
createReleaseQualificationRequest,
|
|
55
|
+
type ITsdockerReleaseClient,
|
|
56
|
+
type IReleaseQualificationRequest,
|
|
57
|
+
} from "./helpers.tsdockerprotocol.js";
|
|
47
58
|
|
|
48
59
|
export { buildReleaseGitPushArgs } from "./helpers.releasepublication.js";
|
|
49
60
|
|
|
@@ -92,7 +103,7 @@ const runInternal = async (argvArg: any): Promise<void> => {
|
|
|
92
103
|
});
|
|
93
104
|
const mergeRequested = resolveReleaseMergeFlag(argvArg);
|
|
94
105
|
const workflow = await resolveReleaseWorkflow(argvArg);
|
|
95
|
-
assertReleaseConfiguration(workflow);
|
|
106
|
+
assertReleaseConfiguration(workflow, mergeRequested);
|
|
96
107
|
let branchContext: IReleaseBranchContext = await inspectReleaseBranch({
|
|
97
108
|
smartshell: smartshellInstance,
|
|
98
109
|
cwd: paths.cwd,
|
|
@@ -108,11 +119,15 @@ const runInternal = async (argvArg: any): Promise<void> => {
|
|
|
108
119
|
return;
|
|
109
120
|
}
|
|
110
121
|
|
|
122
|
+
const preflightTsdocker = workflow.targets.includes("docker")
|
|
123
|
+
? new TsdockerReleaseClient(smartshellInstance, branchContext.sourceCwd)
|
|
124
|
+
: undefined;
|
|
111
125
|
await assertFreshReleaseCapabilities(
|
|
112
126
|
smartshellInstance,
|
|
113
127
|
workflow,
|
|
114
128
|
branchContext.sourceCwd,
|
|
115
129
|
branchContext.pushUrl,
|
|
130
|
+
preflightTsdocker,
|
|
116
131
|
);
|
|
117
132
|
|
|
118
133
|
const pending = await readPendingChangelog(
|
|
@@ -135,6 +150,16 @@ const runInternal = async (argvArg: any): Promise<void> => {
|
|
|
135
150
|
currentVersion,
|
|
136
151
|
versionType,
|
|
137
152
|
);
|
|
153
|
+
if (preflightTsdocker) {
|
|
154
|
+
await preflightTsdocker.validate(
|
|
155
|
+
createDockerQualificationRequest(
|
|
156
|
+
workflow,
|
|
157
|
+
branchContext.sourceCwd,
|
|
158
|
+
plannedVersion,
|
|
159
|
+
branchContext.sourceOid,
|
|
160
|
+
),
|
|
161
|
+
);
|
|
162
|
+
}
|
|
138
163
|
|
|
139
164
|
if (workflow.confirmation === "prompt") {
|
|
140
165
|
if (!mode.interactive) {
|
|
@@ -234,6 +259,18 @@ const runInternal = async (argvArg: any): Promise<void> => {
|
|
|
234
259
|
};
|
|
235
260
|
|
|
236
261
|
await ensurePublicationState();
|
|
262
|
+
const tsdocker = workflow.targets.includes("docker")
|
|
263
|
+
? new TsdockerReleaseClient(smartshellInstance, releaseCwd)
|
|
264
|
+
: undefined;
|
|
265
|
+
await tsdocker?.assertCapabilities();
|
|
266
|
+
const dockerRequest = tsdocker
|
|
267
|
+
? createDockerQualificationRequest(
|
|
268
|
+
workflow,
|
|
269
|
+
releaseCwd,
|
|
270
|
+
newVersion,
|
|
271
|
+
releaseRefs.mainOid,
|
|
272
|
+
)
|
|
273
|
+
: undefined;
|
|
237
274
|
const journalContext = await createReleaseJournal({
|
|
238
275
|
smartshell: smartshellInstance,
|
|
239
276
|
workflow,
|
|
@@ -242,6 +279,8 @@ const runInternal = async (argvArg: any): Promise<void> => {
|
|
|
242
279
|
expectedRemoteMainOid,
|
|
243
280
|
version: newVersion,
|
|
244
281
|
refs: releaseRefs,
|
|
282
|
+
dockerRequest,
|
|
283
|
+
tsdocker,
|
|
245
284
|
ensurePublicationState,
|
|
246
285
|
});
|
|
247
286
|
const finalJournal = await executeReleasePublication({
|
|
@@ -250,6 +289,7 @@ const runInternal = async (argvArg: any): Promise<void> => {
|
|
|
250
289
|
store: journalContext.store,
|
|
251
290
|
journal: journalContext.journal,
|
|
252
291
|
pushUrl: releasePushUrl,
|
|
292
|
+
tsdocker,
|
|
253
293
|
ensurePublicationState,
|
|
254
294
|
});
|
|
255
295
|
printReleaseJournalSummary(finalJournal);
|
|
@@ -260,14 +300,18 @@ const assertFreshReleaseCapabilities = async (
|
|
|
260
300
|
workflowArg: IResolvedReleaseWorkflow,
|
|
261
301
|
cwdArg: string,
|
|
262
302
|
pushUrlArg?: string,
|
|
303
|
+
tsdockerArg?: ITsdockerReleaseClient,
|
|
263
304
|
): Promise<void> => {
|
|
264
305
|
if (workflowArg.targets.includes("docker")) {
|
|
265
|
-
|
|
266
|
-
"
|
|
267
|
-
|
|
306
|
+
if (!tsdockerArg) {
|
|
307
|
+
throw new Error("Docker release target requires project-local tSDocker.");
|
|
308
|
+
}
|
|
309
|
+
await tsdockerArg.assertCapabilities();
|
|
268
310
|
}
|
|
269
311
|
if (workflowArg.targets.includes("git") && !pushUrlArg) {
|
|
270
|
-
throw new Error(
|
|
312
|
+
throw new Error(
|
|
313
|
+
"The Git release target requires one resolved push destination.",
|
|
314
|
+
);
|
|
271
315
|
}
|
|
272
316
|
if (
|
|
273
317
|
workflowArg.targets.includes("git") ||
|
|
@@ -282,7 +326,20 @@ const assertFreshReleaseCapabilities = async (
|
|
|
282
326
|
|
|
283
327
|
const assertReleaseConfiguration = (
|
|
284
328
|
workflowArg: IResolvedReleaseWorkflow,
|
|
329
|
+
mergeRequestedArg: boolean,
|
|
285
330
|
): void => {
|
|
331
|
+
if (workflowArg.targets.includes("docker")) {
|
|
332
|
+
if (mergeRequestedArg) {
|
|
333
|
+
throw new Error(
|
|
334
|
+
"Docker releases cannot use --merge because qualification must precede every remote publication.",
|
|
335
|
+
);
|
|
336
|
+
}
|
|
337
|
+
if (workflowArg.dockerNoBuild) {
|
|
338
|
+
throw new Error(
|
|
339
|
+
"Journaled Docker qualification always builds; release.targets.docker.noBuild must be false or absent.",
|
|
340
|
+
);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
286
343
|
if (workflowArg.targets.includes("git")) {
|
|
287
344
|
normalizeReleaseGitRemoteName(workflowArg.gitRemote);
|
|
288
345
|
}
|
|
@@ -311,7 +368,8 @@ const assertReleaseConfiguration = (
|
|
|
311
368
|
if (
|
|
312
369
|
new Set(canonicalRegistries).size !== canonicalRegistries.length ||
|
|
313
370
|
canonicalRegistries.some(
|
|
314
|
-
(registryArg, indexArg) =>
|
|
371
|
+
(registryArg, indexArg) =>
|
|
372
|
+
registryArg !== workflowArg.npmRegistries[indexArg],
|
|
315
373
|
)
|
|
316
374
|
) {
|
|
317
375
|
throw new Error(
|
|
@@ -328,12 +386,33 @@ interface ICreateReleaseJournalOptions {
|
|
|
328
386
|
expectedRemoteMainOid?: string;
|
|
329
387
|
version: string;
|
|
330
388
|
refs: IReleaseRefs;
|
|
389
|
+
dockerRequest?: IReleaseQualificationRequest;
|
|
390
|
+
tsdocker?: ITsdockerReleaseClient;
|
|
331
391
|
ensurePublicationState: (expectedRemoteMainOidArg?: string) => Promise<void>;
|
|
332
392
|
}
|
|
333
393
|
|
|
394
|
+
const createDockerQualificationRequest = (
|
|
395
|
+
workflowArg: IResolvedReleaseWorkflow,
|
|
396
|
+
cwdArg: string,
|
|
397
|
+
versionArg: string,
|
|
398
|
+
revisionArg: string,
|
|
399
|
+
): IReleaseQualificationRequest =>
|
|
400
|
+
createReleaseQualificationRequest({
|
|
401
|
+
buildRegistries: workflowArg.dockerBuildRegistries,
|
|
402
|
+
cached: workflowArg.dockerCached,
|
|
403
|
+
context: workflowArg.dockerContext,
|
|
404
|
+
cwd: cwdArg,
|
|
405
|
+
parallel: workflowArg.dockerParallel,
|
|
406
|
+
patterns: workflowArg.dockerPatterns,
|
|
407
|
+
registry: workflowArg.dockerRegistry,
|
|
408
|
+
revision: revisionArg,
|
|
409
|
+
test: workflowArg.dockerTest,
|
|
410
|
+
version: versionArg,
|
|
411
|
+
});
|
|
412
|
+
|
|
334
413
|
const createReleaseJournal = async (
|
|
335
414
|
optionsArg: ICreateReleaseJournalOptions,
|
|
336
|
-
): Promise<{ store: ReleaseJournalStore; journal:
|
|
415
|
+
): Promise<{ store: ReleaseJournalStore; journal: TReleaseJournal }> => {
|
|
337
416
|
const gitCommonDirectory = await resolveGitCommonDirectory(
|
|
338
417
|
optionsArg.smartshell,
|
|
339
418
|
optionsArg.releaseCwd,
|
|
@@ -353,7 +432,9 @@ const createReleaseJournal = async (
|
|
|
353
432
|
);
|
|
354
433
|
}
|
|
355
434
|
|
|
356
|
-
let temporaryDirectory = await store.createTemporaryDirectory(
|
|
435
|
+
let temporaryDirectory = await store.createTemporaryDirectory(
|
|
436
|
+
optionsArg.version,
|
|
437
|
+
);
|
|
357
438
|
try {
|
|
358
439
|
let artifact: IReleaseArtifact | null = null;
|
|
359
440
|
if (optionsArg.workflow.targets.includes("npm")) {
|
|
@@ -380,53 +461,75 @@ const createReleaseJournal = async (
|
|
|
380
461
|
}
|
|
381
462
|
const now = new Date().toISOString();
|
|
382
463
|
const gitStatus = createInitialTargetStatus(gitEnabled);
|
|
383
|
-
const journal = finalizeJournalCompletion(
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
464
|
+
const journal = finalizeJournalCompletion(
|
|
465
|
+
{
|
|
466
|
+
kind: "gitzone-release-journal",
|
|
467
|
+
schemaVersion: optionsArg.dockerRequest ? 2 : 1,
|
|
468
|
+
revision: 1,
|
|
469
|
+
release: {
|
|
470
|
+
version: optionsArg.version,
|
|
471
|
+
tag: `v${optionsArg.version}`,
|
|
472
|
+
mainOid: optionsArg.refs.mainOid,
|
|
473
|
+
tagOid: optionsArg.refs.tagOid,
|
|
474
|
+
},
|
|
475
|
+
artifact,
|
|
476
|
+
git: {
|
|
477
|
+
state: gitStatus.state,
|
|
478
|
+
attempts: gitStatus.attempts,
|
|
479
|
+
attempt: gitStatus.attempt,
|
|
480
|
+
error: gitStatus.error,
|
|
481
|
+
remote: gitEnabled ? optionsArg.workflow.gitRemote : null,
|
|
482
|
+
destinationHash: gitEnabled
|
|
483
|
+
? hashReleaseDestination(optionsArg.releasePushUrl as string)
|
|
484
|
+
: null,
|
|
485
|
+
expectedRemoteMainOid: gitEnabled
|
|
486
|
+
? (optionsArg.expectedRemoteMainOid as string)
|
|
487
|
+
: null,
|
|
488
|
+
},
|
|
489
|
+
npm: {
|
|
490
|
+
access: "public",
|
|
491
|
+
tag: "latest",
|
|
492
|
+
alreadyPublished: optionsArg.workflow.targets.includes("npm")
|
|
493
|
+
? optionsArg.workflow.npmAlreadyPublished
|
|
494
|
+
: "success",
|
|
495
|
+
registries: optionsArg.workflow.targets.includes("npm")
|
|
496
|
+
? optionsArg.workflow.npmRegistries.map((registryArg) => {
|
|
497
|
+
const status = createInitialTargetStatus(true);
|
|
498
|
+
return {
|
|
499
|
+
state: status.state,
|
|
500
|
+
attempts: status.attempts,
|
|
501
|
+
attempt: status.attempt,
|
|
502
|
+
error: status.error,
|
|
503
|
+
registry: registryArg,
|
|
504
|
+
};
|
|
505
|
+
})
|
|
506
|
+
: [],
|
|
507
|
+
},
|
|
508
|
+
...(optionsArg.dockerRequest
|
|
509
|
+
? {
|
|
510
|
+
docker: createInitialReleaseDockerJournal(
|
|
511
|
+
optionsArg.dockerRequest,
|
|
512
|
+
),
|
|
513
|
+
}
|
|
514
|
+
: {}),
|
|
515
|
+
createdAt: now,
|
|
516
|
+
updatedAt: now,
|
|
517
|
+
completedAt: null,
|
|
518
|
+
} as TReleaseJournal,
|
|
519
|
+
now,
|
|
520
|
+
);
|
|
521
|
+
await optionsArg.ensurePublicationState();
|
|
522
|
+
if (optionsArg.dockerRequest) {
|
|
523
|
+
if (!optionsArg.tsdocker) {
|
|
524
|
+
throw new Error(
|
|
525
|
+
"Docker release journal installation requires the verified tSDocker protocol client.",
|
|
526
|
+
);
|
|
527
|
+
}
|
|
528
|
+
await optionsArg.tsdocker.validate(
|
|
529
|
+
optionsArg.dockerRequest,
|
|
530
|
+
temporaryDirectory,
|
|
531
|
+
);
|
|
532
|
+
}
|
|
430
533
|
const installed = await store.installPrepared(temporaryDirectory, journal);
|
|
431
534
|
temporaryDirectory = "";
|
|
432
535
|
return { store, journal: installed };
|
|
@@ -521,7 +624,9 @@ const runReleaseResume = async (
|
|
|
521
624
|
(typeof recoveryAttemptId !== "string" ||
|
|
522
625
|
!/^[0-9a-f]{32}$/.test(recoveryAttemptId))
|
|
523
626
|
) {
|
|
524
|
-
throw new Error(
|
|
627
|
+
throw new Error(
|
|
628
|
+
"--recover-attempt requires one exact 32-character owner ID.",
|
|
629
|
+
);
|
|
525
630
|
}
|
|
526
631
|
const version = normalizeReleaseVersion(argvArg._[2]);
|
|
527
632
|
const smartshellInstance = new plugins.smartshell.Smartshell({
|
|
@@ -538,10 +643,45 @@ const runReleaseResume = async (
|
|
|
538
643
|
npm: journal.npm.registries.length > 0,
|
|
539
644
|
});
|
|
540
645
|
await assertResumeConfiguration(resumeConfiguration, journal, paths.cwd);
|
|
646
|
+
let tsdocker: ITsdockerReleaseClient | undefined;
|
|
647
|
+
if (journal.schemaVersion === 2 && !journal.completedAt) {
|
|
648
|
+
const dockerConfiguration = await resolveReleaseDockerConfiguration();
|
|
649
|
+
if (dockerConfiguration.dockerNoBuild) {
|
|
650
|
+
throw new Error(
|
|
651
|
+
"Journaled Docker qualification always builds; release.targets.docker.noBuild must be false or absent.",
|
|
652
|
+
);
|
|
653
|
+
}
|
|
654
|
+
const currentRequest = createReleaseQualificationRequest({
|
|
655
|
+
buildRegistries: dockerConfiguration.dockerBuildRegistries,
|
|
656
|
+
cached: dockerConfiguration.dockerCached,
|
|
657
|
+
context: dockerConfiguration.dockerContext,
|
|
658
|
+
cwd: paths.cwd,
|
|
659
|
+
parallel: dockerConfiguration.dockerParallel,
|
|
660
|
+
patterns: dockerConfiguration.dockerPatterns,
|
|
661
|
+
registry: dockerConfiguration.dockerRegistry,
|
|
662
|
+
revision: journal.release.mainOid,
|
|
663
|
+
test: dockerConfiguration.dockerTest,
|
|
664
|
+
version: journal.release.version,
|
|
665
|
+
});
|
|
666
|
+
if (
|
|
667
|
+
canonicalReleaseJson(currentRequest) !==
|
|
668
|
+
canonicalReleaseJson(journal.docker.request)
|
|
669
|
+
) {
|
|
670
|
+
throw new Error(
|
|
671
|
+
"Current Docker release configuration does not match the journal.",
|
|
672
|
+
);
|
|
673
|
+
}
|
|
674
|
+
tsdocker = new TsdockerReleaseClient(smartshellInstance, paths.cwd);
|
|
675
|
+
await tsdocker.assertCapabilities();
|
|
676
|
+
await tsdocker.validate(journal.docker.request);
|
|
677
|
+
}
|
|
541
678
|
if (journal.artifact) {
|
|
542
679
|
await assertPnpmReleaseCapability(smartshellInstance, paths.cwd);
|
|
543
680
|
await assertNoLegacyNpmPublisher(paths.cwd);
|
|
544
|
-
await verifyStoredNpmArtifact(
|
|
681
|
+
await verifyStoredNpmArtifact(
|
|
682
|
+
store.getArtifactPath(version),
|
|
683
|
+
journal.artifact,
|
|
684
|
+
);
|
|
545
685
|
}
|
|
546
686
|
|
|
547
687
|
const branchContext = await inspectReleaseBranch({
|
|
@@ -555,7 +695,9 @@ const runReleaseResume = async (
|
|
|
555
695
|
planMode: false,
|
|
556
696
|
});
|
|
557
697
|
if (branchContext.sourceOid !== journal.release.mainOid) {
|
|
558
|
-
throw new Error(
|
|
698
|
+
throw new Error(
|
|
699
|
+
"Resume must run from the journaled release commit on main.",
|
|
700
|
+
);
|
|
559
701
|
}
|
|
560
702
|
const refs = await captureReleaseRefs(
|
|
561
703
|
smartshellInstance,
|
|
@@ -569,7 +711,8 @@ const runReleaseResume = async (
|
|
|
569
711
|
const pushUrl = gitEnabled ? branchContext.pushUrl : undefined;
|
|
570
712
|
if (
|
|
571
713
|
gitEnabled &&
|
|
572
|
-
(!pushUrl ||
|
|
714
|
+
(!pushUrl ||
|
|
715
|
+
hashReleaseDestination(pushUrl) !== journal.git.destinationHash)
|
|
573
716
|
) {
|
|
574
717
|
throw new Error("The Git push destination changed after journal creation.");
|
|
575
718
|
}
|
|
@@ -607,6 +750,7 @@ const runReleaseResume = async (
|
|
|
607
750
|
journal,
|
|
608
751
|
pushUrl,
|
|
609
752
|
recoveryAttemptId,
|
|
753
|
+
tsdocker,
|
|
610
754
|
ensurePublicationState,
|
|
611
755
|
});
|
|
612
756
|
printReleaseJournalSummary(finalJournal);
|
|
@@ -614,7 +758,7 @@ const runReleaseResume = async (
|
|
|
614
758
|
|
|
615
759
|
const assertResumeConfiguration = async (
|
|
616
760
|
workflowArg: IResolvedReleaseResumeConfiguration,
|
|
617
|
-
journalArg:
|
|
761
|
+
journalArg: TReleaseJournal,
|
|
618
762
|
cwdArg: string,
|
|
619
763
|
): Promise<void> => {
|
|
620
764
|
if (
|
|
@@ -635,14 +779,16 @@ const assertResumeConfiguration = async (
|
|
|
635
779
|
workflowArg.npmAccessLevel !== journalArg.npm.access ||
|
|
636
780
|
workflowArg.npmAlreadyPublished !== journalArg.npm.alreadyPublished)
|
|
637
781
|
) {
|
|
638
|
-
throw new Error(
|
|
782
|
+
throw new Error(
|
|
783
|
+
"Current npm release configuration does not match the journal.",
|
|
784
|
+
);
|
|
639
785
|
}
|
|
640
786
|
if (journalArg.git.state !== "skipped" || journalArg.artifact) {
|
|
641
787
|
await assertNoLegacyNpmPublisher(cwdArg);
|
|
642
788
|
}
|
|
643
789
|
};
|
|
644
790
|
|
|
645
|
-
const printReleaseJournalSummary = (journalArg:
|
|
791
|
+
const printReleaseJournalSummary = (journalArg: TReleaseJournal): void => {
|
|
646
792
|
console.log("");
|
|
647
793
|
console.log(`Release v${journalArg.release.version}`);
|
|
648
794
|
console.log(`journal revision: ${journalArg.revision}`);
|
|
@@ -653,6 +799,17 @@ const printReleaseJournalSummary = (journalArg: IReleaseJournal): void => {
|
|
|
653
799
|
for (const registry of journalArg.npm.registries) {
|
|
654
800
|
console.log(`npm ${registry.registry}: ${registry.state}`);
|
|
655
801
|
}
|
|
802
|
+
if (journalArg.schemaVersion === 2) {
|
|
803
|
+
console.log(
|
|
804
|
+
`docker qualification ${journalArg.docker.request.candidateId}: ${journalArg.docker.qualification.state}`,
|
|
805
|
+
);
|
|
806
|
+
for (const promotion of journalArg.docker.promotions) {
|
|
807
|
+
console.log(
|
|
808
|
+
`docker promotion ${promotion.promotionId}: ${promotion.state}`,
|
|
809
|
+
);
|
|
810
|
+
}
|
|
811
|
+
console.log(`docker cleanup: ${journalArg.docker.cleanup.state}`);
|
|
812
|
+
}
|
|
656
813
|
console.log(`completed: ${journalArg.completedAt || "no"}`);
|
|
657
814
|
console.log("");
|
|
658
815
|
};
|
|
@@ -796,7 +953,9 @@ async function runReleaseCommitStep(
|
|
|
796
953
|
"refs/heads/main^{commit}",
|
|
797
954
|
);
|
|
798
955
|
if (headOid !== mainOid) {
|
|
799
|
-
throw new Error(
|
|
956
|
+
throw new Error(
|
|
957
|
+
"HEAD and main diverged after creating the release commit.",
|
|
958
|
+
);
|
|
800
959
|
}
|
|
801
960
|
return mainOid;
|
|
802
961
|
}
|
|
@@ -916,7 +1075,6 @@ type TDockerCommandWorkflow = Pick<
|
|
|
916
1075
|
| "dockerRegistry"
|
|
917
1076
|
| "dockerBuildRegistries"
|
|
918
1077
|
| "dockerTest"
|
|
919
|
-
| "dockerNoBuild"
|
|
920
1078
|
| "dockerCached"
|
|
921
1079
|
| "dockerParallel"
|
|
922
1080
|
| "dockerContext"
|
|
@@ -941,9 +1099,6 @@ export function buildTsdockerPushCommand(
|
|
|
941
1099
|
if (workflow.dockerTest) {
|
|
942
1100
|
commandParts.push("--test");
|
|
943
1101
|
}
|
|
944
|
-
if (workflow.dockerNoBuild) {
|
|
945
|
-
commandParts.push("--no-build");
|
|
946
|
-
}
|
|
947
1102
|
if (workflow.dockerCached) {
|
|
948
1103
|
commandParts.push("--cached");
|
|
949
1104
|
}
|
|
@@ -1024,7 +1179,6 @@ function formatDockerOptions(workflow: IResolvedReleaseWorkflow): string {
|
|
|
1024
1179
|
options.push(
|
|
1025
1180
|
`parallel=${workflow.dockerParallel === true ? "true" : workflow.dockerParallel}`,
|
|
1026
1181
|
);
|
|
1027
|
-
if (workflow.dockerNoBuild) options.push("no-build");
|
|
1028
1182
|
if (workflow.dockerContext) options.push(`context=${workflow.dockerContext}`);
|
|
1029
1183
|
return options.length > 0 ? options.join(", ") : "default";
|
|
1030
1184
|
}
|
|
@@ -1060,7 +1214,8 @@ export function showHelp(mode?: ICliMode): void {
|
|
|
1060
1214
|
{ flag: "--npm", description: "Explicitly select the npm target" },
|
|
1061
1215
|
{
|
|
1062
1216
|
flag: "--docker",
|
|
1063
|
-
description:
|
|
1217
|
+
description:
|
|
1218
|
+
"Select digest-qualified Docker publication through project-local tSDocker >= 3.5.1",
|
|
1064
1219
|
},
|
|
1065
1220
|
{
|
|
1066
1221
|
flag: "--no-publish",
|
|
@@ -1078,11 +1233,13 @@ export function showHelp(mode?: ICliMode): void {
|
|
|
1078
1233
|
},
|
|
1079
1234
|
{
|
|
1080
1235
|
flag: "inspect [version]",
|
|
1081
|
-
description:
|
|
1236
|
+
description:
|
|
1237
|
+
"Read one or all durable release journals without mutation",
|
|
1082
1238
|
},
|
|
1083
1239
|
{
|
|
1084
1240
|
flag: "resume <version>",
|
|
1085
|
-
description:
|
|
1241
|
+
description:
|
|
1242
|
+
"Resume exact journaled publication without rebuilding or repacking npm artifacts",
|
|
1086
1243
|
},
|
|
1087
1244
|
{
|
|
1088
1245
|
flag: "--recover-attempt <id>",
|
|
@@ -1114,7 +1271,7 @@ export function showHelp(mode?: ICliMode): void {
|
|
|
1114
1271
|
);
|
|
1115
1272
|
console.log(" --npm Explicitly select the npm target");
|
|
1116
1273
|
console.log(
|
|
1117
|
-
" --docker Select Docker
|
|
1274
|
+
" --docker Select digest-qualified Docker publication through project-local tSDocker >= 3.5.1",
|
|
1118
1275
|
);
|
|
1119
1276
|
console.log(
|
|
1120
1277
|
" --no-publish Remove npm and Docker without implicitly enabling Git",
|
|
@@ -1130,7 +1287,7 @@ export function showHelp(mode?: ICliMode): void {
|
|
|
1130
1287
|
" inspect [version] Read one or all durable release journals without mutation",
|
|
1131
1288
|
);
|
|
1132
1289
|
console.log(
|
|
1133
|
-
" resume <version> Resume exact
|
|
1290
|
+
" resume <version> Resume exact journaled publication without rebuilding or repacking npm artifacts",
|
|
1134
1291
|
);
|
|
1135
1292
|
console.log(
|
|
1136
1293
|
" --recover-attempt Recover one exact 32-character hexadecimal attempt ID after proving its publisher stopped",
|
package/ts/plugins.ts
CHANGED
|
@@ -2,7 +2,9 @@ import * as smartlog from '@push.rocks/smartlog';
|
|
|
2
2
|
import * as smartlogDestinationLocal from '@push.rocks/smartlog-destination-local';
|
|
3
3
|
import * as smartconfig from '@push.rocks/smartconfig';
|
|
4
4
|
import * as path from 'path';
|
|
5
|
+
import * as os from 'node:os';
|
|
5
6
|
import * as fs from 'node:fs/promises';
|
|
7
|
+
import { constants as fsConstants } from 'node:fs';
|
|
6
8
|
import * as crypto from 'node:crypto';
|
|
7
9
|
import * as projectinfo from '@push.rocks/projectinfo';
|
|
8
10
|
import * as smartcli from '@push.rocks/smartcli';
|
|
@@ -17,6 +19,21 @@ import * as smartinteract from '@push.rocks/smartinteract';
|
|
|
17
19
|
import * as smartdelay from '@push.rocks/smartdelay';
|
|
18
20
|
import * as smartbucket from '@push.rocks/smartbucket';
|
|
19
21
|
import * as s3 from '@aws-sdk/client-s3';
|
|
22
|
+
import * as tsdockerReleaseProtocol from '@git.zone/tsdocker/dist_ts/classes.releaseprotocol.js';
|
|
23
|
+
|
|
24
|
+
export type {
|
|
25
|
+
IReleaseCapabilitiesResult,
|
|
26
|
+
IReleaseCleanupResult,
|
|
27
|
+
IReleaseDestinationEvidence,
|
|
28
|
+
IReleaseProbeResult,
|
|
29
|
+
IReleasePromotionContext,
|
|
30
|
+
IReleasePromotionResult,
|
|
31
|
+
IReleaseQualificationRequest,
|
|
32
|
+
IReleaseQualificationResult,
|
|
33
|
+
IReleaseValidationResult,
|
|
34
|
+
TReleasePromotionEvidence,
|
|
35
|
+
TReleaseProtocolCommand,
|
|
36
|
+
} from '@git.zone/tsdocker/dist_ts/interfaces/index.js';
|
|
20
37
|
|
|
21
38
|
// Create smartfs instance for filesystem operations
|
|
22
39
|
export const smartfs = new SmartFs(new SmartFsProviderNode());
|
|
@@ -26,7 +43,9 @@ export {
|
|
|
26
43
|
smartlogDestinationLocal,
|
|
27
44
|
smartconfig,
|
|
28
45
|
path,
|
|
46
|
+
os,
|
|
29
47
|
fs,
|
|
48
|
+
fsConstants,
|
|
30
49
|
crypto,
|
|
31
50
|
projectinfo,
|
|
32
51
|
smartcli,
|
|
@@ -40,4 +59,5 @@ export {
|
|
|
40
59
|
smartdelay,
|
|
41
60
|
smartbucket,
|
|
42
61
|
s3,
|
|
62
|
+
tsdockerReleaseProtocol,
|
|
43
63
|
};
|