Skip to content

Commit a8f8bac

Browse files
saikrishnavKrishna V
andauthored
Release Comparison Fixes and Xml parsing Fixes (#32)
* Ignore Release compare errors from AzureDevOps API * Fix for line break issues * Fix Line Breaks in Error messages and stack traces * Fix the line breaks * Upgrade versions * Upgrade version Co-authored-by: Krishna V <[email protected]>
1 parent aae1f7c commit a8f8bac

File tree

11 files changed

+46
-43
lines changed

11 files changed

+46
-43
lines changed

Tasks/emailReportTask/htmlreport/HTMLReportCreator.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { IHTMLReportCreator } from './IHTMLReportCreator';
33
import { Report } from '../model/Report';
44
import { ReportConfiguration } from '../config/ReportConfiguration';
55
const fs = require("fs");
6-
const js2xmlparser = require("js2xmlparser");
6+
const o2x = require('object-to-xml');
77
const xsltProcessor = require("xslt-processor");
88
const { xmlParse, xsltProcess } = xsltProcessor;
99

@@ -17,17 +17,18 @@ export class HTMLReportCreator implements IHTMLReportCreator {
1717

1818
// Create a view model object before serialize to xml
1919
const reportViewModel = new EmailReportViewModel(report, reportConfiguration);
20-
2120
// Serialize gathered data into xml
22-
const xmlString: string = js2xmlparser.parse("EmailReportViewModel", reportViewModel);
21+
const xmlString: string = "<EmailReportViewModel>" + o2x(reportViewModel) + "</EmailReportViewModel>";
2322
// Read XSLT email template
2423
const buffer = fs.readFileSync(xsltTemplatePath);
2524
// Parse the xml string as XmlDocument/Node
2625
const xmlDoc = xmlParse(xmlString, "text/xml");
2726
// Parse XSLT as XMLDocument
2827
const xsltDoc = xmlParse(buffer.toString(), "application/xml");
2928
// Fill the XSLT document template with the xml doc data
30-
const outXmlString = xsltProcess(xmlDoc, xsltDoc);
29+
let outXmlString = xsltProcess(xmlDoc, xsltDoc);
30+
// XML parsing changes <br/> to special chars if they are part of xml nodevalues. Do string replace to fix the jankiness for HTML.
31+
outXmlString = outXmlString.split("&lt;br/&gt;").join("<br/>");
3132
return outXmlString;
3233
}
3334
}

