@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
JavaScript
;
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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