sfdx-hardis 6.8.1 → 6.9.1-alpha202510252146.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/defaults/ci/.github/workflows/check-deploy.yml +2 -2
  3. package/defaults/ci/.github/workflows/process-deploy.yml +2 -2
  4. package/defaults/ci/azure-pipelines-checks.yml +1 -1
  5. package/defaults/ci/azure-pipelines-deployment.yml +1 -1
  6. package/defaults/monitoring/.github/workflows/org-monitoring.yml +6 -7
  7. package/lib/commands/hardis/misc/servicenow-report.d.ts +1 -0
  8. package/lib/commands/hardis/misc/servicenow-report.js +40 -2
  9. package/lib/commands/hardis/misc/servicenow-report.js.map +1 -1
  10. package/lib/commands/hardis/org/test/apex.js +3 -3
  11. package/lib/commands/hardis/org/test/apex.js.map +1 -1
  12. package/lib/commands/hardis/project/deploy/notify.js +2 -2
  13. package/lib/commands/hardis/project/deploy/notify.js.map +1 -1
  14. package/lib/commands/hardis/project/deploy/quick.js +2 -1
  15. package/lib/commands/hardis/project/deploy/quick.js.map +1 -1
  16. package/lib/commands/hardis/project/deploy/start.js +2 -1
  17. package/lib/commands/hardis/project/deploy/start.js.map +1 -1
  18. package/lib/commands/hardis/project/deploy/validate.js +2 -1
  19. package/lib/commands/hardis/project/deploy/validate.js.map +1 -1
  20. package/lib/commands/hardis/source/deploy.js +2 -1
  21. package/lib/commands/hardis/source/deploy.js.map +1 -1
  22. package/lib/common/gitProvider/azureDevops.d.ts +1 -0
  23. package/lib/common/gitProvider/azureDevops.js +68 -1
  24. package/lib/common/gitProvider/azureDevops.js.map +1 -1
  25. package/lib/common/gitProvider/bitbucket.d.ts +1 -0
  26. package/lib/common/gitProvider/bitbucket.js +78 -0
  27. package/lib/common/gitProvider/bitbucket.js.map +1 -1
  28. package/lib/common/gitProvider/gitProviderRoot.d.ts +1 -0
  29. package/lib/common/gitProvider/gitProviderRoot.js +6 -0
  30. package/lib/common/gitProvider/gitProviderRoot.js.map +1 -1
  31. package/lib/common/gitProvider/github.d.ts +1 -0
  32. package/lib/common/gitProvider/github.js +71 -0
  33. package/lib/common/gitProvider/github.js.map +1 -1
  34. package/lib/common/gitProvider/gitlab.d.ts +3 -0
  35. package/lib/common/gitProvider/gitlab.js +107 -0
  36. package/lib/common/gitProvider/gitlab.js.map +1 -1
  37. package/lib/common/gitProvider/index.js +49 -37
  38. package/lib/common/gitProvider/index.js.map +1 -1
  39. package/lib/common/notifProvider/teamsProvider.d.ts +7 -0
  40. package/lib/common/notifProvider/teamsProvider.js +146 -6
  41. package/lib/common/notifProvider/teamsProvider.js.map +1 -1
  42. package/lib/common/utils/dataUtils.d.ts +1 -1
  43. package/lib/common/utils/dataUtils.js +1 -0
  44. package/lib/common/utils/dataUtils.js.map +1 -1
  45. package/lib/common/utils/deployTips.js +2 -1
  46. package/lib/common/utils/deployTips.js.map +1 -1
  47. package/lib/common/utils/deployUtils.d.ts +0 -7
  48. package/lib/common/utils/deployUtils.js +11 -65
  49. package/lib/common/utils/deployUtils.js.map +1 -1
  50. package/lib/common/utils/gitUtils.d.ts +2 -0
  51. package/lib/common/utils/gitUtils.js +7 -1
  52. package/lib/common/utils/gitUtils.js.map +1 -1
  53. package/lib/common/utils/prePostCommandUtils.d.ts +25 -0
  54. package/lib/common/utils/prePostCommandUtils.js +331 -0
  55. package/lib/common/utils/prePostCommandUtils.js.map +1 -0
  56. package/oclif.lock +938 -918
  57. package/oclif.manifest.json +676 -676
  58. package/package.json +4 -4
