UNPKG

@flxbl-io/sfp

Version:

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

250 lines 28.7 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 }; }; Object.defineProperty(exports, "__esModule", { value: true }); const DeployImpl_1 = __importStar(require("../deploy/DeployImpl")); const sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger")); const Stage_1 = require("../Stage"); const SFPStatsSender_1 = __importDefault(require("../../core/stats/SFPStatsSender")); const neverthrow_1 = require("neverthrow"); const PoolJobExecutor_1 = __importDefault(require("../../core/scratchorg/pool/PoolJobExecutor")); const VlocityPackUpdateSettings_1 = __importDefault(require("../../core/vlocitywrapper/VlocityPackUpdateSettings")); const VlocityInitialInstall_1 = __importDefault(require("../../core/vlocitywrapper/VlocityInitialInstall")); const ScriptExecutorHelpers_1 = __importDefault(require("../../core/scriptExecutor/ScriptExecutorHelpers")); const DeploymentSettingsService_1 = __importDefault(require("../../core/deployers/DeploymentSettingsService")); const InstallUnlockedPackageCollection_1 = __importDefault(require("../../core/package/packageInstallers/InstallUnlockedPackageCollection")); const SFPOrg_1 = __importDefault(require("../../core/org/SFPOrg")); const ExternalPackage2DependencyResolver_1 = __importDefault(require("../../core/package/dependencies/ExternalPackage2DependencyResolver")); const ExternalDependencyDisplayer_1 = __importDefault(require("../../core/display/ExternalDependencyDisplayer")); const ProjectConfig_1 = __importDefault(require("../../core/project/ProjectConfig")); const sfp_logger_2 = require("@flxbl-io/sfp-logger"); const fs = require('fs-extra'); const SFPOWERSCRIPTS_ARTIFACT_PACKAGE = '04t1P000000ka9mQAA'; class PrepareOrgJob extends PoolJobExecutor_1.default { constructor(pool, checkPointPackages, externalPackage2s) { super(pool); this.pool = pool; this.checkPointPackages = checkPointPackages; this.externalPackage2s = externalPackage2s; } async executeJob(scratchOrg, hubOrg, logToFilePath, logLevel) { try { let scratchOrgAsSfPOrg = await SFPOrg_1.default.create({ aliasOrUsername: scratchOrg.username }); let individualSODeploymentActivityLogger = new sfp_logger_2.FileLogger(logToFilePath); let packageCollectionInstaller = new InstallUnlockedPackageCollection_1.default(scratchOrgAsSfPOrg, individualSODeploymentActivityLogger); //Relax IP ranges on Scractch Org await this.relaxIPRanges(scratchOrgAsSfPOrg.getConnection(), this.pool.relaxAllIPRanges, this.pool.ipRangesToBeRelaxed, individualSODeploymentActivityLogger); //Install sfp package await this.installsfpArtifactPackage(scratchOrg, individualSODeploymentActivityLogger, packageCollectionInstaller); //Execute pre installs script await this.preInstallScript(scratchOrg, hubOrg, individualSODeploymentActivityLogger); //Install all external dependencies for non release config type if (!this.pool.releaseConfigFile) await this.installAllExternalPackageDependencies(individualSODeploymentActivityLogger, scratchOrgAsSfPOrg, this.externalPackage2s); //Hook Velocity Deployment await this.prepareVlocityDataPacks(scratchOrg, individualSODeploymentActivityLogger, logLevel); //Deploy All Packages let deploymentStatus = await this.deployAllPackages(scratchOrg, hubOrg, individualSODeploymentActivityLogger); //Execute Post Install Script await this.postInstallScript(scratchOrg, hubOrg, individualSODeploymentActivityLogger, deploymentStatus); return (0, neverthrow_1.ok)({ scratchOrgUsername: scratchOrg.username }); } catch (error) { return (0, neverthrow_1.err)({ message: error.message, scratchOrgUsername: scratchOrg.username, }); } } async deployAllPackages(scratchOrg, hubOrg, logger) { let deploymentSucceed; if (this.pool.installAll) { let deploymentResult; let deploymentMode; if (this.pool.enableSourceTracking || this.pool.enableSourceTracking === undefined) { deploymentMode = DeployImpl_1.DeploymentMode.SOURCEPACKAGES_PUSH; } else { deploymentMode = DeployImpl_1.DeploymentMode.SOURCEPACKAGES; } if (this.pool.disableSourcePackageOverride) { deploymentMode = DeployImpl_1.DeploymentMode.NORMAL; } deploymentResult = await this.invokeDeployImpl(scratchOrg, hubOrg, logger, deploymentMode); SFPStatsSender_1.default.logGauge('prepare.packages.scheduled', deploymentResult.scheduled, { poolName: this.pool.tag, }); SFPStatsSender_1.default.logGauge('prepare.packages.succeeded', deploymentResult.deployed.length, { poolName: this.pool.tag, }); SFPStatsSender_1.default.logGauge('prepare.packages.failed', deploymentResult.failed.length, { poolName: this.pool.tag, }); if (deploymentResult.failed.length > 0 || deploymentResult.error) { this.pool.succeedOnDeploymentErrors ? this.handleDeploymentErrorsForPartialDeployment(scratchOrg, deploymentResult, logger) : this.handleDeploymentErrorsForFullDeployment(scratchOrg, deploymentResult, logger); deploymentSucceed = 'failed'; } deploymentSucceed = 'succeed'; } return deploymentSucceed; } async installsfpArtifactPackage(scratchOrg, logger, packageCollectionInstaller) { sfp_logger_1.default.log(`Installing sfpowerscripts_artifact package to the ${scratchOrg.alias}`, null, logger); //Install sfp artifact package await packageCollectionInstaller.install([ { name: 'SFPOWERSCRIPTS_artifact2', subscriberPackageVersionId: process.env.SFPOWERSCRIPTS_ARTIFACT_PACKAGE ? process.env.SFPOWERSCRIPTS_ARTIFACT_PACKAGE : SFPOWERSCRIPTS_ARTIFACT_PACKAGE, }, ], true); sfp_logger_1.default.log(`Suscessfully Installed SFPOWERSCRIPTS_artifact package to the ${scratchOrg.alias}`, null, logger); } async invokeDeployImpl(scratchOrg, hubOrg, logger, deploymentMode) { sfp_logger_1.default.log(`Deploying packages to ${scratchOrg.alias}`); sfp_logger_1.default.log(`Deploying packages to ${scratchOrg.alias}`, sfp_logger_1.LoggerLevel.INFO, logger); let deployProps = { targetUsername: scratchOrg.username, artifactDir: 'artifacts', waitTime: 120, currentStage: Stage_1.Stage.PREPARE, logger: logger, isTestsToBeTriggered: false, skipIfPackageInstalled: true, deploymentMode: deploymentMode, isRetryOnFailure: this.pool.retryOnFailure, devhubUserName: hubOrg.getUsername(), }; //Deploy the fetched artifacts to the org let deployImpl = new DeployImpl_1.default(deployProps); deployImpl.preDeployHook = this; let deploymentResult = await deployImpl.exec(); return deploymentResult; } //Install external dependencies before installing package async preDeployPackage(sfpPackage, targetUsername, deployedPackages, devhubUserName, logger) { //Install dependencies per package if release config is provided if (this.pool.releaseConfigFile) { let sfpOrg = await SFPOrg_1.default.create({ aliasOrUsername: targetUsername }); let hubOrg = await SFPOrg_1.default.create({ aliasOrUsername: devhubUserName }); await this.installExternalPackageDependenciesPerPackage(logger, sfpOrg, hubOrg, this.pool.keys, sfpPackage); } return { isToFailDeployment: false }; } async installAllExternalPackageDependencies(logger, scratchOrgAsSFPOrg, externalPackage2s) { sfp_logger_1.default.log(`Installing all external package dependencies in ${scratchOrgAsSFPOrg.getUsername()}`, sfp_logger_1.LoggerLevel.INFO, logger); let packageCollectionInstaller = new InstallUnlockedPackageCollection_1.default(scratchOrgAsSFPOrg, logger); await packageCollectionInstaller.install(externalPackage2s, true, true); sfp_logger_1.default.log(`Successfully completed installing all external dependencies in ${scratchOrgAsSFPOrg.getUsername()}`, sfp_logger_1.LoggerLevel.INFO, logger); } async installExternalPackageDependenciesPerPackage(logger, scratchOrgAsSFPOrg, hubOrg, keys, sfpPackage) { //Resolve external package dependencies let externalPackageResolver = new ExternalPackage2DependencyResolver_1.default(hubOrg.getConnection(), ProjectConfig_1.default.getSFDXProjectConfig(null), keys); let externalPackage2s = await externalPackageResolver.resolveExternalPackage2DependenciesToVersions([sfpPackage?.packageName]); if (sfpPackage) { sfp_logger_1.default.log(`Installing package dependencies of this ${sfpPackage.packageName} in ${scratchOrgAsSFPOrg.getUsername()}`, sfp_logger_1.LoggerLevel.INFO, logger); //Display resolved dependenencies let externalDependencyDisplayer = new ExternalDependencyDisplayer_1.default(externalPackage2s, logger); externalDependencyDisplayer.display(); } let packageCollectionInstaller = new InstallUnlockedPackageCollection_1.default(scratchOrgAsSFPOrg, logger); await packageCollectionInstaller.install(externalPackage2s, true, true); if (sfpPackage) { sfp_logger_1.default.log(`Successfully completed external dependencies of this ${sfpPackage.packageName} in ${scratchOrgAsSFPOrg.getUsername()}`, sfp_logger_1.LoggerLevel.INFO, logger); } else { sfp_logger_1.default.log(`Successfully completed installing all external dependencies in ${scratchOrgAsSFPOrg.getUsername()}`, sfp_logger_1.LoggerLevel.INFO, logger); } } handleDeploymentErrorsForFullDeployment(scratchOrg, deploymentResult, logger) { //Write to Scratch Org Logs sfp_logger_1.default.log(`Following Packages failed to deploy in ${scratchOrg.alias}`, sfp_logger_1.LoggerLevel.INFO, logger); sfp_logger_1.default.log(JSON.stringify(deploymentResult.failed.map((packageInfo) => packageInfo.sfpPackage.packageName)), sfp_logger_1.LoggerLevel.INFO, logger); sfp_logger_1.default.log(`Deployment of packages failed in ${scratchOrg.alias}, this scratch org will be deleted`, sfp_logger_1.LoggerLevel.INFO, logger); throw new Error('Following Packages failed to deploy:' + deploymentResult.failed.map((packageInfo) => packageInfo.sfpPackage.packageName)); } handleDeploymentErrorsForPartialDeployment(scratchOrg, deploymentResult, logger) { if (this.checkPointPackages.length > 0) { let isCheckPointSucceded = this.checkPointPackages.some((pkg) => deploymentResult.deployed.map((packageInfo) => packageInfo.sfpPackage.packageName).includes(pkg.name)); if (!isCheckPointSucceded) { SFPStatsSender_1.default.logCount('prepare.org.checkpointfailed'); sfp_logger_1.default.log(`One or some of the check point packages failed to deploy, Deleting ${scratchOrg.alias}`, sfp_logger_1.LoggerLevel.INFO, logger); throw new Error(`One or some of the check point Packagesfailed to deploy`); } } else { SFPStatsSender_1.default.logCount('prepare.org.partial'); sfp_logger_1.default.log(`Cancelling any further packages to be deployed, Adding the scratchorg ${scratchOrg.alias} to the pool`, sfp_logger_1.LoggerLevel.INFO, logger); } } async relaxIPRanges(conn, isRelaxAllIPRanges, relaxIPRanges, logger) { if (isRelaxAllIPRanges || relaxIPRanges) { if (isRelaxAllIPRanges) { sfp_logger_1.default.log(`Relaxing all IP ranges for scratchOrg with user ${conn.getUsername()}`, sfp_logger_1.LoggerLevel.INFO); relaxIPRanges = []; return new DeploymentSettingsService_1.default(conn).relaxAllIPRanges(logger); } else { sfp_logger_1.default.log(`Relaxing IP ranges for scratchOrg with user ${conn.getUsername()}`, sfp_logger_1.LoggerLevel.INFO); return new DeploymentSettingsService_1.default(conn).relaxAllIPRanges(logger, relaxIPRanges); } } } //Prepare for vlocity async prepareVlocityDataPacks(scratchOrg, logger, logLevel) { if (this.pool.enableVlocity) { sfp_logger_1.default.log((0, sfp_logger_1.COLOR_KEY_MESSAGE)('Installing Vlocity Configurations..'), sfp_logger_1.LoggerLevel.INFO, logger); let vlocityPackSettingsUpdate = new VlocityPackUpdateSettings_1.default(null, scratchOrg.username, logger, logLevel); await vlocityPackSettingsUpdate.exec(false); let vlocityInitialInstall = new VlocityInitialInstall_1.default(null, scratchOrg.username, logger, logLevel); await vlocityInitialInstall.exec(false); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_KEY_MESSAGE)('Succesfully completed all vlocity config installation'), sfp_logger_1.LoggerLevel.INFO, logger); } } //execute global pre install script async preInstallScript(scratchOrg, hubOrg, logger) { if (fs.existsSync(this.pool.preDependencyInstallationScriptPath)) { sfp_logger_1.default.log(`Executing pre script for ` + scratchOrg.alias + ', script path:' + this.pool.preDependencyInstallationScriptPath, sfp_logger_1.LoggerLevel.INFO); await ScriptExecutorHelpers_1.default.executeScript(logger, this.pool.preDependencyInstallationScriptPath, scratchOrg.username, hubOrg.getUsername()); } } async postInstallScript(scratchOrg, hubOrg, logger, deploymentStatus) { if (fs.existsSync(this.pool.postDeploymentScriptPath)) { sfp_logger_1.default.log(`Executing post script for ` + scratchOrg.alias + ', script path:' + this.pool.postDeploymentScriptPath, sfp_logger_1.LoggerLevel.INFO); await ScriptExecutorHelpers_1.default.executeScript(logger, this.pool.postDeploymentScriptPath, scratchOrg.username, hubOrg.getUsername(), deploymentStatus); } } } exports.default = PrepareOrgJob; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJlcGFyZU9yZ0pvYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbXBsL3ByZXBhcmUvUHJlcGFyZU9yZ0pvYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUVBQWlHO0FBQ2pHLG1FQUF3RztBQUN4RyxvQ0FBaUM7QUFDakMscUZBQTZEO0FBRTdELDJDQUE2QztBQUM3QyxpR0FHb0Q7QUFHcEQsb0hBQTRGO0FBQzVGLDRHQUFvRjtBQUNwRiw0R0FBNkU7QUFDN0UsK0dBQXVGO0FBRXZGLDZJQUFxSDtBQUNySCxtRUFBMkM7QUFHM0MsNElBQW9IO0FBQ3BILGlIQUF5RjtBQUN6RixxRkFBNkQ7QUFDN0QscURBQWtEO0FBQ2xELE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUUvQixNQUFNLCtCQUErQixHQUFHLG9CQUFvQixDQUFDO0FBQzdELE1BQXFCLGFBQWMsU0FBUSx5QkFBZTtJQUN0RCxZQUNjLElBQWdCLEVBQ2xCLGtCQUFvQyxFQUNwQyxpQkFBb0M7UUFFNUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBSkYsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNsQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQWtCO1FBQ3BDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7SUFHaEQsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQ1osVUFBc0IsRUFDdEIsTUFBYyxFQUNkLGFBQXFCLEVBQ3JCLFFBQXFCO1FBRXJCLElBQUksQ0FBQztZQUNELElBQUksa0JBQWtCLEdBQUcsTUFBTSxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLGVBQWUsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN2RixJQUFJLG9DQUFvQyxHQUFHLElBQUksdUJBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN6RSxJQUFJLDBCQUEwQixH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