Skip to content

Commit b64299d

Browse files
authored
Changes for Telemetry (#19774)
1 parent 0e190cd commit b64299d

22 files changed

+199
-31
lines changed

Tasks/AzureTestPlanV0/automatedTestInvoker.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import * as tl from 'azure-pipelines-task-lib/task'
22
import { executePythonTests } from './Invokers/pythoninvoker'
33
import { executeMavenTests } from './Invokers/maveninvoker'
44
import { executeGradleTests } from './Invokers/gradleinvoker'
5+
import { ciDictionary } from './ciEventLogger';
56

6-
export async function testInvoker(testsToBeExecuted: string[]): Promise<number> {
7+
export async function testInvoker(testsToBeExecuted: string[], ciData: ciDictionary): Promise<number> {
78

89
const testLanguageStrings = tl.getDelimitedInput('testLanguageInput', ',', true);
910

@@ -21,20 +22,24 @@ export async function testInvoker(testsToBeExecuted: string[]): Promise<number>
2122
case 'Java-Maven':
2223
exitCode = await executeMavenTests(testsToBeExecuted);
2324
tl.debug(`Execution Status Code for Maven: ${exitCode}`);
25+
ciData["isJavaMavenExecution"] = true;
2426
break;
2527

2628
case 'Java-Gradle':
2729
exitCode = await executeGradleTests(testsToBeExecuted);
2830
tl.debug(`Execution Status Code for Gradle: ${exitCode}`);
31+
ciData["isJavaGradleExecution"] = true;
2932
break;
3033

3134
case 'Python':
3235
exitCode = await executePythonTests(testsToBeExecuted);
3336
tl.debug(`Execution Status Code for Python: ${exitCode}`);
37+
ciData["isPythonExecution"] = true;
3438
break;
3539

3640
default:
3741
console.log('Invalid test Language Input selected.');
42+
ciData["NoLanguageInput"] = true;
3843
}
3944

4045
exitStatusCode = exitStatusCode || exitCode;

Tasks/AzureTestPlanV0/automatedTests.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@ import tl = require('azure-pipelines-task-lib/task');
22
import { testInvoker } from './automatedTestInvoker';
33
import { TestPlanData } from './testPlanData';
44
import { publishAutomatedTestResult } from './publishAutomatedTests';
5+
import { ciDictionary } from './ciEventLogger';
56

6-
export async function automatedTestsFlow(testPlanInfo: TestPlanData, testSelectorInput: string): Promise<number> {
7+
export async function automatedTestsFlow(testPlanInfo: TestPlanData, testSelectorInput: string, ciData: ciDictionary): Promise<number> {
78
let listOfTestsToBeExecuted: string[] = testPlanInfo.listOfFQNOfTestCases;
89
let testInvokerStatusCode = 0;
910

1011
if (listOfTestsToBeExecuted !== null && listOfTestsToBeExecuted !== undefined && listOfTestsToBeExecuted.length > 0) {
1112
tl.debug('Invoking test execution for tests: ' + listOfTestsToBeExecuted);
1213

1314
try {
14-
testInvokerStatusCode = await testInvoker(listOfTestsToBeExecuted);
15+
testInvokerStatusCode = await testInvoker(listOfTestsToBeExecuted, ciData);
1516
} catch (err) {
1617
tl.debug(`Unable to invoke automated test execution. Err:( ${err} )`);
1718
testInvokerStatusCode = 1;
+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import * as tl from 'azure-pipelines-task-lib/task';
2+
3+
const area: string = 'TestManagement';
4+
const feature: string = 'AzureTestPlanTask';
5+
6+
function getDefaultProps() {
7+
return {
8+
releaseuri: tl.getVariable('Release.ReleaseUri'),
9+
releaseid: tl.getVariable('Release.ReleaseId'),
10+
builduri: tl.getVariable('Build.BuildUri'),
11+
buildid: tl.getVariable('Build.Buildid')
12+
};
13+
}
14+
15+
export function publishEvent(properties: { [key: string]: any }): void {
16+
try {
17+
tl.assertAgent('2.144.0');
18+
publishTelemetry(area, feature, Object.assign(getDefaultProps(), properties));
19+
20+
} catch (err) {
21+
tl.debug('Unable to publish telemetry due to lower agent version.');
22+
}
23+
}
24+
25+
export function publishTelemetry(area: string, feature: string, properties: { [key: string]: any }): void {
26+
const data = JSON.stringify(properties);
27+
tl.debug('telemetry area: ' + area + ' feature: ' + feature + ' data: ' + data);
28+
tl.command('telemetry.publish', { 'area': area, 'feature': feature }, data);
29+
}
30+
31+
export interface ciDictionary {
32+
[key: string]: any;
33+
}

Tasks/AzureTestPlanV0/publishAutomatedTests.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export async function publishAutomatedTestResult(listOfAutomatedTestPoints: stri
3131
const failTaskOnFailedTests = tl.getInput('failTaskOnFailedTests');
3232
const failTaskOnMissingResultsFile: boolean = tl.getBoolInput('failTaskOnMissingResultsFile');
3333
const failTaskOnFailureToPublishResults = tl.getInput('failTaskOnFailureToPublishResults');
34-
const testRunSystem = "AzureTestPlan : " + tl.getInput("testLanguageInput");
34+
const testRunSystem = "AzureTestPlan : " + tl.getInput("testLanguageInput").toString();
3535

3636
let searchFolder = tl.getVariable('System.DefaultWorkingDirectory');
3737

Tasks/AzureTestPlanV0/runTestPlan.ts

+18-1
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,47 @@ import * as tl from 'azure-pipelines-task-lib/task';
22
import { manualTestsFlow } from './manualTests'
33
import { getTestPlanData, TestPlanData } from './testPlanData'
44
import { automatedTestsFlow } from './automatedTests'
5+
import { publishEvent, ciDictionary } from './ciEventLogger';
56

67
export async function run() {
78

89
const testSelectorInput = tl.getInput('testSelector');
910
console.log('Test Selector selected : ' + testSelectorInput);
1011

12+
var ciData: ciDictionary = {
13+
TestSelector: testSelectorInput,
14+
totalNumOfManualTestPoint: 0,
15+
totalNumOfAutomatedTestPoint: 0,
16+
totalNumOfTestSuites: 0
17+
}
18+
1119
const testPlanInfo = await getTestPlanData();
1220

21+
ciData.totalNumOfAutomatedTestPoint = testPlanInfo.listOfAutomatedTestPoints.length;
22+
ciData.totalNumOfManualTestPoint = testPlanInfo.listOfManualTestPoints.length;
23+
ciData.totalNumOfTestSuites = testPlanInfo.testSuiteIds.length;
24+
1325
let manualTestFlowReturnCode = 0;
1426
let automatedTestFlowReturnCode = 0;
1527

1628
// trigger manual, automated or both tests based on user's input
1729
if (testSelectorInput.includes('manualTests')) {
1830
manualTestFlowReturnCode = await manualTestsFlow(testPlanInfo);
1931
tl.debug(`Execution Status Code for Manual Test Flow is ${manualTestFlowReturnCode}`);
32+
ciData["manualTestFlowReturnCode"] = manualTestFlowReturnCode;
2033
}
34+
2135
if (testSelectorInput.includes('automatedTests')) {
22-
automatedTestFlowReturnCode = await automatedTestsFlow(testPlanInfo, testSelectorInput);
36+
automatedTestFlowReturnCode = await automatedTestsFlow(testPlanInfo, testSelectorInput, ciData);
2337
tl.debug(`Execution Status Code for Automated Test Flow is ${automatedTestFlowReturnCode}`);
38+
ciData["automatedTestFlowReturnCode"] = automatedTestFlowReturnCode;
2439
}
2540

2641
if( manualTestFlowReturnCode || automatedTestFlowReturnCode){
2742
tl.setResult(tl.TaskResult.Failed, "Faced error in execution.");
2843
}
44+
45+
publishEvent(ciData);
2946
}
3047

3148
run();

Tasks/AzureTestPlanV0/task.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"version": {
1515
"Major": 0,
1616
"Minor": 238,
17-
"Patch": 8
17+
"Patch": 10
1818
},
1919
"preview": true,
2020
"demands": [],

Tasks/AzureTestPlanV0/task.loc.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"version": {
1515
"Major": 0,
1616
"Minor": 238,
17-
"Patch": 8
17+
"Patch": 10
1818
},
1919
"preview": true,
2020
"demands": [],
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
Default|0.238.8
2-
Node20-225|0.238.9
1+
Default|0.238.10
2+
Node20-225|0.238.11

_generated/AzureTestPlanV0/automatedTestInvoker.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import * as tl from 'azure-pipelines-task-lib/task'
22
import { executePythonTests } from './Invokers/pythoninvoker'
33
import { executeMavenTests } from './Invokers/maveninvoker'
44
import { executeGradleTests } from './Invokers/gradleinvoker'
5+
import { ciDictionary } from './ciEventLogger';
56

6-
export async function testInvoker(testsToBeExecuted: string[]): Promise<number> {
7+
export async function testInvoker(testsToBeExecuted: string[], ciData: ciDictionary): Promise<number> {
78

89
const testLanguageStrings = tl.getDelimitedInput('testLanguageInput', ',', true);
910

@@ -21,20 +22,24 @@ export async function testInvoker(testsToBeExecuted: string[]): Promise<number>
2122
case 'Java-Maven':
2223
exitCode = await executeMavenTests(testsToBeExecuted);
2324
tl.debug(`Execution Status Code for Maven: ${exitCode}`);
25+
ciData["isJavaMavenExecution"] = true;
2426
break;
2527

2628
case 'Java-Gradle':
2729
exitCode = await executeGradleTests(testsToBeExecuted);
2830
tl.debug(`Execution Status Code for Gradle: ${exitCode}`);
31+
ciData["isJavaGradleExecution"] = true;
2932
break;
3033

3134
case 'Python':
3235
exitCode = await executePythonTests(testsToBeExecuted);
3336
tl.debug(`Execution Status Code for Python: ${exitCode}`);
37+
ciData["isPythonExecution"] = true;
3438
break;
3539

3640
default:
3741
console.log('Invalid test Language Input selected.');
42+
ciData["NoLanguageInput"] = true;
3843
}
3944

4045
exitStatusCode = exitStatusCode || exitCode;

_generated/AzureTestPlanV0/automatedTests.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@ import tl = require('azure-pipelines-task-lib/task');
22
import { testInvoker } from './automatedTestInvoker';
33
import { TestPlanData } from './testPlanData';
44
import { publishAutomatedTestResult } from './publishAutomatedTests';
5+
import { ciDictionary } from './ciEventLogger';
56

6-
export async function automatedTestsFlow(testPlanInfo: TestPlanData, testSelectorInput: string): Promise<number> {
7+
export async function automatedTestsFlow(testPlanInfo: TestPlanData, testSelectorInput: string, ciData: ciDictionary): Promise<number> {
78
let listOfTestsToBeExecuted: string[] = testPlanInfo.listOfFQNOfTestCases;
89
let testInvokerStatusCode = 0;
910

1011
if (listOfTestsToBeExecuted !== null && listOfTestsToBeExecuted !== undefined && listOfTestsToBeExecuted.length > 0) {
1112
tl.debug('Invoking test execution for tests: ' + listOfTestsToBeExecuted);
1213

1314
try {
14-
testInvokerStatusCode = await testInvoker(listOfTestsToBeExecuted);
15+
testInvokerStatusCode = await testInvoker(listOfTestsToBeExecuted, ciData);
1516
} catch (err) {
1617
tl.debug(`Unable to invoke automated test execution. Err:( ${err} )`);
1718
testInvokerStatusCode = 1;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import * as tl from 'azure-pipelines-task-lib/task';
2+
3+
const area: string = 'TestManagement';
4+
const feature: string = 'AzureTestPlanTask';
5+
6+
function getDefaultProps() {
7+
return {
8+
releaseuri: tl.getVariable('Release.ReleaseUri'),
9+
releaseid: tl.getVariable('Release.ReleaseId'),
10+
builduri: tl.getVariable('Build.BuildUri'),
11+
buildid: tl.getVariable('Build.Buildid')
12+
};
13+
}
14+
15+
export function publishEvent(properties: { [key: string]: any }): void {
16+
try {
17+
tl.assertAgent('2.144.0');
18+
publishTelemetry(area, feature, Object.assign(getDefaultProps(), properties));
19+
20+
} catch (err) {
21+
tl.debug('Unable to publish telemetry due to lower agent version.');
22+
}
23+
}
24+
25+
export function publishTelemetry(area: string, feature: string, properties: { [key: string]: any }): void {
26+
const data = JSON.stringify(properties);
27+
tl.debug('telemetry area: ' + area + ' feature: ' + feature + ' data: ' + data);
28+
tl.command('telemetry.publish', { 'area': area, 'feature': feature }, data);
29+
}
30+
31+
export interface ciDictionary {
32+
[key: string]: any;
33+
}

_generated/AzureTestPlanV0/publishAutomatedTests.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export async function publishAutomatedTestResult(listOfAutomatedTestPoints: stri
3131
const failTaskOnFailedTests = tl.getInput('failTaskOnFailedTests');
3232
const failTaskOnMissingResultsFile: boolean = tl.getBoolInput('failTaskOnMissingResultsFile');
3333
const failTaskOnFailureToPublishResults = tl.getInput('failTaskOnFailureToPublishResults');
34-
const testRunSystem = "AzureTestPlan : " + tl.getInput("testLanguageInput");
34+
const testRunSystem = "AzureTestPlan : " + tl.getInput("testLanguageInput").toString();
3535

3636
let searchFolder = tl.getVariable('System.DefaultWorkingDirectory');
3737

_generated/AzureTestPlanV0/runTestPlan.ts

+18-1
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,47 @@ import * as tl from 'azure-pipelines-task-lib/task';
22
import { manualTestsFlow } from './manualTests'
33
import { getTestPlanData, TestPlanData } from './testPlanData'
44
import { automatedTestsFlow } from './automatedTests'
5+
import { publishEvent, ciDictionary } from './ciEventLogger';
56

67
export async function run() {
78

89
const testSelectorInput = tl.getInput('testSelector');
910
console.log('Test Selector selected : ' + testSelectorInput);
1011

12+
var ciData: ciDictionary = {
13+
TestSelector: testSelectorInput,
14+
totalNumOfManualTestPoint: 0,
15+
totalNumOfAutomatedTestPoint: 0,
16+
totalNumOfTestSuites: 0
17+
}
18+
1119
const testPlanInfo = await getTestPlanData();
1220

21+
ciData.totalNumOfAutomatedTestPoint = testPlanInfo.listOfAutomatedTestPoints.length;
22+
ciData.totalNumOfManualTestPoint = testPlanInfo.listOfManualTestPoints.length;
23+
ciData.totalNumOfTestSuites = testPlanInfo.testSuiteIds.length;
24+
1325
let manualTestFlowReturnCode = 0;
1426
let automatedTestFlowReturnCode = 0;
1527

1628
// trigger manual, automated or both tests based on user's input
1729
if (testSelectorInput.includes('manualTests')) {
1830
manualTestFlowReturnCode = await manualTestsFlow(testPlanInfo);
1931
tl.debug(`Execution Status Code for Manual Test Flow is ${manualTestFlowReturnCode}`);
32+
ciData["manualTestFlowReturnCode"] = manualTestFlowReturnCode;
2033
}
34+
2135
if (testSelectorInput.includes('automatedTests')) {
22-
automatedTestFlowReturnCode = await automatedTestsFlow(testPlanInfo, testSelectorInput);
36+
automatedTestFlowReturnCode = await automatedTestsFlow(testPlanInfo, testSelectorInput, ciData);
2337
tl.debug(`Execution Status Code for Automated Test Flow is ${automatedTestFlowReturnCode}`);
38+
ciData["automatedTestFlowReturnCode"] = automatedTestFlowReturnCode;
2439
}
2540

2641
if( manualTestFlowReturnCode || automatedTestFlowReturnCode){
2742
tl.setResult(tl.TaskResult.Failed, "Faced error in execution.");
2843
}
44+
45+
publishEvent(ciData);
2946
}
3047

3148
run();

_generated/AzureTestPlanV0/task.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"version": {
1515
"Major": 0,
1616
"Minor": 238,
17-
"Patch": 8
17+
"Patch": 10
1818
},
1919
"preview": true,
2020
"demands": [],
@@ -179,7 +179,7 @@
179179
"MultipleMatchingGradlewFound": "Multiple gradlew files found. Selecting the first matched instance"
180180
},
181181
"_buildConfigMapping": {
182-
"Default": "0.238.8",
183-
"Node20-225": "0.238.9"
182+
"Default": "0.238.10",
183+
"Node20-225": "0.238.11"
184184
}
185185
}

_generated/AzureTestPlanV0/task.loc.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"version": {
1515
"Major": 0,
1616
"Minor": 238,
17-
"Patch": 8
17+
"Patch": 10
1818
},
1919
"preview": true,
2020
"demands": [],
@@ -179,7 +179,7 @@
179179
"MultipleMatchingGradlewFound": "ms-resource:loc.messages.MultipleMatchingGradlewFound"
180180
},
181181
"_buildConfigMapping": {
182-
"Default": "0.238.8",
183-
"Node20-225": "0.238.9"
182+
"Default": "0.238.10",
183+
"Node20-225": "0.238.11"
184184
}
185185
}

_generated/AzureTestPlanV0_Node20/automatedTestInvoker.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import * as tl from 'azure-pipelines-task-lib/task'
22
import { executePythonTests } from './Invokers/pythoninvoker'
33
import { executeMavenTests } from './Invokers/maveninvoker'
44
import { executeGradleTests } from './Invokers/gradleinvoker'
5+
import { ciDictionary } from './ciEventLogger';
56

6-
export async function testInvoker(testsToBeExecuted: string[]): Promise<number> {
7+
export async function testInvoker(testsToBeExecuted: string[], ciData: ciDictionary): Promise<number> {
78

89
const testLanguageStrings = tl.getDelimitedInput('testLanguageInput', ',', true);
910

@@ -21,20 +22,24 @@ export async function testInvoker(testsToBeExecuted: string[]): Promise<number>
2122
case 'Java-Maven':
2223
exitCode = await executeMavenTests(testsToBeExecuted);
2324
tl.debug(`Execution Status Code for Maven: ${exitCode}`);
25+
ciData["isJavaMavenExecution"] = true;
2426
break;
2527

2628
case 'Java-Gradle':
2729
exitCode = await executeGradleTests(testsToBeExecuted);
2830
tl.debug(`Execution Status Code for Gradle: ${exitCode}`);
31+
ciData["isJavaGradleExecution"] = true;
2932
break;
3033

3134
case 'Python':
3235
exitCode = await executePythonTests(testsToBeExecuted);
3336
tl.debug(`Execution Status Code for Python: ${exitCode}`);
37+
ciData["isPythonExecution"] = true;
3438
break;
3539

3640
default:
3741
console.log('Invalid test Language Input selected.');
42+
ciData["NoLanguageInput"] = true;
3843
}
3944

4045
exitStatusCode = exitStatusCode || exitCode;

0 commit comments

Comments
 (0)