@flxbl-io/sfp
Version:
sfp is a CLI tool to help you manage your Salesforce projects in an artifact centric model
261 lines • 25.4 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 ArtifactGenerator_1 = __importDefault(require("./core/artifacts/generators/ArtifactGenerator"));
const os_1 = require("os");
const SfpCommand_1 = __importDefault(require("./SfpCommand"));
const core_1 = require("@salesforce/core");
const fs = require("fs");
const SFPStatsSender_1 = __importDefault(require("./core/stats/SFPStatsSender"));
const ProjectConfig_1 = __importDefault(require("./core/project/ProjectConfig"));
const sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger"));
const GetFormattedTime_1 = __importDefault(require("./core/utils/GetFormattedTime"));
const core_2 = require("@oclif/core");
const sfdxflags_1 = require("./flags/sfdxflags");
const ReleaseConfigAggregator_1 = require("./impl/release/ReleaseConfigAggregator");
// Initialize Messages with the current plugin directory
core_1.Messages.importMessagesDirectory(__dirname);
// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core,
// or any library that is using the messages framework can also be loaded this way.
const messages = core_1.Messages.loadMessages('@flxbl-io/sfp', 'build');
class BuildBase extends SfpCommand_1.default {
constructor() {
super(...arguments);
this.releaseConfigMap = {};
}
async execute() {
const { flags } = await this.parse();
let buildExecResult;
let totalElapsedTime;
let artifactCreationErrors = [];
let tags = {
is_diffcheck_enabled: String(flags.diffcheck),
stage: this.getStage(),
branch: flags.branch,
};
try {
const artifactDirectory = flags.artifactdir;
const diffcheck = flags.diffcheck;
const branch = flags.branch;
const buildOnlyPackages = flags.buildOnly;
// Read Manifest
let projectConfig = ProjectConfig_1.default.getSFDXProjectConfig(process.cwd());
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`command: ${(0, sfp_logger_1.COLOR_KEY_MESSAGE)(this.getStage())}`));
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Build Packages Only Changed: ${flags.diffcheck}`));
if (projectConfig?.plugins?.sfp?.scratchOrgDefFilePaths?.enableMultiDefinitionFiles) {
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Multiple Config Files Mode: enabled`));
}
else {
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Config File Path: ${flags.configfilepath}`));
}
if (flags.releaseconfig?.length > 0) {
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Release Config Files: ${flags.releaseconfig}`));
}
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Artifact Directory: ${flags.artifactdir}`));
sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, sfp_logger_1.LoggerLevel.INFO);
let executionStartTime = Date.now();
if (!(flags.tag == null || flags.tag == undefined)) {
tags['tag'] = flags.tag;
}
SFPStatsSender_1.default.logCount('build.scheduled', tags);
let buildProps = this.getBuildProps();
//Filter Build Props by ReleaseConfig
if (buildOnlyPackages?.length > 0) {
buildProps = this.includeOnlyPackagesAsProvided(buildOnlyPackages, buildProps, new sfp_logger_1.ConsoleLogger());
}
else {
buildProps = this.includeOnlyPackagesAsPerReleaseConfig(flags.releaseconfig, buildProps, new sfp_logger_1.ConsoleLogger());
}
buildExecResult = await this.getBuildImplementer(buildProps).exec();
if (diffcheck &&
buildExecResult.generatedPackages.length === 0 &&
buildExecResult.failedPackages.length === 0) {
sfp_logger_1.default.log(`${os_1.EOL}${os_1.EOL}`);
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_INFO)('No packages found to be built.. Exiting.. '));
sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, sfp_logger_1.LoggerLevel.INFO);
return;
}
sfp_logger_1.default.log(`${os_1.EOL}${os_1.EOL}`);
sfp_logger_1.default.log('Generating Artifacts and Tags....');
for (let generatedPackage of buildExecResult.generatedPackages) {
try {
await ArtifactGenerator_1.default.generateArtifact(generatedPackage, process.cwd(), artifactDirectory);
}
catch (error) {
sfp_logger_1.default.log(error.message);
artifactCreationErrors.push(generatedPackage.packageName);
}
}
totalElapsedTime = Date.now() - executionStartTime;
if (artifactCreationErrors.length > 0 || buildExecResult.failedPackages.length > 0)
throw new Error('Build Failed');
SFPStatsSender_1.default.logGauge('build.duration', Date.now() - executionStartTime, tags);
SFPStatsSender_1.default.logCount('build.succeeded', tags);
}
catch (error) {
SFPStatsSender_1.default.logCount('build.failed', tags);
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_ERROR)(error));
process.exitCode = 1;
}
finally {
if (buildExecResult?.generatedPackages?.length > 0 || buildExecResult?.failedPackages?.length > 0) {
sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, sfp_logger_1.LoggerLevel.INFO);
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_SUCCESS)(`${buildExecResult.generatedPackages.length} artifacts created in ${(0, sfp_logger_1.COLOR_TIME)((0, GetFormattedTime_1.default)(totalElapsedTime))} minutes with ${(0, sfp_logger_1.COLOR_ERROR)(buildExecResult.failedPackages.length)} errors`));
if (buildExecResult.failedPackages.length > 0)
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_ERROR)(`Packages Failed To Build`, buildExecResult.failedPackages));
if (artifactCreationErrors.length > 0)
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_ERROR)(`Failed To Create Artifacts`, artifactCreationErrors));
sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, sfp_logger_1.LoggerLevel.INFO);
const buildResult = {
packages: [],
summary: {
scheduled_packages: null,
elapsed_time: null,
succeeded: null,
failed: null,
sucessfullReleaseConfigs: [],
failedReleaseConfigs: []
},
};
for (let generatedPackage of buildExecResult.generatedPackages) {
buildResult.packages.push({
name: generatedPackage.packageName,
version: generatedPackage.package_version_number,
elapsed_time: generatedPackage.creation_details?.creation_time,
versionId: generatedPackage.package_version_id,
status: 'succeeded',
});
}
for (let failedPackage of buildExecResult.failedPackages) {
buildResult.packages.push({
name: failedPackage,
version: null,
elapsed_time: null,
status: 'failed',
});
}
//try to understad which release configs was successfull
buildResult.summary.sucessfullReleaseConfigs = [];
for (const releaseConfig in this.releaseConfigMap) {
let packages = this.releaseConfigMap[releaseConfig];
let failedPackages = packages.filter((x) => buildExecResult.failedPackages.includes(x));
if (failedPackages.length === 0) {
buildResult.summary.sucessfullReleaseConfigs.push(releaseConfig);
}
else {
buildResult.summary.failedReleaseConfigs.push(releaseConfig);
}
}
buildResult.summary.scheduled_packages =
buildExecResult.generatedPackages.length + buildExecResult.failedPackages.length;
buildResult.summary.elapsed_time = totalElapsedTime;
buildResult.summary.succeeded = buildExecResult.generatedPackages.length;
buildResult.summary.failed = buildExecResult.failedPackages.length;
fs.writeFileSync(`buildResult.json`, JSON.stringify(buildResult, null, 4));
}
}
}
includeOnlyPackagesAsProvided(buildOnlyPackages, buildProps, logger) {
buildProps.includeOnlyPackages = buildOnlyPackages;
printIncludeOnlyPackages(buildProps.includeOnlyPackages);
return buildProps;
function printIncludeOnlyPackages(includeOnlyPackages) {
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_KEY_MESSAGE)(`Build will include the below packages as per the given release configs domain(s)`), sfp_logger_1.LoggerLevel.INFO);
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_KEY_VALUE)(`${includeOnlyPackages.toString()}`), sfp_logger_1.LoggerLevel.INFO);
}
}
includeOnlyPackagesAsPerReleaseConfig(releaseConfigFilePaths, buildProps, logger) {
if (releaseConfigFilePaths?.length > 0) {
buildProps.includeOnlyPackages = [];
let releaseConfigAggregatedLoader = new ReleaseConfigAggregator_1.ReleaseConfigAggregator(logger);
releaseConfigAggregatedLoader.addReleaseConfigs(releaseConfigFilePaths);
buildProps.includeOnlyPackages = releaseConfigAggregatedLoader.getAllPackages();
printIncludeOnlyPackages(buildProps.includeOnlyPackages);
}
return buildProps;
function printIncludeOnlyPackages(includeOnlyPackages) {
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_KEY_MESSAGE)(`Build will include the below packages as per the given release configs(domain(s))`), sfp_logger_1.LoggerLevel.INFO);
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_KEY_VALUE)(`${includeOnlyPackages.toString()}`), sfp_logger_1.LoggerLevel.INFO);
}
}
}
BuildBase.requiresUsername = false;
BuildBase.requiresDevhubUsername = false;
BuildBase.requiresProject = true;
BuildBase.flags = {
loglevel: sfdxflags_1.loglevel,
apiversion: sfdxflags_1.orgApiVersionFlagSfdxStyle,
devhubalias: sfdxflags_1.targetdevhubusername,
diffcheck: core_2.Flags.boolean({
description: messages.getMessage('diffCheckFlagDescription'),
default: false,
}),
buildOnly: (0, sfdxflags_1.arrayFlagSfdxStyle)({
char: 'p',
description: messages.getMessage('buildOnlyFlagDescription'),
}),
repourl: core_2.Flags.string({
char: 'r',
description: messages.getMessage('repoUrlFlagDescription'),
}),
configfilepath: core_2.Flags.file({
char: 'f',
description: messages.getMessage('configFilePathFlagDescription'),
default: 'config/project-scratch-def.json',
}),
artifactdir: core_2.Flags.directory({
description: messages.getMessage('artifactDirectoryFlagDescription'),
default: 'artifacts',
}),
waittime: core_2.Flags.integer({
description: messages.getMessage('waitTimeFlagDescription'),
default: 120,
}),
buildnumber: core_2.Flags.integer({
description: messages.getMessage('buildNumberFlagDescription'),
default: 1,
}),
executorcount: core_2.Flags.integer({
description: messages.getMessage('executorCountFlagDescription'),
default: 5,
}),
branch: core_2.Flags.string({
description: messages.getMessage('branchFlagDescription'),
default: 'main',
required: true,
}),
tag: core_2.Flags.string({
description: messages.getMessage('tagFlagDescription'),
}),
releaseconfig: (0, sfdxflags_1.arrayFlagSfdxStyle)({
aliases: ['domain'],
description: messages.getMessage('releaseConfigFileFlagDescription'),
}),
};
exports.default = BuildBase;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnVpbGRCYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0J1aWxkQmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0dBQThFO0FBRTlFLDJCQUF5QjtBQUN6Qiw4REFBc0M7QUFDdEMsMkNBQTRDO0FBQzVDLHlCQUEwQjtBQUMxQixpRkFBeUQ7QUFFekQsaUZBQXlEO0FBRXpELG1FQVc4QjtBQUM5QixxRkFBNkQ7QUFHN0Qsc0NBQW9DO0FBQ3BDLGlEQUFtSDtBQUNuSCxvRkFBaUY7QUFFakYsd0RBQXdEO0FBQ3hELGVBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUU1QyxpR0FBaUc7QUFDakcsbUZBQW1GO0FBQ25GLE1BQU0sUUFBUSxHQUFHLGVBQVEsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRWpFLE1BQThCLFNBQVUsU0FBUSxvQkFBVTtJQUExRDs7UUFJYyxxQkFBZ0IsR0FBZ0MsRUFBRSxDQUFDO0lBOFFqRSxDQUFDO0lBek5VLEtBQUssQ0FBQyxPQUFPO1FBQ2hCLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQyxJQUFJLGVBR0gsQ0FBQztRQUNGLElBQUksZ0JBQXdCLENBQUM7UUFDN0IsSUFBSSxzQkFBc0IsR0FBYSxFQUFFLENBQUM7UUFFMUMsSUFBSSxJQUFJLEdBQUc7WUFDUCxvQkFBb0IsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUM3QyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUN0QixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07U0FDdkIsQ0FBQztRQUVGLElBQUksQ0FBQztZQUNELE1BQU0saUJBQWlCLEdBQVcsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUNwRCxNQUFNLFNBQVMsR0FBWSxLQUFL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