@@ -0,0 +1,331 @@
1
+ import { SfError } from '@salesforce/core';
2
+ import c from 'chalk';
3
+ import fs from 'fs-extra';
4
+ import yaml from 'js-yaml';
5
+ import * as path from 'path';
6
+ import { getConfig } from '../../config/index.js';
7
+ import { execCommand, uxLog } from './index.js';
8
+ import { GitProvider } from '../gitProvider/index.js';
9
+ import { checkSfdxHardisTraceAvailable, listMajorOrgs } from './orgConfigUtils.js';
10
+ import { soqlQuery } from './apiUtils.js';
11
+ import { findDataWorkspaceByName, importData } from './dataUtils.js';
12
+ import { setPullRequestData } from './gitUtils.js';
13
+ export async function executePrePostCommands(property, options) {
14
+ const branchConfig = await getConfig('branch');
15
+ const commands = [...(branchConfig[property] || []), ...(options.extraCommands || [])];
16
+ await completeWithCommandsFromPullRequests(property, commands);
17
+ if (commands.length === 0) {
18
+ uxLog("log", this, c.grey(`No ${property} found to run`));
19
+ return;
20
+ }
21
+ const actionLabel = property === 'commandsPreDeploy' ? 'Pre-deployment actions' : 'Post-deployment actions';
22
+ uxLog("action", this, c.cyan(`[DeploymentActions] Found ${commands.length} ${actionLabel} to run`));
23
+ for (const cmd of commands) {
24
+ // If if skipIfError is true and deployment failed
25
+ if (options.success === false && cmd.skipIfError === true) {
26
+ uxLog("warning", this, c.yellow(`[DeploymentActions] Skipping skipIfError=true action [${cmd.id}]: ${cmd.label}`));
27
+ cmd.result = {
28
+ statusCode: "skipped",
29
+ skippedReason: "skipIfError is true and deployment failed"
30
+ };
31
+ continue;
32
+ }
33
+ // Skip if we are in another context than the requested one
34
+ const cmdContext = cmd.context || "all";
35
+ if (cmdContext === "check-deployment-only" && options.checkOnly === false) {
36
+ uxLog("log", this, c.grey(`[DeploymentActions] Skipping check-deployment-only action as we are in process deployment mode [${cmd.id}]: ${cmd.label}`));
37
+ cmd.result = {
38
+ statusCode: "skipped",
39
+ skippedReason: "Action context is check-deployment-only but we are in process deployment mode"
40
+ };
41
+ continue;
42
+ }
43
+ if (cmdContext === "process-deployment-only" && options.checkOnly === true) {
44
+ uxLog("log", this, c.grey(`[DeploymentActions] Skipping process-deployment-only action as we are in check deployment mode [${cmd.id}]: ${cmd.label}`));
45
+ cmd.result = {
46
+ statusCode: "skipped",
47
+ skippedReason: "Action context is process-deployment-only but we are in check deployment mode"
48
+ };
49
+ continue;
50
+ }
51
+ const runOnlyOnceByOrg = cmd.runOnlyOnceByOrg || false;
52
+ if (runOnlyOnceByOrg) {
53
+ await checkSfdxHardisTraceAvailable(options.conn);
54
+ const commandTraceQuery = `SELECT Id,CreatedDate FROM SfdxHardisTrace__c WHERE Type__c='${property}' AND Key__c='${cmd.id}' LIMIT 1`;
55
+ const commandTraceRes = await soqlQuery(commandTraceQuery, options.conn);
56
+ if (commandTraceRes?.records?.length > 0) {
57
+ uxLog("log", this, c.grey(`[DeploymentActions] Skipping action [${cmd.id}]: ${cmd.label} because it has been defined with runOnlyOnceByOrg and has already been run on ${commandTraceRes.records[0].CreatedDate}`));
58
+ cmd.result = {
59
+ statusCode: "skipped",
60
+ skippedReason: "runOnlyOnceByOrg is true and command has already been run on this org"
61
+ };
62
+ continue;
63
+ }
64
+ }
65
+ // Run command
66
+ uxLog("action", this, c.cyan(`[DeploymentActions] Running action [${cmd.id}]: ${cmd.label}`));
67
+ await executeAction(cmd);
68
+ if (cmd.result?.statusCode === "success" && runOnlyOnceByOrg) {
69
+ const hardisTraceRecord = {
70
+ Name: property + "--" + cmd.id,
71
+ Type__c: property,
72
+ Key__c: cmd.id
73
+ };
74
+ const insertRes = await options.conn.insert("SfdxHardisTrace__c", [hardisTraceRecord]);
75
+ if (insertRes[0].success) {
76
+ uxLog("success", this, c.green(`[DeploymentActions] Stored SfdxHardisTrace__c entry ${insertRes[0].id} with command [${cmd.id}] so it is not run again in the future (runOnlyOnceByOrg: true)`));
77
+ }
78
+ else {
79
+ uxLog("error", this, c.red(`[DeploymentActions] Error storing SfdxHardisTrace__c entry :` + JSON.stringify(insertRes, null, 2)));
80
+ }
81
+ }
82
+ else if (cmd.result?.statusCode === "failed" && cmd.allowFailure !== true) {
83
+ uxLog("error", this, c.red(`[DeploymentActions] Action [${cmd.id}] failed, stopping execution of further actions.`));
84
+ break;
85
+ }
86
+ }
87
+ manageResultMarkdownBody(property, commands);
88
+ // Check commands results
89
+ const failedCommands = commands.filter(c => c.result?.statusCode === "failed");
90
+ if (failedCommands.length > 0) {
91
+ uxLog("error", this, c.red(`[DeploymentActions] ${failedCommands.length} action(s) failed during ${actionLabel}:`));
92
+ // throw error if failed and allowFailure is not set
93
+ const failedAndNotAllowFailure = failedCommands.filter(c => c.allowFailure !== true);
94
+ if (failedAndNotAllowFailure.length > 0) {
95
+ await GitProvider.managePostPullRequestComment();
96
+ throw new SfError(`One or more ${actionLabel} have failed. See logs for more details.`);
97
+ }
98
+ }
99
+ }
100
+ async function completeWithCommandsFromPullRequests(property, commands) {
101
+ const pullRequests = await listAllPullRequestsToUse();
102
+ for (const pr of pullRequests) {
103
+ // Check if there is a .sfdx-hardis.PULL_REQUEST_ID.yml file in the PR
104
+ const prConfigFileName = path.join("scripts", "actions", `.sfdx-hardis.${pr.idStr}.yml`);
105
+ if (fs.existsSync(prConfigFileName)) {
106
+ try {
107
+ const prConfig = await fs.readFile(prConfigFileName, 'utf8');
108
+ const prConfigParsed = yaml.load(prConfig);
109
+ if (prConfigParsed && prConfigParsed[property] && Array.isArray(prConfigParsed[property])) {
110
+ const prConfigCommands = prConfigParsed[property];
111
+ for (const cmd of prConfigCommands) {
112
+ cmd.pullRequest = pr;
113
+ commands.push(cmd);
114
+ }
115
+ }
116
+ }
117
+ catch (e) {
118
+ uxLog("error", this, c.red(`Error while parsing ${prConfigFileName} file: ${e.message}`));
119
+ }
120
+ }
121
+ }
122
+ }
123
+ let _cachedPullRequests = null;
124
+ async function listAllPullRequestsToUse() {
125
+ if (_cachedPullRequests) {
126
+ return _cachedPullRequests;
127
+ }
128
+ const gitProvider = await GitProvider.getInstance();
129
+ if (!gitProvider) {
130
+ uxLog("warning", this, c.yellow('No git provider configured, skipping retrieval of commands from pull requests'));
131
+ return [];
132
+ }
133
+ const pullRequestInfo = await gitProvider.getPullRequestInfo();
134
+ if (!pullRequestInfo) {
135
+ uxLog("warning", this, c.yellow('No pull request info available, skipping retrieval of commands from pull requests'));
136
+ return [];
137
+ }
138
+ const majorOrgs = await listMajorOrgs();
139
+ const childBranchesNames = recursiveGetChildBranches(pullRequestInfo.targetBranch, majorOrgs);
140
+ const pullRequests = await gitProvider.listPullRequestsInBranchSinceLastMerge(pullRequestInfo.sourceBranch, pullRequestInfo.targetBranch, [...childBranchesNames]);
141
+ _cachedPullRequests = pullRequests;
142
+ return pullRequests;
143
+ }
144
+ function recursiveGetChildBranches(branchName, majorOrgs, collected = new Set()) {
145
+ const directChildren = majorOrgs
146
+ .filter((o) => o.mergeTargets.includes(branchName))
147
+ .map((o) => o.branchName);
148
+ for (const child of directChildren) {
149
+ if (!collected.has(child)) {
150
+ collected.add(child);
151
+ recursiveGetChildBranches(child, majorOrgs, collected);
152
+ }
153
+ }
154
+ return collected;
155
+ }
156
+ async function executeAction(cmd) {
157
+ switch (cmd.type) {
158
+ case 'command':
159
+ await executeActionCommand(cmd);
160
+ break;
161
+ case 'apex':
162
+ await executeActionApex(cmd);
163
+ break;
164
+ case 'data':
165
+ await executeActionData(cmd);
166
+ break;
167
+ case 'publish-community':
168
+ await executeActionPublishCommunity(cmd);
169
+ break;
170
+ default:
171
+ uxLog("error", this, c.yellow(`[DeploymentActions] Action type [${cmd.type}] is not yet implemented for action [${cmd.id}]: ${cmd.label}`));
172
+ cmd.result = {
173
+ statusCode: "failed",
174
+ skippedReason: `Action type [${cmd.type}] is not implemented`
175
+ };
176
+ break;
177
+ }
178
+ }
179
+ async function executeActionCommand(cmd) {
180
+ const commandRes = await execCommand(cmd.command, this, { fail: false, output: true });
181
+ if (commandRes.status === 0) {
182
+ uxLog("success", this, c.green(`[DeploymentActions] Action [${cmd.id}] executed successfully`));
183
+ cmd.result = {
184
+ statusCode: "success",
185
+ output: (commandRes.stdout || "") + "\n" + (commandRes.stderr || "")
186
+ };
187
+ }
188
+ else {
189
+ uxLog("error", this, c.red(`[DeploymentActions] Action [${cmd.id}] failed with status code ${commandRes.status}`));
190
+ cmd.result = {
191
+ statusCode: "failed",
192
+ output: (commandRes.stdout || "") + "\n" + (commandRes.stderr || "")
193
+ };
194
+ }
195
+ }
196
+ async function executeActionApex(cmd) {
197
+ const apexScript = cmd.parameters?.get('apexScript') || '';
198
+ if (!apexScript) {
199
+ uxLog("error", this, c.red(`[DeploymentActions] No apexScript parameter provided for action [${cmd.id}]: ${cmd.label}`));
200
+ cmd.result = {
201
+ statusCode: "failed",
202
+ skippedReason: "No apexScript parameter provided"
203
+ };
204
+ return;
205
+ }
206
+ if (!fs.existsSync(apexScript)) {
207
+ uxLog("error", this, c.red(`[DeploymentActions] Apex script file ${apexScript} does not exist for action [${cmd.id}]: ${cmd.label}`));
208
+ cmd.result = {
209
+ statusCode: "failed",
210
+ skippedReason: `Apex script file ${apexScript} does not exist`
211
+ };
212
+ return;
213
+ }
214
+ const apexCommand = `sf apex run --file ${apexScript}`;
215
+ const commandRes = await execCommand(apexCommand, this, { fail: false, output: true });
216
+ if (commandRes.status === 0) {
217
+ uxLog("success", this, c.green(`[DeploymentActions] Apex action [${cmd.id}] executed successfully`));
218
+ cmd.result = {
219
+ statusCode: "success",
220
+ output: (commandRes.stdout || "") + "\n" + (commandRes.stderr || "")
221
+ };
222
+ }
223
+ else {
224
+ uxLog("error", this, c.red(`[DeploymentActions] Apex action [${cmd.id}] failed with status code ${commandRes.status}`));
225
+ cmd.result = {
226
+ statusCode: "failed",
227
+ output: (commandRes.stdout || "") + "\n" + (commandRes.stderr || "")
228
+ };
229
+ }
230
+ }
231
+ async function executeActionData(cmd) {
232
+ const sfdmuProject = cmd.parameters?.get('sfdmuProject') || '';
233
+ if (!sfdmuProject) {
234
+ uxLog("error", this, c.red(`[DeploymentActions] No sfdmuProject parameter provided for action [${cmd.id}]: ${cmd.label}`));
235
+ cmd.result = {
236
+ statusCode: "failed",
237
+ skippedReason: "No sfdmuProject parameter provided"
238
+ };
239
+ return;
240
+ }
241
+ const sfdmuPath = await findDataWorkspaceByName(sfdmuProject);
242
+ if (!sfdmuPath) {
243
+ uxLog("error", this, c.red(`[DeploymentActions] sfdmu project ${sfdmuProject} not found for action [${cmd.id}]: ${cmd.label}`));
244
+ cmd.result = {
245
+ statusCode: "failed",
246
+ skippedReason: `sfdmu project ${sfdmuProject} not found`
247
+ };
248
+ return;
249
+ }
250
+ let res;
251
+ try {
252
+ res = await importData(sfdmuPath, this);
253
+ }
254
+ catch (e) {
255
+ uxLog("error", this, c.red(`[DeploymentActions] Data import action [${cmd.id}] failed: ${e.message}`));
256
+ cmd.result = {
257
+ statusCode: "failed",
258
+ output: e.message
259
+ };
260
+ return;
261
+ }
262
+ uxLog("success", this, c.green(`[DeploymentActions] Data import action [${cmd.id}] executed successfully`));
263
+ cmd.result = {
264
+ statusCode: "success",
265
+ output: (res.stdout || "") + "\n" + (res.stderr || "")
266
+ };
267
+ }
268
+ async function executeActionPublishCommunity(cmd) {
269
+ const communityName = cmd.parameters?.get('communityName') || '';
270
+ if (!communityName) {
271
+ uxLog("error", this, c.red(`[DeploymentActions] No communityName parameter provided for action [${cmd.id}]: ${cmd.label}`));
272
+ cmd.result = {
273
+ statusCode: "failed",
274
+ skippedReason: "No communityName parameter provided"
275
+ };
276
+ return;
277
+ }
278
+ const publishCommand = `sf community publish --name "${communityName}"`;
279
+ const commandRes = await execCommand(publishCommand, this, { fail: false, output: true });
280
+ if (commandRes.status === 0) {
281
+ uxLog("success", this, c.green(`[DeploymentActions] Publish community action [${cmd.id}] executed successfully`));
282
+ cmd.result = {
283
+ statusCode: "success",
284
+ output: (commandRes.stdout || "") + "\n" + (commandRes.stderr || "")
285
+ };
286
+ }
287
+ else {
288
+ uxLog("error", this, c.red(`[DeploymentActions] Publish community action [${cmd.id}] failed with status code ${commandRes.status}`));
289
+ cmd.result = {
290
+ statusCode: "failed",
291
+ output: (commandRes.stdout || "") + "\n" + (commandRes.stderr || "")
292
+ };
293
+ }
294
+ }
295
+ function manageResultMarkdownBody(property, commands) {
296
+ let markdownBody = `### ${property === 'commandsPreDeploy' ? 'Pre-deployment Actions' : 'Post-deployment Actions'} Results\n\n`;
297
+ // Build markdown table
298
+ markdownBody += `| ID | Label | Type | Status | Details |\n`;
299
+ markdownBody += `|----|-------|------|--------|---------|\n`;
300
+ for (const cmd of commands) {
301
+ const statusIcon = cmd.result?.statusCode === "success" ? '✅' :
302
+ cmd.result?.statusCode === "failed" ? '❌' :
303
+ cmd.result?.statusCode === "skipped" ? '⚪' : '❓';
304
+ const detailsLink = cmd.result?.output ? `[View Details](#command-${cmd.id})` : 'N/A';
305
+ markdownBody += `| ${cmd.id} | ${cmd.label} | ${cmd.type} | ${statusIcon} ${cmd.result?.statusCode || 'not run'} | ${detailsLink} |\n`;
306
+ }
307
+ // Add details in html <detail> blocks, embedded in a root <details> block to avoid markdown rendering issues
308
+ markdownBody += `\n<details>\n<summary>Expand to see details for each action</summary>\n\n`;
309
+ for (const cmd of commands) {
310
+ if (cmd.result?.output) {
311
+ // Truncate output if too long
312
+ const maxOutputLength = 10000;
313
+ let outputForMarkdown = cmd.result.output;
314
+ if (outputForMarkdown.length > maxOutputLength) {
315
+ outputForMarkdown = outputForMarkdown.substring(0, maxOutputLength) + `\n\n... Output truncated to ${maxOutputLength} characters ...`;
316
+ }
317
+ markdownBody += `\n<details id="command-${cmd.id}">\n<summary>Details for command ${cmd.id} - ${cmd.label}</summary>\n\n`;
318
+ markdownBody += '```\n';
319
+ markdownBody += outputForMarkdown;
320
+ markdownBody += '\n```\n';
321
+ markdownBody += '</details>\n';
322
+ }
323
+ }
324
+ markdownBody += `\n</details>\n`;
325
+ const propertyFormatted = property === 'commandsPreDeploy' ? 'preDeployCommandsResultMarkdownBody' : 'postDeployCommandsResultMarkdownBody';
326
+ const prData = {
327
+ [propertyFormatted]: markdownBody
328
+ };
329
+ setPullRequestData(prData);
330
+ }
331
+ //# sourceMappingURL=prePostCommandUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prePostCommandUtils.js","sourceRoot":"","sources":["../../../src/common/utils/prePostCommandUtils.ts"],"names":[],"mappings":"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"}