Tasks/emailReportTask/model/viewmodel/TestResultViewModel.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ export class TestResultViewModel {
3535
const result = testResultModel.testResult;
3636
this.Id = result.id;
3737
this.TestCaseTitle = result.testCaseTitle;
38-
this.ErrorMessage = StringUtils.ReplaceNewlineWithBrTag(result.errorMessage);
38+
this.ErrorMessage = "<![CDATA[" + StringUtils.ReplaceNewlineWithBrTag(result.errorMessage) + "]]>";
3939
this.TestOutcome = result.outcome;
40-
this.StackTrace = StringUtils.ReplaceNewlineWithBrTag(
41-
StringUtils.getFirstNLines(result.stackTrace, this.StackTraceLineCount));
40+
this.StackTrace = "<![CDATA[" + StringUtils.ReplaceNewlineWithBrTag(
41+
StringUtils.getFirstNLines(result.stackTrace, this.StackTraceLineCount)) + "]]>";
4242

4343
if (result.priority != 255) {
4444
this.Priority = DisplayNameHelper.getPriorityDisplayName(result.priority == null ? "" : result.priority.toString());

Tasks/emailReportTask/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
"dependencies": {
1010
"azure-devops-node-api": "^10.0.0",
1111
"azure-pipelines-task-lib": "^2.8.0",
12-
"js2xmlparser": "^4.0.0",
1312
"nodemailer": "^6.3.0",
13+
"object-to-xml": "^2.0.0",
1414
"performance-now": "^2.1.0",
1515
"reflect-metadata": "^0.1.13",
1616
"xslt-processor": "^0.11.5"

Tasks/emailReportTask/providers/pipeline/ReleaseDataProvider.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,12 @@ export class ReleaseDataProvider implements IDataProvider {
4040
// check if last completed one isn't latter one, then changes don't make sense
4141
if (lastCompletedRelease != null && lastCompletedRelease.id < release.id) {
4242
console.log(`Getting changes between releases ${release.id} & ${lastCompletedRelease.id}`);
43-
changes = await RetryablePromise.RetryAsync(async () => this.pipelineRestClient.getPipelineChangesAsync(lastCompletedRelease.id), "GetPipelineChanges");
43+
try {
44+
changes = await RetryablePromise.RetryAsync(async () => this.pipelineRestClient.getPipelineChangesAsync(lastCompletedRelease.id), "GetPipelineChanges");
45+
} catch(err) {
46+
// Changes happened in current release w.r.t previous one isn't strictly required to send mail - ignoring any errors
47+
console.warn(`Error while comparing current release - '${release.id}' with previous one - '${lastCompletedRelease.id}': ${err}`);
48+
}
4449
}
4550
else {
4651
console.log("Unable to find any last completed release");

Tasks/emailReportTask/task.dev.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"version": {
1414
"Major": 1,
1515
"Minor": 2,
16-
"Patch": 202
16+
"Patch": 204
1717
},
1818
"groups": [
1919
{

Tasks/emailReportTask/task.prod.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"version": {
1414
"Major": 1,
1515
"Minor": 1,
16-
"Patch": 5
16+
"Patch": 6
1717
},
1818
"groups": [
1919
{

Tasks/emailReportTask/tests/__e_to_e_tests__/InvokeTest.ts

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,11 @@ import { PipelineType } from "../../config/pipeline/PipelineType";
1313
import { ReportProvider } from "../../providers/ReportProvider";
1414
import { DataProviderFactory } from "../../providers/DataProviderFactory";
1515
import { HTMLReportCreator } from "../../htmlreport/HTMLReportCreator";
16-
import { IHTMLReportCreator } from "../../htmlreport/IHTMLReportCreator";
17-
import { Report } from "../../model/Report";
18-
import { EmailReportViewModel } from "../../model/viewmodel/EmailReportViewModel";
1916
import { isNullOrUndefined } from "util";
2017
import { EmailSender } from "../../EmailSender";
2118
import { TelemetryLogger } from "../../telemetry/TelemetryLogger";
2219

2320
const fs = require("fs");
24-
const js2xmlparser = require("js2xmlparser");
25-
2621
const accessKey = process.env.AccessKey;
2722
const smtpUser = process.env.SMTPUSER;
2823
const smtpPassword = process.env.SMTPPASSWORD;
@@ -44,16 +39,6 @@ export class FileWriter {
4439
}
4540
}
4641

47-
export class ReportCreatorWrapper implements IHTMLReportCreator {
48-
createHtmlReport(report: Report, reportConfiguration: ReportConfiguration): string {
49-
// Serialize gathered data into xml
50-
const xmlString: string = js2xmlparser.parse("EmailReportViewModel", new EmailReportViewModel(report, reportConfiguration));
51-
FileWriter.writeToFile(xmlString, "reportViewModel.xml");
52-
const actualCreator = new HTMLReportCreator();
53-
return actualCreator.createHtmlReport(report, reportConfiguration);
54-
}
55-
}
56-
5742
export class MockConfigProvider implements IConfigurationProvider {
5843

5944
getPipelineConfiguration(): PipelineConfiguration {
@@ -85,7 +70,7 @@ async function run(): Promise<void> {
8570
TelemetryLogger.LogTaskConfig(reportConfiguration);
8671
const reportManager = new ReportManager(
8772
new ReportProvider(new DataProviderFactory(configProvider.getPipelineConfiguration())),
88-
new ReportCreatorWrapper(),
73+
new HTMLReportCreator(),
8974
new EmailSender());
9075

9176
reportManager.sendReportAsync(reportConfiguration);

Tasks/emailReportTask/utils/StringUtils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export class StringUtils {
2626
return null;
2727
}
2828

29-
const lines = this.getNonEmptyLines(content);
29+
const lines = this.getNonEmptyLines(content);
3030
return lines.join("<br/>");
3131
}
3232

Tasks/emailReportTask/vss-extension.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"manifestVersion": 1,
33
"id": "EmailReportExtension",
44
"name": "Email Report Extension",
5-
"version": "1.1.5",
5+
"version": "1.1.6",
66
"publisher": "epsteam",
77
"targets": [
88
{

package-lock.json

Lines changed: 25 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)