Skip to content
This repository was archived by the owner on Mar 18, 2024. It is now read-only.

Commit 302f5a1

Browse files
fix(releaseconfig): do not use git ref to get release config packages in validate
validate shouldn't require the use of release defn generated from git, as validate could introduce new packages which are not committed to the current release when done locally or the tag for it is yet to exit, so it should do a simple filter based on the predicates provided.This will fix the issue as mentioned in 1259 fixes #1259
1 parent d8e6f57 commit 302f5a1

File tree

3 files changed

+102
-19
lines changed

3 files changed

+102
-19
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import * as fs from 'fs-extra';
2+
import ProjectConfig from '@dxatscale/sfpowerscripts.core/lib/project/ProjectConfig';
3+
import Ajv, { _ } from 'ajv';
4+
import ReleaseDefinitionGeneratorConfigSchema from './ReleaseDefinitionGeneratorConfigSchema';
5+
import lodash = require('lodash');
6+
import yaml from 'js-yaml';
7+
import { Logger } from '@dxatscale/sfp-logger';
8+
const path = require('path');
9+
10+
export default class ReleaseConfig {
11+
private _releaseDefinitionGeneratorSchema: ReleaseDefinitionGeneratorConfigSchema;
12+
13+
get releaseDefinitionGeneratorConfigSchema() {
14+
// Return clone of releaseDefinition for immutability
15+
return lodash.cloneDeep(this._releaseDefinitionGeneratorSchema);
16+
}
17+
18+
public constructor(private logger: Logger, pathToReleaseDefinition: string) {
19+
this._releaseDefinitionGeneratorSchema = yaml.load(fs.readFileSync(pathToReleaseDefinition, 'utf8'));
20+
this.validateReleaseDefinitionGeneratorConfig(this._releaseDefinitionGeneratorSchema);
21+
22+
// Easy to handle here than with schema
23+
if (
24+
this._releaseDefinitionGeneratorSchema.includeOnlyArtifacts &&
25+
this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts
26+
) {
27+
throw new Error('Error: Invalid schema: either use includeArtifacts or excludeArtifacts');
28+
}
29+
// Easy to handle here than with schema
30+
if (
31+
this._releaseDefinitionGeneratorSchema.includeOnlyPackageDependencies &&
32+
this.releaseDefinitionGeneratorConfigSchema.excludePackageDependencies
33+
) {
34+
throw new Error(
35+
'Error: Invalid schema: either use includePackageDependencies or excludePackageDependencies'
36+
);
37+
}
38+
39+
// Workaround for jsonschema not supporting validation based on dependency value
40+
if (
41+
this._releaseDefinitionGeneratorSchema.releasedefinitionProperties?.baselineOrg &&
42+
!this._releaseDefinitionGeneratorSchema.releasedefinitionProperties?.skipIfAlreadyInstalled
43+
)
44+
throw new Error("Release option 'skipIfAlreadyInstalled' must be true for 'baselineOrg'");
45+
}
46+
47+
public getPackagesAsPerReleaseConfig(directory?: string): string[] {
48+
let packages: string[] = [];
49+
let projectConfig = ProjectConfig.getSFDXProjectConfig(directory);
50+
//Read sfdx project json
51+
let sfdxPackages = ProjectConfig.getAllPackagesFromProjectConfig(projectConfig);
52+
for (const sfdxPackage of sfdxPackages) {
53+
if (this.getArtifactPredicate(sfdxPackage)) {
54+
packages.push(sfdxPackage);
55+
}
56+
}
57+
58+
return packages;
59+
}
60+
61+
private validateReleaseDefinitionGeneratorConfig(
62+
releaseDefinitionGeneratorSchema: ReleaseDefinitionGeneratorConfigSchema
63+
): void {
64+
let schema = fs.readJSONSync(
65+
path.join(__dirname, '..', '..', '..', 'resources', 'schemas', 'releasedefinitiongenerator.schema.json'),
66+
{ encoding: 'UTF-8' }
67+
);
68+
69+
let validator = new Ajv({ allErrors: true }).compile(schema);
70+
let validationResult = validator(releaseDefinitionGeneratorSchema);
71+
72+
if (!validationResult) {
73+
let errorMsg: string =
74+
`Release definition generation config does not meet schema requirements, ` +
75+
`found ${validator.errors.length} validation errors:\n`;
76+
77+
validator.errors.forEach((error, errorNum) => {
78+
errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify(
79+
error.params,
80+
null,
81+
4
82+
)}`;
83+
});
84+
85+
throw new Error(errorMsg);
86+
}
87+
}
88+
89+
private getArtifactPredicate(artifact: string): boolean {
90+
if (this.releaseDefinitionGeneratorConfigSchema.includeOnlyArtifacts) {
91+
return this.releaseDefinitionGeneratorConfigSchema.includeOnlyArtifacts?.includes(artifact);
92+
} else if (this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts) {
93+
return !this.releaseDefinitionGeneratorConfigSchema.excludeArtifacts?.includes(artifact);
94+
} else return true;
95+
}
96+
}

packages/sfpowerscripts-cli/src/impl/release/ReleaseDefinitionGenerator.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,6 @@ export default class ReleaseDefinitionGenerator {
143143
LoggerLevel.WARN,
144144
this.logger
145145
);
146-
continue;
147146
}
148147
}
149148

packages/sfpowerscripts-cli/src/impl/validate/ValidateImpl.ts

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,8 @@ import ExternalPackage2DependencyResolver from '@dxatscale/sfpowerscripts.core/l
4747
import ExternalDependencyDisplayer from '@dxatscale/sfpowerscripts.core/lib/display/ExternalDependencyDisplayer';
4848
import { PreDeployHook } from '../deploy/PreDeployHook';
4949
import GroupConsoleLogs from '../../ui/GroupConsoleLogs';
50-
import ReleaseDefinitionGenerator from '../release/ReleaseDefinitionGenerator';
51-
import ReleaseDefinitionSchema from '../release/ReleaseDefinitionSchema';
5250
import { COLON_MIDDLE_BORDER_TABLE } from '../../ui/TableConstants';
51+
import ReleaseConfig from '../release/ReleaseConfig';
5352
const Table = require('cli-table');
5453

5554
export enum ValidateAgainst {
@@ -423,7 +422,7 @@ export default class ValidateImpl implements PostDeployHook, PreDeployHook {
423422
buildProps.diffOptions = diffOptions;
424423

425424
//Compute packages to be included
426-
buildProps.includeOnlyPackages = await computePackagesIfReleaseDefnIsProvided(this.props);
425+
buildProps.includeOnlyPackages = fetchPackagesAsPerReleaseConfig(this.logger,this.props);
427426
if (buildProps.includeOnlyPackages) {
428427
printIncludeOnlyPackages(buildProps.includeOnlyPackages);
429428
}
@@ -455,25 +454,14 @@ export default class ValidateImpl implements PostDeployHook, PreDeployHook {
455454

456455
return generatedPackages;
457456

458-
async function computePackagesIfReleaseDefnIsProvided(props: ValidateProps) {
457+
function fetchPackagesAsPerReleaseConfig(logger:Logger,props: ValidateProps) {
459458
if (
460459
props.validationMode == ValidationMode.FASTFEEDBACK_LIMITED_BY_RELEASE_CONFIG ||
461460
props.validationMode == ValidationMode.THOROUGH_LIMITED_BY_RELEASE_CONFIG
462461
) {
463-
//Generate release definition
464-
let releaseDefinitionGenerator: ReleaseDefinitionGenerator = new ReleaseDefinitionGenerator(
465-
new ConsoleLogger(),
466-
'HEAD',
467-
props.releaseConfigPath,
468-
'validate',
469-
'test',
470-
undefined,
471-
true,
472-
false,
473-
true
474-
);
475-
let releaseDefinition = (await releaseDefinitionGenerator.exec()) as ReleaseDefinitionSchema;
476-
return Object.keys(releaseDefinition.artifacts);
462+
463+
let releaseConfig:ReleaseConfig = new ReleaseConfig(logger, props.releaseConfigPath);
464+
return releaseConfig.getPackagesAsPerReleaseConfig();
477465
}
478466
}
479467

0 commit comments

Comments
 (0)