UNPKG

@flxbl-io/sfp

Version:

sfp is a CLI tool to help you manage your Salesforce projects in an artifact centric model

249 lines 24.3 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var _a; Object.defineProperty(exports, "__esModule", { value: true }); const SfpCommand_1 = __importDefault(require("../SfpCommand")); const core_1 = require("@salesforce/core"); const SFPStatsSender_1 = __importDefault(require("../core/stats/SFPStatsSender")); const ReleaseImpl_1 = __importDefault(require("../impl/release/ReleaseImpl")); const ReleaseDefinitionLoader_1 = __importDefault(require("../impl/release/ReleaseDefinitionLoader")); const ReleaseError_1 = __importDefault(require("../errors/ReleaseError")); const path = require("path"); const sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger")); const sfdxflags_1 = require("../flags/sfdxflags"); const core_2 = require("@oclif/core"); core_1.Messages.importMessagesDirectory(__dirname); const messages = core_1.Messages.loadMessages('@flxbl-io/sfp', 'release'); class Release extends SfpCommand_1.default { async execute() { this.validateFlags(); let tags = { targetOrg: this.flags.targetorg, }; if (this.flags.tag != null) { tags['tag'] = this.flags.tag; } let executionStartTime = Date.now(); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`command: ${(0, sfp_logger_1.COLOR_KEY_MESSAGE)(`release`)}`)); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Target Org: ${this.flags.targetorg}`)); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Release Definitions: ${this.flags.releasedefinition}`)); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Artifact Directory: ${path.resolve('artifacts')}`)); sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, core_1.LoggerLevel.INFO); let releaseDefinitions = []; for (const pathToReleaseDefintion of this.flags.releasedefinition) { let releaseDefinition = await ReleaseDefinitionLoader_1.default.loadReleaseDefinition(pathToReleaseDefintion); //Support Legacy by taking the existing single workItemFilter and pushing it to the new model if (releaseDefinition.changelog?.workItemFilter) { releaseDefinition.changelog.workItemFilters = new Array(); releaseDefinition.changelog.workItemFilters.push(releaseDefinition.changelog?.workItemFilter); } if (this.flags.isGenerateChangelog && !releaseDefinition.changelog) throw new Error('changelog parameters must be specified in release definition to generate changelog'); if (releaseDefinition.promotePackagesBeforeDeploymentToOrg && this.flags.targetorg == releaseDefinition.promotePackagesBeforeDeploymentToOrg && !this.flags.devhubalias) throw new Error('DevHub is mandatory when promote is used within release definition'); releaseDefinitions.push(releaseDefinition); } let releaseResult; try { let props = { releaseDefinitions: releaseDefinitions, targetOrg: this.flags.targetorg, fetchArtifactScript: this.flags.scriptpath, isNpm: this.flags.npm, scope: this.flags.scope, npmrcPath: this.flags.npmrcpath, logsGroupSymbol: this.flags.logsgroupsymbol, tags: tags, isDryRun: this.flags.dryrun, waitTime: this.flags.waittime, keys: this.flags.keys, isGenerateChangelog: this.flags.generatechangelog, devhubUserName: this.flags.devhubalias, branch: this.flags.branchname, directory: this.flags.directory, }; let releaseImpl = new ReleaseImpl_1.default(props, new sfp_logger_1.ConsoleLogger()); releaseResult = await releaseImpl.exec(); if (!this.flags.dryrun) SFPStatsSender_1.default.logCount('release.succeeded', tags); } catch (err) { if (err instanceof ReleaseError_1.default) { releaseResult = err.data; } else sfp_logger_1.default.log(err.message); if (!this.flags.dryrun) SFPStatsSender_1.default.logCount('release.failed', tags); // Fail the task when an error occurs process.exitCode = 1; } finally { let totalElapsedTime = Date.now() - executionStartTime; if (releaseResult) { this.printReleaseSummary(releaseResult, totalElapsedTime); this.sendMetrics(releaseResult, tags, totalElapsedTime); } } } sendMetrics(releaseResult, tags, totalElapsedTime) { if (!this.flags.dryrun) { SFPStatsSender_1.default.logCount('release.scheduled', tags); SFPStatsSender_1.default.logGauge('release.duration', totalElapsedTime, tags); let packagesScheduled = 0; let packagesSucceeded = 0; let packagesFailed = 0; for (const deploymentResults of releaseResult.succeededDeployments) { packagesScheduled += deploymentResults.result.scheduled; packagesSucceeded += deploymentResults.result.deployed.length; } for (const deploymentResults of releaseResult.failedDeployments) { packagesScheduled += deploymentResults.result.scheduled; packagesSucceeded += deploymentResults.result.deployed.length; packagesFailed += deploymentResults.result.failed.length; } SFPStatsSender_1.default.logGauge('release.packages.scheduled', packagesScheduled, tags); SFPStatsSender_1.default.logGauge('release.packages.succeeded', packagesSucceeded, tags); SFPStatsSender_1.default.logGauge('release.packages.failed', packagesFailed, tags); } } printReleaseSummary(releaseResult, totalElapsedTime) { if (this.flags.logsgroupsymbol?.[0]) sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(this.flags.logsgroupsymbol[0], 'Release Summary')); sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, core_1.LoggerLevel.INFO); if (releaseResult.installDependenciesResult) { sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`\nPackage Dependencies`)); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_SUCCESS)(` ${releaseResult.installDependenciesResult.success.length} succeeded`)); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_WARNING)(` ${releaseResult.installDependenciesResult.skipped.length} skipped`)); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_ERROR)(` ${releaseResult.installDependenciesResult.failed.length} failed`)); } for (const succeededDeployment of releaseResult.succeededDeployments) { sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`\n Release Definition: ${succeededDeployment.releaseDefinition.release} for Release Config: ${succeededDeployment.releaseDefinition.releaseConfigName ? succeededDeployment.releaseDefinition.releaseConfigName : 'N/A'}`)); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_SUCCESS)(` ${succeededDeployment.result.deployed.length} succeeded`)); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_ERROR)(` ${succeededDeployment.result.failed.length} failed`)); } for (const failedDeployment of releaseResult.failedDeployments) { sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`\n Release Definition: ${failedDeployment.releaseDefinition.release} for for Release Config: ${failedDeployment.releaseDefinition.releaseConfigName ? failedDeployment.releaseDefinition.releaseConfigName : 'N/A'}`)); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_SUCCESS)(` ${failedDeployment.result.deployed.length} succeeded`)); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_ERROR)(`\nPackages Failed to Deploy`, failedDeployment.result.failed.map((packageInfo) => packageInfo.sfpPackage.packageName))); } sfp_logger_1.default.log((0, sfp_logger_1.COLOR_TIME)(`\nElapsed Time: ${new Date(totalElapsedTime).toISOString().substring(11, 19)}`)); sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, core_1.LoggerLevel.INFO); } validateFlags() { if (this.flags.npm && !this.flags.scope) throw new Error('--scope parameter is required for NPM'); } } _a = Release; Release.description = messages.getMessage('commandDescription'); Release.aliases = ['orchestrator:release']; Release.examples = [ `sfp release -p path/to/releasedefinition.yml -u myorg --npm --scope myscope --generatechangelog`, ]; Release.requiresUsername = false; Release.requiresDevhubUsername = false; Release.requiresProject = false; Release.flags = { releasedefinition: (0, sfdxflags_1.arrayFlagSfdxStyle)({ char: 'p', description: messages.getMessage('releaseDefinitionFlagDescription'), required: true, }), targetorg: sfdxflags_1.requiredUserNameFlag, scriptpath: core_2.Flags.file({ char: 'f', description: messages.getMessage('scriptPathFlagDescription'), }), npm: core_2.Flags.boolean({ description: messages.getMessage('npmFlagDescription'), exclusive: ['scriptpath'], }), scope: core_2.Flags.string({ description: messages.getMessage('scopeFlagDescription'), dependsOn: ['npm'], parse: async (scope) => scope.replace(/@/g, '').toLowerCase(), }), npmrcpath: core_2.Flags.file({ description: messages.getMessage('npmrcPathFlagDescription'), dependsOn: ['npm'], required: false, }), logsgroupsymbol: sfdxflags_1.logsgroupsymbol, tag: core_2.Flags.string({ char: 't', description: messages.getMessage('tagFlagDescription'), }), dryrun: core_2.Flags.boolean({ description: messages.getMessage('dryRunFlagDescription'), default: false, hidden: true, }), waittime: core_2.Flags.integer({ description: messages.getMessage('waitTimeFlagDescription'), default: 120, }), keys: core_2.Flags.string({ required: false, description: messages.getMessage('keysFlagDescription'), }), generatechangelog: core_2.Flags.boolean({ default: false, description: messages.getMessage('generateChangelogFlagDescription'), }), directory: core_2.Flags.string({ char: 'd', description: messages.getMessage('directoryFlagDescription'), }), branchname: core_2.Flags.string({ dependsOn: ['generatechangelog'], char: 'b', description: messages.getMessage('branchNameFlagDescription'), }), allowunpromotedpackages: core_2.Flags.boolean({ description: messages.getMessage('allowUnpromotedPackagesFlagDescription'), hidden: true, deprecated: { message: '--allowunpromotedpackages is deprecated, All packages are allowed', }, }), changelogByDomains: core_2.Flags.boolean({ description: messages.getMessage('changelogByDomainsFlagDescription'), hidden: true, }), devhubalias: sfdxflags_1.optionalDevHubFlag, loglevel: sfdxflags_1.loglevel, }; exports.default = Release; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsZWFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9yZWxlYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0RBQXVDO0FBQ3ZDLDJDQUF5RDtBQUN6RCxrRkFBMEQ7QUFDMUQsOEVBQXVGO0FBQ3ZGLHNHQUE4RTtBQUM5RSwwRUFBa0Q7QUFDbEQsNkJBQThCO0FBQzlCLG1FQVE4QjtBQUU5QixrREFNNEI7QUFDNUIsc0NBQW9DO0FBRXBDLGVBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM1QyxNQUFNLFFBQVEsR0FBRyxlQUFRLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUVuRSxNQUFxQixPQUFRLFNBQVEsb0JBQVU7SUFtRnBDLEtBQUssQ0FBQyxPQUFPO1FBQ2hCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVyQixJQUFJLElBQUksR0FBRztZQUNQLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVM7U0FDbEMsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ2pDLENBQUM7UUFFRCxJQUFJLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVwQyxvQkFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFBLHlCQUFZLEVBQUMsWUFBWSxJQUFBLDhCQUFpQixFQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLG9CQUFTLENBQUMsR0FBRyxDQUFDLElBQUEseUJBQVksRUFBQyxlQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FB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