@salesforce/plugin-devops-center 2.0.0 → 2.1.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/README.md +170 -44
- package/lib/commands/devops/pipeline/create.d.ts +1 -1
- package/lib/commands/devops/pipeline/create.js +5 -4
- package/lib/commands/devops/pipeline/create.js.map +1 -1
- package/lib/commands/devops/pipeline/stage/update.d.ts +19 -0
- package/lib/commands/devops/pipeline/stage/update.js +66 -0
- package/lib/commands/devops/pipeline/stage/update.js.map +1 -0
- package/lib/commands/devops/pipeline/update.d.ts +2 -1
- package/lib/commands/devops/pipeline/update.js +10 -4
- package/lib/commands/devops/pipeline/update.js.map +1 -1
- package/lib/commands/devops/promote.d.ts +5 -0
- package/lib/commands/devops/promote.js +49 -3
- package/lib/commands/devops/promote.js.map +1 -1
- package/lib/commands/devops/promotion/complete.d.ts +1 -1
- package/lib/commands/devops/promotion/complete.js +1 -1
- package/lib/commands/devops/promotion/complete.js.map +1 -1
- package/lib/commands/devops/promotion/validate.d.ts +21 -0
- package/lib/commands/devops/promotion/validate.js +137 -0
- package/lib/commands/devops/promotion/validate.js.map +1 -0
- package/lib/commands/devops/stage/branch/delete.d.ts +15 -0
- package/lib/commands/devops/stage/branch/delete.js +107 -0
- package/lib/commands/devops/stage/branch/delete.js.map +1 -0
- package/lib/commands/devops/work-item/prepare.js +0 -3
- package/lib/commands/devops/work-item/prepare.js.map +1 -1
- package/lib/utils/addPipelineStage.js +1 -0
- package/lib/utils/addPipelineStage.js.map +1 -1
- package/lib/utils/createPipeline.d.ts +1 -2
- package/lib/utils/createPipeline.js +28 -19
- package/lib/utils/createPipeline.js.map +1 -1
- package/lib/utils/deleteStageBranch.d.ts +22 -0
- package/lib/utils/deleteStageBranch.js +44 -0
- package/lib/utils/deleteStageBranch.js.map +1 -0
- package/lib/utils/pipelineUtils.d.ts +9 -0
- package/lib/utils/pipelineUtils.js +32 -0
- package/lib/utils/pipelineUtils.js.map +1 -1
- package/lib/utils/prepareWorkItem.d.ts +1 -1
- package/lib/utils/prepareWorkItem.js +4 -5
- package/lib/utils/prepareWorkItem.js.map +1 -1
- package/lib/utils/{deployStage.d.ts → promotionUtils.d.ts} +24 -0
- package/lib/utils/{deployStage.js → promotionUtils.js} +65 -1
- package/lib/utils/promotionUtils.js.map +1 -0
- package/lib/utils/soqlUtils.d.ts +5 -0
- package/lib/utils/soqlUtils.js +7 -0
- package/lib/utils/soqlUtils.js.map +1 -1
- package/messages/devops.pipeline.create.md +11 -7
- package/messages/devops.pipeline.stage.update.md +25 -0
- package/messages/devops.pipeline.update.md +10 -6
- package/messages/devops.promote.md +16 -0
- package/messages/devops.promotion.complete.md +3 -3
- package/messages/devops.promotion.validate.md +64 -0
- package/messages/devops.stage.branch.delete.md +37 -0
- package/npm-shrinkwrap.json +2 -2
- package/oclif.manifest.json +324 -72
- package/package.json +3 -3
- package/schemas/devops-pipeline-create.json +0 -3
- package/schemas/devops-pipeline-stage-update.json +22 -0
- package/schemas/devops-promote.json +38 -0
- package/schemas/devops-promotion-validate.json +66 -0
- package/schemas/devops-stage-branch-delete.json +47 -0
- package/lib/utils/deployStage.js.map +0 -1
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026, Salesforce, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { Messages } from '@salesforce/core';
|
|
17
|
+
import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
|
|
18
|
+
import { validateSalesforceId } from '../../../../utils/soqlUtils.js';
|
|
19
|
+
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
20
|
+
const messages = Messages.loadMessages('@salesforce/plugin-devops-center', 'devops.pipeline.stage.update');
|
|
21
|
+
const commonErrorMessages = Messages.loadMessages('@salesforce/plugin-devops-center', 'commonErrors');
|
|
22
|
+
export default class DevopsPipelineStageUpdate extends SfCommand {
|
|
23
|
+
static summary = messages.getMessage('summary');
|
|
24
|
+
static description = messages.getMessage('description');
|
|
25
|
+
static examples = messages.getMessages('examples');
|
|
26
|
+
static flags = {
|
|
27
|
+
'target-org': Flags.requiredOrg(),
|
|
28
|
+
'api-version': Flags.orgApiVersion(),
|
|
29
|
+
'stage-id': Flags.salesforceId({
|
|
30
|
+
summary: messages.getMessage('flags.stage-id.summary'),
|
|
31
|
+
required: true,
|
|
32
|
+
char: 's',
|
|
33
|
+
}),
|
|
34
|
+
name: Flags.string({
|
|
35
|
+
summary: messages.getMessage('flags.name.summary'),
|
|
36
|
+
required: true,
|
|
37
|
+
char: 'n',
|
|
38
|
+
}),
|
|
39
|
+
};
|
|
40
|
+
async run() {
|
|
41
|
+
const { flags } = await this.parse(DevopsPipelineStageUpdate);
|
|
42
|
+
const org = flags['target-org'];
|
|
43
|
+
const connection = org.getConnection(flags['api-version']);
|
|
44
|
+
const stageId = flags['stage-id'];
|
|
45
|
+
const name = flags['name'];
|
|
46
|
+
validateSalesforceId(stageId, 'stage');
|
|
47
|
+
try {
|
|
48
|
+
await connection.sobject('DevopsPipelineStage').update({ Id: stageId, Name: name });
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
52
|
+
if (errMsg.includes('sObject type') && errMsg.includes('is not supported')) {
|
|
53
|
+
this.error(commonErrorMessages.getMessage('error.DevopsCenterNotEnabled'));
|
|
54
|
+
}
|
|
55
|
+
if (errMsg.toLowerCase().includes('not found') || errMsg.includes('entity is deleted')) {
|
|
56
|
+
this.error(messages.getMessage('error.StageNotFound', [stageId]));
|
|
57
|
+
}
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
this.log(`Successfully updated stage "${name}".`);
|
|
61
|
+
this.log(` Stage ID: ${stageId}`);
|
|
62
|
+
this.log(` Name: ${name}`);
|
|
63
|
+
return { success: true, stageId, name };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../../src/commands/devops/pipeline/stage/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,8 @@ export default class DevopsPipelineUpdate extends SfCommand<PipelineUpdateResult
|
|
|
9
9
|
'target-org': import("@oclif/core/interfaces").OptionFlag<Org, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
10
|
'api-version': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
11
|
'pipeline-id': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
-
|
|
12
|
+
activate: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
deactivate: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
14
|
name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
15
|
};
|
|
15
16
|
private static getPipelineState;
|
|
@@ -33,10 +33,15 @@ export default class DevopsPipelineUpdate extends SfCommand {
|
|
|
33
33
|
required: true,
|
|
34
34
|
char: undefined,
|
|
35
35
|
}),
|
|
36
|
-
|
|
37
|
-
summary: messages.getMessage('flags.
|
|
36
|
+
activate: Flags.boolean({
|
|
37
|
+
summary: messages.getMessage('flags.activate.summary'),
|
|
38
38
|
required: false,
|
|
39
|
-
|
|
39
|
+
exclusive: ['deactivate'],
|
|
40
|
+
}),
|
|
41
|
+
deactivate: Flags.boolean({
|
|
42
|
+
summary: messages.getMessage('flags.deactivate.summary'),
|
|
43
|
+
required: false,
|
|
44
|
+
exclusive: ['activate'],
|
|
40
45
|
}),
|
|
41
46
|
name: Flags.string({
|
|
42
47
|
summary: messages.getMessage('flags.name.summary'),
|
|
@@ -58,7 +63,8 @@ export default class DevopsPipelineUpdate extends SfCommand {
|
|
|
58
63
|
const org = flags['target-org'];
|
|
59
64
|
const connection = org.getConnection(flags['api-version']);
|
|
60
65
|
const pipelineId = flags['pipeline-id'];
|
|
61
|
-
|
|
66
|
+
// Derive tri-state: true = activate, false = deactivate, undefined = neither requested.
|
|
67
|
+
const activateFlag = flags.activate ? true : flags.deactivate ? false : undefined;
|
|
62
68
|
const newName = flags.name;
|
|
63
69
|
if (activateFlag === undefined && newName === undefined) {
|
|
64
70
|
this.error(messages.getMessage('error.NoFlags'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/commands/devops/pipeline/update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAc,QAAQ,EAAO,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAwB,MAAM,oCAAoC,CAAC;AAClH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,QAAQ,CAAC,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,kCAAkC,EAAE,wBAAwB,CAAC,CAAC;AACrG,MAAM,mBAAmB,GAAG,QAAQ,CAAC,YAAY,CAAC,kCAAkC,EAAE,cAAc,CAAC,CAAC;AAEtG,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,SAA+B;IACxE,MAAM,CAAU,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,CAAU,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,CAAU,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAE5D,MAAM,CAAU,KAAK,GAAG;QAC7B,YAAY,EAAE,KAAK,CAAC,WAAW,EAAE;QACjC,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE;QACpC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;YAChC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,2BAA2B,CAAC;YACzD,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,SAAS;SAChB,CAAC;QACF,
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/commands/devops/pipeline/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
2
|
+
import { CombineDetails } from '../../utils/promotionUtils.js';
|
|
2
3
|
export type PromoteResult = {
|
|
3
4
|
requestId: string;
|
|
4
5
|
status: string;
|
|
5
6
|
message: string;
|
|
6
7
|
promotedWorkitemIds: string[];
|
|
8
|
+
combineDetails?: CombineDetails | null;
|
|
7
9
|
};
|
|
8
10
|
export default class DevopsPromote extends SfCommand<PromoteResult> {
|
|
9
11
|
static readonly summary: string;
|
|
@@ -18,7 +20,10 @@ export default class DevopsPromote extends SfCommand<PromoteResult> {
|
|
|
18
20
|
'deploy-all': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
19
21
|
'test-level': import("@oclif/core/interfaces").OptionFlag<import("../../common/types.js").TestLevel | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
20
22
|
tests: import("@oclif/core/interfaces").OptionFlag<string[] | undefined>;
|
|
23
|
+
'skip-validation': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
21
24
|
};
|
|
25
|
+
private static assertWorkItemsPromotable;
|
|
22
26
|
private static fetchStageWorkItems;
|
|
23
27
|
run(): Promise<PromoteResult>;
|
|
28
|
+
private runValidation;
|
|
24
29
|
}
|
|
@@ -20,9 +20,12 @@ import { resolveProjectIdFromWorkItem } from '../../utils/prepareWorkItem.js';
|
|
|
20
20
|
import { getPipelineIdForProject } from '../../utils/pipelineUtils.js';
|
|
21
21
|
import { deployAll, testLevel as testLevelFlag, specificTestsNoChar } from '../../common/flags/promote/promoteFlags.js';
|
|
22
22
|
import { validateSalesforceId } from '../../utils/soqlUtils.js';
|
|
23
|
+
import { validatePromotion, formatValidationDetails, } from '../../utils/promotionUtils.js';
|
|
23
24
|
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
24
25
|
const messages = Messages.loadMessages('@salesforce/plugin-devops-center', 'devops.promote');
|
|
25
26
|
const commonErrorMessages = Messages.loadMessages('@salesforce/plugin-devops-center', 'commonErrors');
|
|
27
|
+
const PROMOTABLE_STATUSES = ['READY_TO_PROMOTE', 'PROMOTED'];
|
|
28
|
+
const PROMOTABLE_STATUS_LIST = PROMOTABLE_STATUSES.join("', '");
|
|
26
29
|
export default class DevopsPromote extends SfCommand {
|
|
27
30
|
static summary = messages.getMessage('summary');
|
|
28
31
|
static description = messages.getMessage('description');
|
|
@@ -55,7 +58,21 @@ export default class DevopsPromote extends SfCommand {
|
|
|
55
58
|
'deploy-all': deployAll,
|
|
56
59
|
'test-level': testLevelFlag(),
|
|
57
60
|
tests: specificTestsNoChar,
|
|
61
|
+
'skip-validation': Flags.boolean({
|
|
62
|
+
summary: messages.getMessage('flags.skip-validation.summary'),
|
|
63
|
+
default: false,
|
|
64
|
+
}),
|
|
58
65
|
};
|
|
66
|
+
static async assertWorkItemsPromotable(connection, workItemIds) {
|
|
67
|
+
const idList = workItemIds.map((id) => `'${id}'`).join(', ');
|
|
68
|
+
const result = await connection.query(`SELECT Id, Status FROM WorkItem WHERE Id IN (${idList})`);
|
|
69
|
+
const ineligible = result.records.filter((r) => !PROMOTABLE_STATUSES.includes(r.Status));
|
|
70
|
+
if (ineligible.length > 0) {
|
|
71
|
+
const details = ineligible.map((r) => `${r.Id} (${r.Status})`).join(', ');
|
|
72
|
+
throw new Error(`The following work items are not eligible for promotion: ${details}. Only work items with status READY_TO_PROMOTE or PROMOTED can be promoted.`);
|
|
73
|
+
}
|
|
74
|
+
return result.records.map((r) => r.Id);
|
|
75
|
+
}
|
|
59
76
|
static async fetchStageWorkItems(connection, pipelineId, sourceStageId, targetStageId) {
|
|
60
77
|
// Validate all IDs before using in SOQL
|
|
61
78
|
validateSalesforceId(pipelineId, 'pipeline');
|
|
@@ -70,7 +87,7 @@ export default class DevopsPromote extends SfCommand {
|
|
|
70
87
|
if (nextStageId !== targetStageId) {
|
|
71
88
|
throw new Error(`Stage '${sourceStageId}' does not feed into target stage '${targetStageId}'.`);
|
|
72
89
|
}
|
|
73
|
-
const workItemResult = await connection.query(`SELECT Id FROM WorkItem WHERE DevopsPipelineStageId = '${sourceStageId}' LIMIT 200`);
|
|
90
|
+
const workItemResult = await connection.query(`SELECT Id FROM WorkItem WHERE DevopsPipelineStageId = '${sourceStageId}' AND Status IN ('${PROMOTABLE_STATUS_LIST}') LIMIT 200`);
|
|
74
91
|
return workItemResult.records.map((r) => r.Id);
|
|
75
92
|
}
|
|
76
93
|
async run() {
|
|
@@ -91,7 +108,7 @@ export default class DevopsPromote extends SfCommand {
|
|
|
91
108
|
this.error(`No pipeline found for work item "${workItemIds[0]}". Ensure the project has an associated pipeline.`);
|
|
92
109
|
}
|
|
93
110
|
pipelineId = pid;
|
|
94
|
-
resolvedWorkItemIds = workItemIds;
|
|
111
|
+
resolvedWorkItemIds = await DevopsPromote.assertWorkItemsPromotable(connection, workItemIds);
|
|
95
112
|
}
|
|
96
113
|
else {
|
|
97
114
|
// Stage path: resolve pipelineId from the source stage
|
|
@@ -108,6 +125,9 @@ export default class DevopsPromote extends SfCommand {
|
|
|
108
125
|
this.error(messages.getMessage('error.NoWorkItems'));
|
|
109
126
|
}
|
|
110
127
|
}
|
|
128
|
+
if (!flags['skip-validation']) {
|
|
129
|
+
await this.runValidation(connection, pipelineId, resolvedWorkItemIds, targetStageId, !workItemIds?.length);
|
|
130
|
+
}
|
|
111
131
|
let apiResult;
|
|
112
132
|
try {
|
|
113
133
|
apiResult = await promoteStage({
|
|
@@ -125,7 +145,8 @@ export default class DevopsPromote extends SfCommand {
|
|
|
125
145
|
if (errMsg.includes('sObject type') && errMsg.includes('is not supported')) {
|
|
126
146
|
this.error(commonErrorMessages.getMessage('error.DevopsCenterNotEnabled'));
|
|
127
147
|
}
|
|
128
|
-
const
|
|
148
|
+
const htmlStripped = errMsg.split('<')[0].trim();
|
|
149
|
+
const cleanMsg = htmlStripped.replace(/^[A-Z][A-Z0-9_]+:/, '').trim();
|
|
129
150
|
this.error(messages.getMessage('error.PromoteFailed', [cleanMsg]));
|
|
130
151
|
}
|
|
131
152
|
this.log(`Status: ${apiResult.status}`);
|
|
@@ -144,5 +165,30 @@ export default class DevopsPromote extends SfCommand {
|
|
|
144
165
|
promotedWorkitemIds: apiResult.promotedWorkitemIds,
|
|
145
166
|
};
|
|
146
167
|
}
|
|
168
|
+
async runValidation(connection, pipelineId, workItemIds, targetStageId, allWorkItemsInStage = false) {
|
|
169
|
+
let result;
|
|
170
|
+
try {
|
|
171
|
+
result = await validatePromotion(connection, pipelineId, workItemIds, targetStageId, false, allWorkItemsInStage);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
175
|
+
if (errMsg.includes('sObject type') && errMsg.includes('is not supported')) {
|
|
176
|
+
this.error(commonErrorMessages.getMessage('error.DevopsCenterNotEnabled'));
|
|
177
|
+
}
|
|
178
|
+
const htmlStripped = errMsg.split('<')[0].trim();
|
|
179
|
+
const cleanMsg = htmlStripped.replace(/^[A-Z][A-Z0-9_]+:/, '').trim();
|
|
180
|
+
this.error(messages.getMessage('error.ValidationRequestFailed', [cleanMsg]));
|
|
181
|
+
}
|
|
182
|
+
if (!result.success) {
|
|
183
|
+
if (result.combineDetails) {
|
|
184
|
+
this.log(messages.getMessage('error.ValidationFailedCombineRequired'));
|
|
185
|
+
this.log(JSON.stringify(result.combineDetails, null, 2));
|
|
186
|
+
}
|
|
187
|
+
this.error(messages.getMessage('error.ValidationFailed', [
|
|
188
|
+
result.errorType ?? '',
|
|
189
|
+
formatValidationDetails(result.errorDetails),
|
|
190
|
+
]));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
147
193
|
}
|
|
148
194
|
//# sourceMappingURL=promote.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../../src/commands/devops/promote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAc,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAsB,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACxH,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../../src/commands/devops/promote.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
2
|
-
import { DeployStageResult } from '../../../utils/
|
|
2
|
+
import { DeployStageResult } from '../../../utils/promotionUtils.js';
|
|
3
3
|
export type PromotionCompleteResult = DeployStageResult & {
|
|
4
4
|
undeployedWorkitemIds: string[];
|
|
5
5
|
};
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { Messages } from '@salesforce/core';
|
|
17
17
|
import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
|
|
18
|
-
import { getUndeployedWorkItems, validateDeploy, executeDeploy, } from '../../../utils/
|
|
18
|
+
import { getUndeployedWorkItems, validateDeploy, executeDeploy, } from '../../../utils/promotionUtils.js';
|
|
19
19
|
import { deployAll, testLevel, specificTestsNoChar } from '../../../common/flags/promote/promoteFlags.js';
|
|
20
20
|
import { validateSalesforceId } from '../../../utils/soqlUtils.js';
|
|
21
21
|
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"complete.js","sourceRoot":"","sources":["../../../../src/commands/devops/promotion/complete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,aAAa,GAEd,MAAM
|
|
1
|
+
{"version":3,"file":"complete.js","sourceRoot":"","sources":["../../../../src/commands/devops/promotion/complete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
2
|
+
import { CombineDetails } from '../../../utils/promotionUtils.js';
|
|
3
|
+
export type PromotionValidateResult = {
|
|
4
|
+
success: boolean;
|
|
5
|
+
errorType: string | null;
|
|
6
|
+
errorDetails: string | null;
|
|
7
|
+
combineDetails: CombineDetails | null;
|
|
8
|
+
suggestions: string[];
|
|
9
|
+
};
|
|
10
|
+
export default class DevopsPromotionValidate extends SfCommand<PromotionValidateResult> {
|
|
11
|
+
static readonly summary: string;
|
|
12
|
+
static readonly description: string;
|
|
13
|
+
static readonly examples: string[];
|
|
14
|
+
static readonly flags: {
|
|
15
|
+
'target-org': import("@oclif/core/interfaces").OptionFlag<import("@salesforce/core").Org, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
'api-version': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
+
'target-stage-id': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
18
|
+
'work-item-id': import("@oclif/core/interfaces").OptionFlag<string[], import("@oclif/core/interfaces").CustomOptions>;
|
|
19
|
+
};
|
|
20
|
+
run(): Promise<PromotionValidateResult>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026, Salesforce, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { Messages } from '@salesforce/core';
|
|
17
|
+
import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
|
|
18
|
+
import { validatePromotion, formatValidationDetails, hasSharedComponents, } from '../../../utils/promotionUtils.js';
|
|
19
|
+
import { validateSalesforceId } from '../../../utils/soqlUtils.js';
|
|
20
|
+
import { resolveProjectIdFromWorkItem } from '../../../utils/prepareWorkItem.js';
|
|
21
|
+
import { getPipelineIdForProject } from '../../../utils/pipelineUtils.js';
|
|
22
|
+
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
23
|
+
const messages = Messages.loadMessages('@salesforce/plugin-devops-center', 'devops.promotion.validate');
|
|
24
|
+
const commonErrorMessages = Messages.loadMessages('@salesforce/plugin-devops-center', 'commonErrors');
|
|
25
|
+
export default class DevopsPromotionValidate extends SfCommand {
|
|
26
|
+
static summary = messages.getMessage('summary');
|
|
27
|
+
static description = messages.getMessage('description');
|
|
28
|
+
static examples = messages.getMessages('examples');
|
|
29
|
+
static flags = {
|
|
30
|
+
'target-org': Flags.requiredOrg(),
|
|
31
|
+
'api-version': Flags.orgApiVersion(),
|
|
32
|
+
'target-stage-id': Flags.salesforceId({
|
|
33
|
+
char: 't',
|
|
34
|
+
summary: messages.getMessage('flags.target-stage-id.summary'),
|
|
35
|
+
required: true,
|
|
36
|
+
startsWith: '1QV',
|
|
37
|
+
}),
|
|
38
|
+
'work-item-id': Flags.salesforceId({
|
|
39
|
+
char: 'i',
|
|
40
|
+
summary: messages.getMessage('flags.work-item-id.summary'),
|
|
41
|
+
required: true,
|
|
42
|
+
multiple: true,
|
|
43
|
+
startsWith: '1fk',
|
|
44
|
+
}),
|
|
45
|
+
};
|
|
46
|
+
async run() {
|
|
47
|
+
const { flags } = await this.parse(DevopsPromotionValidate);
|
|
48
|
+
const connection = flags['target-org'].getConnection(flags['api-version']);
|
|
49
|
+
const targetStageId = flags['target-stage-id'];
|
|
50
|
+
const workItemIds = flags['work-item-id'];
|
|
51
|
+
validateSalesforceId(targetStageId, 'target stage');
|
|
52
|
+
for (const id of workItemIds) {
|
|
53
|
+
validateSalesforceId(id, 'work item');
|
|
54
|
+
}
|
|
55
|
+
let pipelineId;
|
|
56
|
+
try {
|
|
57
|
+
const { projectId } = await resolveProjectIdFromWorkItem(connection, workItemIds[0]);
|
|
58
|
+
const pid = await getPipelineIdForProject(connection, projectId);
|
|
59
|
+
if (!pid) {
|
|
60
|
+
this.error(messages.getMessage('error.NoPipeline', [workItemIds[0]]));
|
|
61
|
+
}
|
|
62
|
+
pipelineId = pid;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
66
|
+
if (errMsg.includes('sObject type') && errMsg.includes('is not supported')) {
|
|
67
|
+
this.error(commonErrorMessages.getMessage('error.DevopsCenterNotEnabled'));
|
|
68
|
+
}
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
let result;
|
|
72
|
+
try {
|
|
73
|
+
result = await validatePromotion(connection, pipelineId, workItemIds, targetStageId, true);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
77
|
+
if (errMsg.includes('sObject type') && errMsg.includes('is not supported')) {
|
|
78
|
+
this.error(commonErrorMessages.getMessage('error.DevopsCenterNotEnabled'));
|
|
79
|
+
}
|
|
80
|
+
const cleanMsg = errMsg.split('<')[0].trim();
|
|
81
|
+
this.error(messages.getMessage('error.ValidationRequestFailed', [cleanMsg]));
|
|
82
|
+
}
|
|
83
|
+
if (!result.success) {
|
|
84
|
+
this.error(messages.getMessage('error.ValidationFailed', [
|
|
85
|
+
result.errorType ?? '',
|
|
86
|
+
formatValidationDetails(result.errorDetails),
|
|
87
|
+
]));
|
|
88
|
+
}
|
|
89
|
+
this.log(`Success: ${result.success}`);
|
|
90
|
+
if (result.combineDetails) {
|
|
91
|
+
this.log('Combine Details:');
|
|
92
|
+
this.log(JSON.stringify(result.combineDetails, null, 2));
|
|
93
|
+
}
|
|
94
|
+
// Validation succeeded, which means a pull request already exists for each work item, so they
|
|
95
|
+
// can be promoted directly. When the work items also share components, the user has two choices:
|
|
96
|
+
// 1. combine them and promote the combined parent as a single unit, or
|
|
97
|
+
// 2. promote them as they are, without combining.
|
|
98
|
+
const suggestions = [];
|
|
99
|
+
if (hasSharedComponents(result.combineDetails)) {
|
|
100
|
+
suggestions.push(messages.getMessage('suggestion.SharedComponents'));
|
|
101
|
+
// Option 1 — combine + promote. combineDetails carries the parent/child IDs to combine.
|
|
102
|
+
const parentId = result.combineDetails?.parentWorkitemId;
|
|
103
|
+
const childIds = result.combineDetails?.childWorkitemsId ?? [];
|
|
104
|
+
if (parentId && childIds.length > 0) {
|
|
105
|
+
const combineArgs = [
|
|
106
|
+
`--parent-work-item-id ${parentId}`,
|
|
107
|
+
...childIds.map((id) => `--child-work-item-id ${id}`),
|
|
108
|
+
`--target-stage-id ${targetStageId}`,
|
|
109
|
+
].join(' ');
|
|
110
|
+
suggestions.push(messages.getMessage('suggestion.CombineOption'));
|
|
111
|
+
suggestions.push(messages.getMessage('suggestion.CombineStepPrepare', [`sf devops work-item combine ${combineArgs}`]));
|
|
112
|
+
// Combine merges the children into the parent, so only the parent is promoted.
|
|
113
|
+
suggestions.push(messages.getMessage('suggestion.CombineStepPromote', [
|
|
114
|
+
`sf devops promote --work-item-id ${parentId} --target-stage-id ${targetStageId}`,
|
|
115
|
+
]));
|
|
116
|
+
}
|
|
117
|
+
// Option 2 — promote the work items as-is. Their PRs already exist (validation passed).
|
|
118
|
+
const promoteArgs = [
|
|
119
|
+
...workItemIds.map((id) => `--work-item-id ${id}`),
|
|
120
|
+
`--target-stage-id ${targetStageId}`,
|
|
121
|
+
].join(' ');
|
|
122
|
+
suggestions.push(messages.getMessage('suggestion.PromoteOption'));
|
|
123
|
+
suggestions.push(messages.getMessage('suggestion.PromoteStep', [`sf devops promote ${promoteArgs}`]));
|
|
124
|
+
this.log('');
|
|
125
|
+
this.log('Suggestions:');
|
|
126
|
+
suggestions.forEach((s) => this.log(` ${s}`));
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
success: result.success,
|
|
130
|
+
errorType: result.errorType,
|
|
131
|
+
errorDetails: result.errorDetails,
|
|
132
|
+
combineDetails: result.combineDetails,
|
|
133
|
+
suggestions,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../../src/commands/devops/promotion/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Org } from '@salesforce/core';
|
|
2
|
+
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
3
|
+
import { DeleteStageBranchResult } from '../../../../utils/deleteStageBranch.js';
|
|
4
|
+
export default class DevopsStageBranchDelete extends SfCommand<DeleteStageBranchResult> {
|
|
5
|
+
static readonly summary: string;
|
|
6
|
+
static readonly description: string;
|
|
7
|
+
static readonly examples: string[];
|
|
8
|
+
static readonly flags: {
|
|
9
|
+
'target-org': import("@oclif/core/interfaces").OptionFlag<Org, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
'api-version': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
'pipeline-id': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
'stage-id': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
};
|
|
14
|
+
run(): Promise<DeleteStageBranchResult>;
|
|
15
|
+
}
|