{
- IgnoreTestFailures: this.inputDataContract.ExecutionSettings.IgnoreTestFailures,
+ IgnoreTestFailures: this.inputDataContract.TestReportingSettings.ExecutionStatusSettings.IgnoreTestFailures,
env: envVars,
failOnStdErr: false,
// In effect this will not be called as failOnStdErr is false
@@ -105,18 +98,18 @@ export class NonDistributedTest {
return 1;
}
}
-
- private getTestAssemblies(): string[] {
- tl.debug('Searching for test assemblies in: ' + this.inputDataContract.TestSelectionSettings.SearchFolder);
- return tl.findMatch(this.inputDataContract.TestSelectionSettings.SearchFolder, this.sourceFilter);
- }
-
private createTestSourcesFile(): string {
try {
console.log(tl.loc('UserProvidedSourceFilter', this.sourceFilter.toString()));
-
+ const telemetryProps: { [key: string]: any; } = { MiniMatchLines: this.sourceFilter.length };
+ telemetryProps.ExecutionFlow = 'NonDistributed';
+ var start = new Date().getTime();
const sources = tl.findMatch(this.inputDataContract.TestSelectionSettings.SearchFolder, this.sourceFilter);
- tl.debug('tl match count :' + sources.length);
+ var timeTaken = new Date().getTime() - start;
+ tl.debug( `Time taken for applying the minimatch pattern to filter out the sources ${timeTaken} ms` );
+ telemetryProps.TimeToSearchDLLsInMilliSeconds = timeTaken;
+ tl.debug(`${sources.length} files matched the given minimatch filter`);
+ ci.publishTelemetry('TestExecution','MinimatchFilterPerformance', telemetryProps);
const filesMatching = [];
sources.forEach(function (match: string) {
if (!fs.lstatSync(match).isDirectory()) {
diff --git a/Tasks/VsTestV2/task.json b/Tasks/VsTestV2/task.json
index 88b91fe0c649..6fab3784e0cf 100644
--- a/Tasks/VsTestV2/task.json
+++ b/Tasks/VsTestV2/task.json
@@ -17,7 +17,7 @@
"author": "Microsoft Corporation",
"version": {
"Major": 2,
- "Minor": 160,
+ "Minor": 161,
"Patch": 1
},
"demands": [
@@ -407,6 +407,25 @@
"helpMarkDown": "Opt in/out of publishing run level attachments.",
"groupName": "reportingOptions"
},
+ {
+ "name": "failOnMinTestsNotRun",
+ "type": "boolean",
+ "label": "Fail the task if a minimum number of tests are not run.",
+ "defaultValue": "False",
+ "required": false,
+ "helpMarkDown": "Selecting this option will fail the task if specified minimum number of tests is not run.",
+ "groupName": "reportingOptions"
+ },
+ {
+ "name": "minimumExpectedTests",
+ "type": "string",
+ "label": "Minimum # of tests",
+ "defaultValue": "1",
+ "required": false,
+ "helpMarkDown": "Specify the minimum # of tests that should be run for the task to succeed. Total tests executed is calculated as the sum of passed, failed and aborted tests.",
+ "groupName": "reportingOptions",
+ "visibleRule": "failOnMinTestsNotRun = true"
+ },
{
"name": "diagnosticsEnabled",
"type": "boolean",
diff --git a/Tasks/VsTestV2/task.loc.json b/Tasks/VsTestV2/task.loc.json
index a8efdeeacf5f..79cb526a5b5a 100644
--- a/Tasks/VsTestV2/task.loc.json
+++ b/Tasks/VsTestV2/task.loc.json
@@ -17,7 +17,7 @@
"author": "Microsoft Corporation",
"version": {
"Major": 2,
- "Minor": 160,
+ "Minor": 161,
"Patch": 1
},
"demands": [
@@ -407,6 +407,25 @@
"helpMarkDown": "ms-resource:loc.input.help.publishRunAttachments",
"groupName": "reportingOptions"
},
+ {
+ "name": "failOnMinTestsNotRun",
+ "type": "boolean",
+ "label": "ms-resource:loc.input.label.failOnMinTestsNotRun",
+ "defaultValue": "False",
+ "required": false,
+ "helpMarkDown": "ms-resource:loc.input.help.failOnMinTestsNotRun",
+ "groupName": "reportingOptions"
+ },
+ {
+ "name": "minimumExpectedTests",
+ "type": "string",
+ "label": "ms-resource:loc.input.label.minimumExpectedTests",
+ "defaultValue": "1",
+ "required": false,
+ "helpMarkDown": "ms-resource:loc.input.help.minimumExpectedTests",
+ "groupName": "reportingOptions",
+ "visibleRule": "failOnMinTestsNotRun = true"
+ },
{
"name": "diagnosticsEnabled",
"type": "boolean",
diff --git a/Tasks/XamarinAndroidV1/task.json b/Tasks/XamarinAndroidV1/task.json
index a2e811fcf5a3..eef260cfa0ab 100644
--- a/Tasks/XamarinAndroidV1/task.json
+++ b/Tasks/XamarinAndroidV1/task.json
@@ -12,7 +12,7 @@
"author": "Microsoft Corporation",
"version": {
"Major": 1,
- "Minor": 160,
+ "Minor": 161,
"Patch": 0
},
"demands": [
diff --git a/Tasks/XamarinTestCloudV1/Strings/resources.resjson/en-US/resources.resjson b/Tasks/XamarinTestCloudV1/Strings/resources.resjson/en-US/resources.resjson
index ad842825e650..560a389003c3 100644
--- a/Tasks/XamarinTestCloudV1/Strings/resources.resjson/en-US/resources.resjson
+++ b/Tasks/XamarinTestCloudV1/Strings/resources.resjson/en-US/resources.resjson
@@ -1,6 +1,6 @@
{
"loc.friendlyName": "Xamarin Test Cloud",
- "loc.helpMarkDown": "[More Information](https://go.microsoft.com/fwlink/?LinkID=613744)",
+ "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613744)",
"loc.description": "[Deprecated] Test mobile apps with Xamarin Test Cloud using Xamarin.UITest. Instead, use the 'App Center test' task.",
"loc.instanceNameFormat": "Test $(app) with Xamarin.UITest in Xamarin Test Cloud",
"loc.group.displayName.advanced": "Advanced",
diff --git a/Tasks/XamarinTestCloudV1/Tests/L0.ts b/Tasks/XamarinTestCloudV1/Tests/L0.ts
new file mode 100644
index 000000000000..302aa6df22bd
--- /dev/null
+++ b/Tasks/XamarinTestCloudV1/Tests/L0.ts
@@ -0,0 +1,27 @@
+import fs = require('fs');
+import assert = require('assert');
+import path = require('path');
+
+const psm = require('../../../Tests/lib/psRunner');
+let psr = null;
+
+describe('XamarinTestCloudV1 Suite', function () {
+ before((done) => {
+ if (psm.testSupported()) {
+ psr = new psm.PSRunner();
+ psr.start();
+ }
+ done();
+ });
+
+ after(function () {
+ if (psr) {
+ psr.kill();
+ }
+ });
+
+ it('Does a basic hello world test', function(done: MochaDone) {
+ // TODO - add real tests
+ done();
+ });
+});
diff --git a/Tasks/XamariniOSV2/task.json b/Tasks/XamariniOSV2/task.json
index 21bc653ffc37..0bac20d74a23 100644
--- a/Tasks/XamariniOSV2/task.json
+++ b/Tasks/XamariniOSV2/task.json
@@ -12,7 +12,7 @@
"author": "Microsoft Corporation",
"version": {
"Major": 2,
- "Minor": 160,
+ "Minor": 161,
"Patch": 0
},
"releaseNotes": "iOS signing set up has been removed from the task. Use `Secure Files` with supporting tasks `Install Apple Certificate` and `Install Apple Provisioning Profile` to setup signing. Updated options to work better with `Visual Studio for Mac`.",
diff --git a/ci/file-bugs.js b/ci/file-bugs.js
new file mode 100644
index 000000000000..7d0f4af024d4
--- /dev/null
+++ b/ci/file-bugs.js
@@ -0,0 +1,293 @@
+const fs = require('fs');
+const Octokit = require('@octokit/rest');
+const path = require('path');
+const jsyaml = require('js-yaml');
+const azdev = require('azure-devops-node-api');
+
+const githubPAT = process.env['GITHUB_PAT'];
+const azpPAT = process.env['AZP_PAT'];
+
+// Number of bugs an area is allowed to have before a P0 AzDevOps bug is filed.
+const bugTolerance = 100;
+// Number of stale bugs an area is allowed to have before a P0 AzDevOps bug is filed.
+const staleBugTolerance = 10;
+// Number of untouched bugs an area is allowed to have before a P0 AzDevOps bug is filed. An untouched bug is one that is both stale and has never been responded to.
+const untouchedBugTolerance = 0;
+// Number of days a bug can avoid having activity before being marked stale.
+const staleTimeout = 30;
+
+// Reads in a mapping of paths to labels owned by that path from issue-rules.yml
+function getPathMappings() {
+ let mappingDict = {};
+ var yaml = jsyaml.safeLoad(fs.readFileSync(path.join(__dirname, '..', 'issue-rules.yml'), 'utf8'));
+ var pathMappings = yaml['pathMappings'];
+ pathMappings.forEach(mapping => {
+ mappingDict[mapping['path']] = mapping['labels']
+ })
+ return mappingDict;
+}
+
+function banner(text) {
+ console.log();
+ console.log('----------------------------------------------------------');
+ console.log(text);
+ console.log('----------------------------------------------------------');
+ console.log();
+}
+
+function header(text) {
+ console.log('--------' + text + '--------');
+}
+
+// Given a list of GitHub issues, filters out Pull Requests (the GitHub API doesn't differentiate between issues and PRs)
+function filterOutPullRequests(issues) {
+ return issues.filter((value) => {
+ return !value.pull_request;
+ })
+}
+
+// Prints a map sorted on the second function. Takes an optional printFunction parameter to dictate how we print the output
+function printSortedMap(dict, printFunction){
+ // Create items array
+ var items = Object.keys(dict).map(function(key) {
+ return [key, dict[key]];
+ });
+
+ // Sort the array based on the second element
+ items.sort(function(first, second) {
+ return second[1] - first[1];
+ });
+
+ // Create a new array with only the first 5 items
+ items.forEach(item => {
+ if (!printFunction) {
+ console.log(item[0] + ': ' + item[1]);
+ } else {
+ printFunction(item);
+ }
+ })
+}
+
+// Takes a list of github issues and returns an object mapping issue labels to the number of issues with that label
+function getIssuesByLabel(issues, issueType) {
+ issueType = issueType.toLowerCase();
+ let labelMap = {};
+ issues.forEach(issue => {
+ if (issue.labels) {
+ let containsIssueType = false;
+
+ issue.labels.forEach(label => {
+ const labelName = label.name;
+ if (labelName.toLowerCase(labelName) == issueType) {
+ containsIssueType = true;
+ }
+ });
+
+ if (containsIssueType) {
+ issue.labels.forEach(label => {
+ const labelName = label.name;
+ if (labelName.toLowerCase(labelName) != issueType) {
+ if (labelName in labelMap) {
+ labelMap[labelName]++;
+ } else {
+ labelMap[labelName] = 1;
+ }
+ }
+ });
+ }
+ }
+ });
+
+ return labelMap;
+}
+
+// Generates urls to view bugs by label for the bodies of the bugs
+function getIssueUrls(labels) {
+ var urls = '';
+ labels.forEach(label => {
+ urls += `https://github.com/microsoft/azure-pipelines-tasks/issues?q=is%3Aissue+is%3Aopen+label%3Abug+label%3A%22Area%3A+Release%22+label%3A%22${label.replace(': ', '%3A+')}%22
`
+ });
+
+ return urls;
+}
+
+// Gets the node api for getting workitems
+async function getNodeApi() {
+ let authHandler = azdev.getPersonalAccessTokenHandler(azpPAT);
+ let connection = new azdev.WebApi('https://dev.azure.com/mseng', authHandler);
+ return await connection.getWorkItemTrackingApi();
+}
+
+// Creates a bug. If one already exists with the same path/title, does nothing
+async function createBug(nodeApi, path, title, message) {
+ // First try to find an already created bug. If that doesn't exist, create a new one.
+ const wiql = `SELECT System.ID from workitems where [Title] = '${title}' and [System.AreaPath] = '${path}' AND [System.State] = 'Active'`;
+ const items = await nodeApi.queryByWiql({query: wiql});
+
+ if (!items['workItems'] || items['workItems'].length == 0) {
+ const workItem = await nodeApi.createWorkItem(null, [
+ {
+ "op": "add",
+ "path": "/fields/System.Title",
+ "value": title
+ },
+ {
+ "op": "add",
+ "path": "/fields/System.AreaPath",
+ "value": path
+ }
+ ], 'AzureDevOps', 'Bug');
+
+ await nodeApi.addComment({text: message}, 'AzureDevOps', workItem.id);
+ console.log(workItem.id);
+ } else {
+ console.log(`Work item already exists:\n${items['workItems']}`)
+ }
+
+ console.log(await nodeApi.getComments('AzureDevOps', 1644436));
+}
+
+/*
+* This is the important function for 90+% of users. Takes in some issue maps and assigns bugs based off of the results.
+*
+* @param bugsByLabel The number of bugs assigned to each area
+* @param staleBugsByLabel The number of stale bugs assigned to each area
+* @param untouchedBugsByLabel The number of untouched bugs assigned to each area
+*
+* @returns void
+*/
+async function fileBugs(bugsByLabel, staleBugsByLabel, untouchedBugsByLabel) {
+ banner('Filing bugs for the following areas');
+
+ const nodeApi = await getNodeApi();
+ const labelToPathMapping = getPathMappings();
+
+ const paths = Object.keys(labelToPathMapping);
+ for(i = 0; i < paths.length; i++) {
+ const path = paths[i];
+ let bugs = 0;
+ let staleBugs = 0;
+ let untouchedBugs = 0;
+ const labels = labelToPathMapping[path];
+ for (var j = 0; j < labels.length; j++) {
+ const label = labels[j];
+ if (label in bugsByLabel) {
+ bugs += bugsByLabel[label];
+ }
+ if (label in staleBugsByLabel) {
+ staleBugs += staleBugsByLabel[label];
+ }
+ if (label in untouchedBugsByLabel) {
+ untouchedBugs += untouchedBugsByLabel[label];
+ }
+ }
+
+ if (bugs > bugTolerance || staleBugs > staleBugTolerance || untouchedBugs > untouchedBugTolerance) {
+ header(path);
+ console.log('Bugs:', bugs);
+ console.log('Stale bugs:', staleBugs);
+ console.log('Untouched bugs:', untouchedBugs);
+ console.log();
+
+ let bugTitle = `Too many bugs in https://github.com/microsoft/azure-pipelines-tasks`;
+ // Format message as html so it renders correctly.
+ let bugMessage =
+`The number of bugs assigned to the labels owned by this area path in https://github.com/microsoft/azure-pipelines-tasks has exceeded the number of allowable bugs.
+
+Labels owned by this area: ${JSON.stringify(labels)}
+
+Current bug counts:
+Bugs: ${bugs}
+Stale bugs (>30 days without action): ${staleBugs}
+Untouched bugs (stale, never responded to): ${untouchedBugs}
+
+The number of allowable bugs for a given area is:
+Bugs: ${bugTolerance}
+Stale bugs (>30 days without action): ${staleBugTolerance}
+Untouched bugs (stale, never responded to): ${untouchedBugs}
+
+To view this area's bugs, visit the following urls:
+${getIssueUrls(labels)}
+
+If you believe this issue was filed in error, please follow the following steps:
+1) Check the path mappings at the bottom of https://github.com/microsoft/azure-pipelines-tasks/blob/master/issue-rules.yml. If your path is incorrectly mapped, add a PR and tag @damccorm for review
+2) If the path mappings look correct, file a bug in AzureDevOps\\VSTS\\Pipelines\\Platform and assign Danny McCormick (alias damccorm)
`;
+
+ await createBug(nodeApi, path, bugTitle, bugMessage);
+ }
+ }
+}
+
+// Main - gets issues from GitHub and performs computation on them, culminating in us filing bugs.
+async function run() {
+ const octokit = new Octokit({
+ auth: githubPAT
+ });
+
+ banner('Getting issues...');
+ const options = octokit.issues.listForRepo.endpoint.merge({
+ owner: 'microsoft',
+ repo: 'azure-pipelines-tasks',
+ state: 'open'
+ });
+ const issuesAndPulls = await octokit.paginate(options);
+
+ const issues = filterOutPullRequests(issuesAndPulls);
+ console.log('Found ' + issues.length + ' issues of any type.');
+
+ banner('Analyzing issues...');
+ const labelMap = getIssuesByLabel(issues, 'bug');
+
+ header('Open bugs by area');
+ printSortedMap(labelMap, (item) => {
+ if (item[0].startsWith('Area: ')) {
+ console.log(item[0].slice('Area: '.length) + ': ' + item[1]);
+ }
+ });
+
+ banner(`Getting stale issues (open with no activity in the last ${staleTimeout} days)`);
+ const today = new Date();
+ const staleDate = new Date().setDate(today.getDate()-staleTimeout);
+ const staleIssues = issues.filter(value => {
+ const updated = new Date(value.updated_at);
+ return updated < staleDate;
+ });
+ console.log('Found ' + staleIssues.length + ' stale issues of any type.');
+
+ banner('Analyzing stale issues');
+ const staleLabelMap = getIssuesByLabel(staleIssues, 'bug');
+
+ header('Stale bugs by area');
+ printSortedMap(staleLabelMap, (item) => {
+ if (item[0].startsWith('Area: ')) {
+ console.log(item[0].slice('Area: '.length) + ': ' + item[1]);
+ }
+ });
+
+ banner('Getting stale issues that have never been responded to');
+ const untouchedIssues = staleIssues.filter(value => {
+ return (!value.comments || value.comments < 1);
+ });
+ console.log('Found ' + untouchedIssues.length + ' untouched issues of any type.');
+
+ banner('Analyzing stale issues that have never been responded to');
+ const untouchedLabelMap = getIssuesByLabel(untouchedIssues, 'bug');
+
+ header('Stale bugs by area');
+ printSortedMap(untouchedLabelMap, (item) => {
+ if (item[0].startsWith('Area: ')) {
+ console.log(item[0].slice('Area: '.length) + ': ' + item[1]);
+ }
+ });
+
+ try {
+ await fileBugs(labelMap, staleLabelMap, untouchedLabelMap);
+ }
+ catch (err) {
+ // Log error before throwing or it will get swallowed since its inside an async function
+ console.log(err);
+ throw err;
+ }
+}
+
+run();
diff --git a/docs/tests-needed.md b/docs/tests-needed.md
new file mode 100644
index 000000000000..916b36811fc8
--- /dev/null
+++ b/docs/tests-needed.md
@@ -0,0 +1,174 @@
+# Tests Needed!
+
+Right now, lots of our tasks are missing even basic unit test coverage. To help us reach a better place, we'd like help writing some!
+
+The initial goal here is pretty small - get at least one unit test per task that tests a mainline use.
+The idea here is to lower the entry barrier for writing new tests so that we can make that an expectation with any PR introducing new
+functionality.
+
+To that end, we've created the following table which indicates which tasks currently have no tests, please add tests and help get the number
+of untested tasks to 0!
+
+| Task | Owner | Tested? |
+|---|---|---|
+| AndroidSigningV2 | @leantk | :heavy_check_mark: |
+| AndroidSigningV3 | @leantk | :heavy_check_mark: |
+| ANTV1 | @leantk | |
+| AppCenterDistributeV1 | @DennisPan @turanuk | :heavy_check_mark: |
+| AppCenterDistributeV2 | @DennisPan @turanuk | :heavy_check_mark: |
+| AppCenterDistributeV3 | @DennisPan @turanuk | :heavy_check_mark: |
+| AppCenterTestV1 | @owenniblock | :heavy_check_mark: |
+| ArchiveFilesV2 | @jtpetty | :heavy_check_mark: |
+| AzureAppServiceManageV0 | @kmkumaran @SumiranAgg @vincentdass | :heavy_check_mark: |
+| AzureAppServiceSettingsV1 | @eaarora-ms @SumiranAgg @vincentdass @niadak | |
+| AzureCLIV1 | @bishal-pdmsft | |
+| AzureCLIV2 | @bishal-pdmsft | |
+| AzureCloudPowerShellDeploymentV1 | @kmkumaran | |
+| AzureFileCopyV1 | @kmkumaran | :heavy_check_mark: |
+| AzureFileCopyV2 | @kmkumaran | :heavy_check_mark: |
+| AzureFileCopyV3 | @kmkumaran | :heavy_check_mark: |
+| AzureFunctionAppContainerV1 | @kmkumaran @SumiranAgg | :heavy_check_mark: |
+| AzureFunctionAppV1 | @kmkumaran @SumiranAgg | |
+| AzureFunctionOnKubernetesV0 | | |
+| AzureIoTEdgeV2 | @prativen @blackchoey @michaeljqzq | |
+| AzureKeyVaultV1 | @bansalaseem | :heavy_check_mark: |
+| AzureMonitorAlertsV0 | @kmkumaran | :heavy_check_mark: |
+| AzureMysqlDeploymentV1 | @kmkumaran @RoshanKumarMicrosoft | :heavy_check_mark: |
+| AzureNLBManagementV1 | @kmkumaran | :heavy_check_mark: |
+| AzurePowerShellV2 | @kmkumaran | :heavy_check_mark: |
+| AzurePowerShellV3 | @kmkumaran | :heavy_check_mark: |
+| AzurePowerShellV4 | @kmkumaran | :heavy_check_mark: |
+| AzureResourceGroupDeploymentV2 | @bishal-pdmsft | :heavy_check_mark: |
+| AzureResourceManagerTemplateDeploymentV3 | @bishal-pdmsft @vinodkumar3 | :heavy_check_mark: |
+| AzureRmWebAppDeploymentV3 | @kmkumaran @SumiranAgg @vincentdass | :heavy_check_mark: |
+| AzureRmWebAppDeploymentV4 | @kmkumaran @SumiranAgg @vincentdass | :heavy_check_mark: |
+| AzureVmssDeploymentV0 | @bishal-pdmsft | :heavy_check_mark: |
+| AzureWebAppContainerV1 | @kmkumaran @SumiranAgg @vincentdass | :heavy_check_mark: |
+| AzureWebAppV1 | @kmkumaran @SumiranAgg @vincentdass | |
+| BashV3 | @jtpetty | :heavy_check_mark: |
+| ChefKnifeV1 | @kmkumaran | |
+| ChefV1 | @kmkumaran | |
+| CMakeV1 | @daveken | |
+| CmdLineV2 | @jtpetty | :heavy_check_mark: |
+| CocoaPodsV0 | @leantk | |
+| CondaEnvironmentV0 | @leantk | :heavy_check_mark: |
+| CondaEnvironmentV1 | @leantk | :heavy_check_mark: |
+| ContainerBuildV0 | @vithati @prebansa | :heavy_check_mark: |
+| ContainerStructureTestV0 | @SadagopanRajaram @navin22 | |
+| CopyFilesOverSSHV0 | @leantk | |
+| CopyFilesV2 | @jtpetty | :heavy_check_mark: |
+| CUrlUploaderV2 | @leantk | |
+| DecryptFileV1 | @leantk | |
+| DeleteFilesV1 | @jtpetty | :heavy_check_mark: |
+| DeployVisualStudioTestAgentV2 | @SadagopanRajaram @ShreyasRmsft | :heavy_check_mark: |
+| DockerComposeV0 | @bansalaseem | :heavy_check_mark: |
+| DockerInstallerV0 | | |
+| DockerV0 | @bansalaseem | :heavy_check_mark: |
+| DockerV1 | @bansalaseem | :heavy_check_mark: |
+| DockerV2 | @bansalaseem | :heavy_check_mark: |
+| DotNetCoreCLIV2 | @bishal-pdmsft | :heavy_check_mark: |
+| DotNetCoreInstallerV0 | @bishal-pdmsft | :heavy_check_mark: |
+| DotNetCoreInstallerV1 | @bishal-pdmsft | :heavy_check_mark: |
+| DownloadBuildArtifactsV0 | @Lovakumar @omeshp | |
+| DownloadFileshareArtifactsV0 | @Lovakumar @omeshp | |
+| DownloadGitHubReleaseV0 | | |
+| DownloadPackageV0 | @zjrunner | |
+| DownloadPackageV1 | | :heavy_check_mark: |
+| DownloadSecureFileV1 | @leantk | :heavy_check_mark: |
+| DuffleInstallerV0 | @bansalaseem @vithati | |
+| ExtractFilesV1 | @jtpetty | :heavy_check_mark: |
+| FileTransformV1 | @kmkumaran @SumiranAgg @vincentdass | |
+| FileTransformV2 | | |
+| FtpUploadV1 | @leantk | |
+| FtpUploadV2 | | |
+| FuncToolsInstallerV0 | | |
+| GitHubCommentV0 | @ds-ms | |
+| GitHubReleaseV0 | @prativen @mdmdakbar | :heavy_check_mark: |
+| GitHubReleaseV1 | | :heavy_check_mark: |
+| GoToolV0 | @bishal-pdmsft | |
+| GoV0 | @bishal-pdmsft | :heavy_check_mark: |
+| GradleV2 | @leantk | :heavy_check_mark: |
+| GruntV0 | @hross | |
+| GulpV0 | @hross | |
+| GulpV1 | @hross | |
+| HelmDeployV0 | @bansalaseem | |
+| HelmInstallerV0 | @bansalaseem | |
+| HelmInstallerV1 | @bansalaseem | |
+| IISWebAppDeployment | @kmkumaran | |
+| IISWebAppDeploymentOnMachineGroupV0 | @kmkumaran | :heavy_check_mark: |
+| IISWebAppManagementOnMachineGroupV0 | @kmkumaran | :heavy_check_mark: |
+| InstallAppleCertificateV2 | @leantk | :heavy_check_mark: |
+| InstallAppleProvisioningProfileV1 | @leantk | :heavy_check_mark: |
+| InstallSSHKeyV0 | @leantk | :heavy_check_mark: |
+| JavaToolInstallerV0 | @leantk | :heavy_check_mark: |
+| JenkinsDownloadArtifactsV1 | @Lovakumar @kasubram | :heavy_check_mark: |
+| JenkinsQueueJobV2 | @leantk | :heavy_check_mark: |
+| KubectlInstallerV0 | @bansalaseem | |
+| KubernetesManifestV0 | @bansalaseem | :heavy_check_mark: |
+| KubernetesV0 | @bansalaseem | :heavy_check_mark: |
+| KubernetesV1 | @bansalaseem | :heavy_check_mark: |
+| MavenAuthenticateV0 | @zjrunner @aasim | :heavy_check_mark: |
+| MavenV2 | @leantk | |
+| MavenV3 | @leantk | :heavy_check_mark: |
+| MSBuildV1 | @daveken | :heavy_check_mark: |
+| MysqlDeploymentOnMachineGroupV1 | @kmkumaran @RoshanKumarMicrosoft | :heavy_check_mark: |
+| NodeToolV0 | @damccorm | :heavy_check_mark: |
+| NpmAuthenticateV0 | @zjrunner | |
+| NpmV0 | | :heavy_check_mark: |
+| NpmV1 | @zjrunner @jotaylo | :heavy_check_mark: |
+| NuGetAuthenticateV0 | @zjrunner @zarenner | |
+| NuGetCommandV2 | @zjrunner @jotaylo | :heavy_check_mark: |
+| NuGetInstallerV0 | | :heavy_check_mark: |
+| NuGetPublisherV0 | @zjrunner | :heavy_check_mark: |
+| NuGetRestoreV1 | | :heavy_check_mark: |
+| NuGetToolInstallerV0 | @zjrunner | |
+| NuGetToolInstallerV1 | | |
+| NuGetV0 | @zjrunner | :heavy_check_mark: |
+| OpenPolicyAgentInstallerV0 | @Anumita | |
+| PackerBuildV0 | @bishal-pdmsft | :heavy_check_mark: |
+| PackerBuildV1 | @bishal-pdmsft | :heavy_check_mark: |
+| PipAuthenticateV0 | @zjrunner @shubham90 | |
+| PipAuthenticateV1 | @zjrunner @shubham90 | :heavy_check_mark: |
+| PowerShellOnTargetMachinesV1 | @kmkumaran | :heavy_check_mark: |
+| PowerShellOnTargetMachinesV2 | @kmkumaran | :heavy_check_mark: |
+| PowerShellOnTargetMachinesV3 | @kmkumaran | |
+| PowerShellV2 | @jtpetty | :heavy_check_mark: |
+| PublishBuildArtifactsV1 | @leantk | |
+| PublishCodeCoverageResultsV1 | @SadagopanRajaram @nigurr | |
+| PublishCodeCoverageResultsV2 | @karanjitsingh @acesiddhu | |
+| PublishPipelineMetadataV0 | @vithati @nidabas | |
+| PublishSymbolsV2 | @arunkm @mihaif @jahsu-MSFT @fadnavistanmay @owenhuynMSFT | :heavy_check_mark: |
+| PublishTestResultsV1 | @smalpani | :heavy_check_mark: |
+| PublishTestResultsV2 | @SadagopanRajaram | :heavy_check_mark: |
+| PyPIPublisherV0 | @bishal-pdmsft @leantk | :heavy_check_mark: |
+| PythonScriptV0 | @leantk | |
+| QuickPerfTestV1 | @SadagopanRajaram @ShreyasRmsft | |
+| ReviewAppV0 | @ds-ms | |
+| RunJMeterLoadTestV1 | @SadagopanRajaram @ShreyasRmsft | |
+| RunLoadTestV1 | @SadagopanRajaram @ShreyasRmsft | |
+| ServiceFabricComposeDeployV0 | @bishal-pdmsft | :heavy_check_mark: |
+| ServiceFabricDeployV1 | @bishal-pdmsft | :heavy_check_mark: |
+| ServiceFabricPowerShellV1 | @bishal-pdmsft | :heavy_check_mark: |
+| ServiceFabricUpdateManifestsV2 | @bishal-pdmsft | :heavy_check_mark: |
+| ShellScriptV2 | | :heavy_check_mark: |
+| SqlAzureDacpacDeploymentV1 | @kmkumaran | :heavy_check_mark: |
+| SqlDacpacDeploymentOnMachineGroupV0 | @kmkumaran | |
+| SqlServerDacpacDeployment | @kmkumaran | |
+| SshV0 | @leantk | |
+| TwineAuthenticateV0 | @zjrunner | |
+| TwineAuthenticateV1 | @zjrunner @shubham90 | :heavy_check_mark: |
+| UniversalPackagesV0 | @zjrunner | :heavy_check_mark: |
+| UseDotNetV2 | @bishal-pdmsft | :heavy_check_mark: |
+| UseNodeV1 | @damccorm | :heavy_check_mark: |
+| UsePythonVersionV0 | @leantk | :heavy_check_mark: |
+| UseRubyVersionV0 | @hross | :heavy_check_mark: |
+| VSBuildV1 | @daveken | :heavy_check_mark: |
+| VsTestPlatformToolInstallerV1 | @SadagopanRajaram @ShreyasRmsft | :heavy_check_mark: |
+| VsTestV1 | @SadagopanRajaram @ShreyasRmsft | |
+| VsTestV2 | @SadagopanRajaram @ShreyasRmsft | :heavy_check_mark: |
+| WindowsMachineFileCopyV1 | @kmkumaran | :heavy_check_mark: |
+| WindowsMachineFileCopyV2 | @kmkumaran | :heavy_check_mark: |
+| XamarinAndroidV1 | @leantk | :heavy_check_mark: |
+| XamariniOSV2 | @leantk | :heavy_check_mark: |
+| XamarinTestCloudV1 | @leantk | |
+| XcodeV5 | @leantk | :heavy_check_mark: |
diff --git a/issue-rules.yml b/issue-rules.yml
index 29d4a924d51c..2196c9a9f025 100644
--- a/issue-rules.yml
+++ b/issue-rules.yml
@@ -6,6 +6,9 @@ rules:
contains: 'AppCenter'
addLabels: ['Area: AppCenter']
# Area: Artifacts
+- valueFor: '**Enter Task Name**'
+ contains: 'MavenAuthenticate'
+ addLabels: ['Area: Artifacts']
- valueFor: '**Enter Task Name**'
contains: 'Nuget'
addLabels: ['Area: Artifacts']
@@ -41,10 +44,14 @@ rules:
contains: 'Gradle'
addLabels: ['Area: CrossPlatform']
assign: ['leantk']
+- valueFor: '**Enter Task Name**'
+ contains: 'Maven'
+ addLabels: ['Area: CrossPlatform']
+ assign: ['leantk']
- valueFor: '**Enter Task Name**'
contains: 'Python'
addLabels: ['Area: CrossPlatform']
- assign: ['leantk']
+ assign: ['leantk']
- valueFor: '**Enter Task Name**'
contains: 'PyPI'
addLabels: ['Area: CrossPlatform']
@@ -95,7 +102,7 @@ rules:
addLabels: ['Area: Release']
assign: ['prativen']
- valueFor: '**Enter Task Name**'
- contains: 'GithubReleaseV'
+ contains: 'GithubRelease'
addLabels: ['Area: Release']
assign: ['prativen']
- valueFor: '**Enter Task Name**'
@@ -239,6 +246,12 @@ rules:
- valueFor: '**Enter Task Name**'
contains: 'PublishTest'
addLabels: ['Area: Test']
+
+# Area: ArtifactsPackages
+- valueFor: '**Enter Task Name**'
+ contains: 'TwineAuthenticate'
+ addLabels: ['Area: ArtifactsPackages']
+
# Types
- valueFor: '*Type*'
contains: Feature
@@ -270,3 +283,20 @@ tags:
addLabels: ['triage']
- noneMatch: '\s*Area:\s*([^]*)'
addLabels: ['route']
+
+pathMappings:
+- path: 'AzureDevOps\VSTS\Pipelines\Platform'
+ labels: ['Area: Core']
+- path: 'AzureDevOps\VSTS\Pipelines\Application'
+ labels: ['Area: Build']
+- path: 'AzureDevOps\VSTS\Pipelines\Integration'
+ labels: ['Area: CrossPlatform']
+- path: 'AzureDevOps\VSTS\Artifacts'
+ labels: ['Area: Artifacts', 'Area: ArtifactsCore', 'Area: ArtifactsPackages', 'Area: PipelineArtifact', 'Area: PipelineCaching', 'Area: Symbols']
+- path: 'AzureDevOps\VSTS\Pipelines\RM-Service'
+ labels: ['Area: Release', 'Area: AzureAppService']
+- path: 'AzureDevOps\VSTS\Pipelines\Test Management and Reporting'
+ labels: ['Area: Test', 'Area: TestManagement', 'Area: CodeCoverage']
+# TODO - AppCenter owned by teams in AzureDevOps org - probably nothing to be done, worth thinking about
+# - path:
+# labels: ['Area: AppCenter']
diff --git a/make-options.json b/make-options.json
index b16ce3c13ea1..0b245792b3c7 100644
--- a/make-options.json
+++ b/make-options.json
@@ -60,6 +60,8 @@
"DeployVisualStudioTestAgentV2",
"DockerV0",
"DockerV1",
+ "DockerV2",
+ "DockerComposeV0",
"DockerInstallerV0",
"DotNetCoreCLIV2",
"DotNetCoreInstallerV0",
@@ -143,7 +145,6 @@
"QueryWorkItemsV0",
"QuickPerfTestV1",
"ReviewAppV0",
- "RunDistributedTestsV1",
"RunJMeterLoadTestV1",
"RunLoadTestV1",
"ServiceFabricComposeDeployV0",
diff --git a/package-lock.json b/package-lock.json
index e17d2171172e..6dd951bf6e1c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -46,6 +46,35 @@
"integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=",
"dev": true
},
+ "azure-devops-node-api": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-9.0.1.tgz",
+ "integrity": "sha512-0veE4EWHObJxzwgHlydG65BjNMuLPkR1nzcQ2K51PIho1/F4llpKt3pelC30Vbex5zA9iVgQ9YZGlkkvOBSksw==",
+ "dev": true,
+ "requires": {
+ "tunnel": "0.0.4",
+ "typed-rest-client": "1.2.0",
+ "underscore": "1.8.3"
+ },
+ "dependencies": {
+ "typed-rest-client": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.2.0.tgz",
+ "integrity": "sha512-FrUshzZ1yxH8YwGR29PWWnfksLEILbWJydU7zfIRkyH7kAEzB62uMAl2WY6EyolWpLpVHeJGgQm45/MaruaHpw==",
+ "dev": true,
+ "requires": {
+ "tunnel": "0.0.4",
+ "underscore": "1.8.3"
+ }
+ },
+ "underscore": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
+ "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
+ "dev": true
+ }
+ }
+ },
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@@ -169,9 +198,9 @@
"dev": true
},
"esprima": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
- "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true
},
"expand-range": {
@@ -360,9 +389,9 @@
}
},
"js-yaml": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz",
- "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==",
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
"dev": true,
"requires": {
"argparse": "^1.0.7",
@@ -677,7 +706,7 @@
"qs": {
"version": "6.5.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
- "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+ "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=",
"dev": true
},
"randomatic": {
diff --git a/package.json b/package.json
index 990749eb9823..43c5d6c646a7 100644
--- a/package.json
+++ b/package.json
@@ -32,9 +32,11 @@
"homepage": "https://github.com/Microsoft/azure-pipelines-tasks",
"devDependencies": {
"adm-zip": "0.4.13",
+ "azure-devops-node-api": "^9.0.1",
+ "js-yaml": "^3.13.1",
"markdown-toc": "^1.2.0",
"minimatch": "3.0.2",
- "minimist": "1.1.1",
+ "minimist": "^1.1.1",
"mocha": "2.3.3",
"mocha-junit-reporter": "1.17.0",
"node-uuid": "1.4.6",