diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index de4e2e0be278..4717643ec5ab 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -307,11 +307,11 @@ Tasks/PublishPipelineMetadataV0/* @vithati @nidabas Tasks/PublishSymbolsV2/* @arunkm @mihaif @jahsu-MSFT @fadnavistanmay @owenhuynMSFT -Tasks/PublishTestResultsV1/* @shaiku +Tasks/PublishTestResultsV1/* @shailesh-sk -Tasks/PublishTestResultsV2/* @shaiku +Tasks/PublishTestResultsV2/* @shailesh-sk -Tasks/ContainerStructureTestV0/* @shaiku @navin22 +Tasks/ContainerStructureTestV0/* @shailesh-sk @navin22 Tasks/PublishToAzureServiceBusV1/* @vithati diff --git a/Tasks/AzureAppServiceSettingsV1/Strings/resources.resjson/en-US/resources.resjson b/Tasks/AzureAppServiceSettingsV1/Strings/resources.resjson/en-US/resources.resjson index 92dfe3992e80..89ee9866493c 100644 --- a/Tasks/AzureAppServiceSettingsV1/Strings/resources.resjson/en-US/resources.resjson +++ b/Tasks/AzureAppServiceSettingsV1/Strings/resources.resjson/en-US/resources.resjson @@ -26,7 +26,7 @@ "loc.messages.UpdatedAppServiceConfigurationSettings": "Updated App Service Configuration settings.", "loc.messages.UpdatedAppServiceApplicationSettings": "Updated App Service Application settings and Kudu Application settings.", "loc.messages.UpdatingAppServiceConnectionStrings": "Updating App Service Connection Strings. Data: %s", - "loc.messages.UpdatedAppServiceConnectionStrings": "Updated App Service Connection Strings. Data: %s", + "loc.messages.UpdatedAppServiceConnectionStrings": "Updated App Service Connection Strings.", "loc.messages.FailedToUpdateAppServiceApplicationSettings": "Failed to update App service '%s' application settings. Error: %s", "loc.messages.FailedToUpdateAppServiceConfigSlotSettings": "Failed to update App service '%s' Configuration Slot Settings. Error: %s", "loc.messages.FailedToUpdateAppServiceConnectionStrings": "Failed to update App service '%s' Connection Strings. Error: %s", diff --git a/Tasks/AzureAppServiceSettingsV1/task.json b/Tasks/AzureAppServiceSettingsV1/task.json index 13cf44365cda..e0848656ce9c 100644 --- a/Tasks/AzureAppServiceSettingsV1/task.json +++ b/Tasks/AzureAppServiceSettingsV1/task.json @@ -18,7 +18,7 @@ "version": { "Major": 1, "Minor": 160, - "Patch": 1 + "Patch": 2 }, "preview": "true", "minimumAgentVersion": "2.104.1", @@ -157,7 +157,7 @@ "UpdatedAppServiceConfigurationSettings": "Updated App Service Configuration settings.", "UpdatedAppServiceApplicationSettings": "Updated App Service Application settings and Kudu Application settings.", "UpdatingAppServiceConnectionStrings" : "Updating App Service Connection Strings. Data: %s", - "UpdatedAppServiceConnectionStrings" : "Updated App Service Connection Strings. Data: %s", + "UpdatedAppServiceConnectionStrings" : "Updated App Service Connection Strings.", "FailedToUpdateAppServiceApplicationSettings": "Failed to update App service '%s' application settings. Error: %s", "FailedToUpdateAppServiceConfigSlotSettings" : "Failed to update App service '%s' Configuration Slot Settings. Error: %s", "FailedToUpdateAppServiceConnectionStrings": "Failed to update App service '%s' Connection Strings. Error: %s", diff --git a/Tasks/AzureAppServiceSettingsV1/task.loc.json b/Tasks/AzureAppServiceSettingsV1/task.loc.json index df41b88c8b48..cdffd8a13a5c 100644 --- a/Tasks/AzureAppServiceSettingsV1/task.loc.json +++ b/Tasks/AzureAppServiceSettingsV1/task.loc.json @@ -18,7 +18,7 @@ "version": { "Major": 1, "Minor": 160, - "Patch": 1 + "Patch": 2 }, "preview": "true", "minimumAgentVersion": "2.104.1", diff --git a/Tasks/BashV3/Tests/L0.ts b/Tasks/BashV3/Tests/L0.ts index 85513d500b6b..0c1f3828935b 100644 --- a/Tasks/BashV3/Tests/L0.ts +++ b/Tasks/BashV3/Tests/L0.ts @@ -20,6 +20,7 @@ describe('Bash Suite', function () { it('Runs an inline script correctly', (done: MochaDone) => { this.timeout(5000); + delete process.env['AZP_BASHV3_OLD_SOURCE_BEHAVIOR']; let tp: string = path.join(__dirname, 'L0Inline.js'); let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); @@ -35,6 +36,30 @@ describe('Bash Suite', function () { it('Runs a checked in script correctly', (done: MochaDone) => { this.timeout(5000); + delete process.env['AZP_BASHV3_OLD_SOURCE_BEHAVIOR']; + let tp: string = path.join(__dirname, 'L0External.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.succeeded, 'Bash should have succeeded.'); + assert(tr.stderr.length === 0, 'Bash should not have written to stderr'); + if (process.platform === 'win32') { + // This is different on windows because we change the script name to make sure the normalization call is happening. + assert(tr.stdout.indexOf(`Writing bash 'temp/path/script' to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); + } else { + assert(tr.stdout.indexOf(`Writing bash 'path/to/script' to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); + } + + assert(tr.stdout.indexOf('my script output') > 0,'Bash should have correctly run the script'); + }, tr, done); + }); + + it('Runs a checked in script correctly when using the old behavior', (done: MochaDone) => { + this.timeout(5000); + + process.env['AZP_BASHV3_OLD_SOURCE_BEHAVIOR'] = "true"; let tp: string = path.join(__dirname, 'L0External.js'); let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); @@ -57,6 +82,7 @@ describe('Bash Suite', function () { it('Adds arguments to the script', (done: MochaDone) => { this.timeout(5000); + delete process.env['AZP_BASHV3_OLD_SOURCE_BEHAVIOR']; let tp: string = path.join(__dirname, 'L0Args.js'); let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); @@ -67,9 +93,9 @@ describe('Bash Suite', function () { assert(tr.stderr.length === 0, 'Bash should not have written to stderr'); if (process.platform === 'win32') { // This is different on windows because we change the script name to make sure the normalization call is happening. - assert(tr.stdout.indexOf(`Writing . 'temp/path/script' myCustomArg to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); + assert(tr.stdout.indexOf(`Writing bash 'temp/path/script' myCustomArg to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); } else { - assert(tr.stdout.indexOf(`Writing . 'path/to/script' myCustomArg to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); + assert(tr.stdout.indexOf(`Writing bash 'path/to/script' myCustomArg to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); } assert(tr.stdout.indexOf('my script output') > 0,'Bash should have correctly run the script'); @@ -77,4 +103,17 @@ describe('Bash Suite', function () { console.log(tr.stdout); }); + it('Reports stderr correctly', (done: MochaDone) => { + this.timeout(5000); + + let tp: string = path.join(__dirname, 'L0StdErr.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.failed, 'Bash should have failed'); + assert(tr.stdout.indexOf('##vso[task.issue type=error;]myErrorTest') > 0, 'Bash should have correctly written myErrorTest'); + }, tr, done); + }); }); \ No newline at end of file diff --git a/Tasks/BashV3/Tests/L0Args.ts b/Tasks/BashV3/Tests/L0Args.ts index ddc13527eb0e..c9bcd46089b3 100644 --- a/Tasks/BashV3/Tests/L0Args.ts +++ b/Tasks/BashV3/Tests/L0Args.ts @@ -51,7 +51,8 @@ let a: ma.TaskLibAnswers = { 'path/to/script': { isFile() { return true; - } + }, + mode: '777' } } }; diff --git a/Tasks/BashV3/Tests/L0External.ts b/Tasks/BashV3/Tests/L0External.ts index 09eb1128354c..78f6a469ad2e 100644 --- a/Tasks/BashV3/Tests/L0External.ts +++ b/Tasks/BashV3/Tests/L0External.ts @@ -50,7 +50,8 @@ let a: ma.TaskLibAnswers = { 'path/to/script': { isFile() { return true; - } + }, + mode: '777' } } }; diff --git a/Tasks/BashV3/Tests/L0StdErr.ts b/Tasks/BashV3/Tests/L0StdErr.ts new file mode 100644 index 000000000000..93f71269b696 --- /dev/null +++ b/Tasks/BashV3/Tests/L0StdErr.ts @@ -0,0 +1,67 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'bash.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('targetType', 'inline'); +tmr.setInput('workingDirectory', '/fakecwd'); +tmr.setInput('script', `>&2 echo "myErrorTest"`); +tmr.setInput('failOnStderr', 'true'); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash --noprofile --norc -c pwd': { + "code": 0, + "stdout": "temp/path" + }, + 'path/to/bash temp/path/fileName.sh': { + "code": 0, + "stdout": "", + "stderr": "myErrorTest" + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + console.log(`Writing ${contents} to ${filePath}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid/v4', function () { + return 'fileName'; +}); + +tmr.run(); \ No newline at end of file diff --git a/Tasks/BashV3/bash.ts b/Tasks/BashV3/bash.ts index d78605f53427..96a62847409b 100644 --- a/Tasks/BashV3/bash.ts +++ b/Tasks/BashV3/bash.ts @@ -1,6 +1,5 @@ import fs = require('fs'); import path = require('path'); -import os = require('os'); import tl = require('azure-pipelines-task-lib/task'); import tr = require('azure-pipelines-task-lib/toolrunner'); var uuidV4 = require('uuid/v4'); @@ -45,8 +44,10 @@ async function run() { let input_filePath: string; let input_arguments: string; let input_script: string; + let old_source_behavior: boolean; let input_targetType: string = tl.getInput('targetType') || ''; if (input_targetType.toUpperCase() == 'FILEPATH') { + old_source_behavior = !!process.env['AZP_BASHV3_OLD_SOURCE_BEHAVIOR']; input_filePath = tl.getPathInput('filePath', /*required*/ true); if (!tl.stats(input_filePath).isFile()) { throw new Error(tl.loc('JS_InvalidFilePath', input_filePath)); @@ -72,7 +73,26 @@ async function run() { targetFilePath = input_filePath; } - contents = `. '${targetFilePath.replace("'", "'\\''")}' ${input_arguments}`.trim(); + // Choose 1 of 3 behaviors: + // If they've set old_source_behavior, source the script. This is what we used to do and needs to hang around forever for back compat reasons + // If the executable bit is set, execute the script. This is our new desired behavior. + // If the executable bit is not set, source the script and warn. The user should either make it executable or pin to the old behavior. + // See https://github.com/Microsoft/azure-pipelines-tasks/blob/master/docs/bashnote.md + if (old_source_behavior) { + contents = `. '${targetFilePath.replace("'", "'\\''")}' ${input_arguments}`.trim(); + } else { + // Check if executable bit is set + const stats: fs.Stats = tl.stats(input_filePath); + // Check file's executable bit. + if ((stats.mode & 1) > 0) { + contents = `bash '${targetFilePath.replace("'", "'\\''")}' ${input_arguments}`.trim(); + } + else { + tl.debug(`File permissions: ${stats.mode}`); + tl.warning('Executable bit is not set on target script, sourcing instead of executing. More info at https://github.com/Microsoft/azure-pipelines-tasks/blob/master/docs/bashnote.md'); + contents = `. '${targetFilePath.replace("'", "'\\''")}' ${input_arguments}`.trim(); + } + } console.log(tl.loc('JS_FormattedCommand', contents)); } else { @@ -122,9 +142,21 @@ async function run() { // Listen for stderr. let stderrFailure = false; + const aggregatedStderr: string[] = []; if (input_failOnStderr) { - bash.on('stderr', (data) => { + bash.on('stderr', (data: Buffer) => { stderrFailure = true; + // Truncate to at most 10 error messages + if (aggregatedStderr.length < 10) { + // Truncate to at most 1000 bytes + if (data.length > 1000) { + aggregatedStderr.push(`${data.toString('utf8', 0, 1000)}`); + } else { + aggregatedStderr.push(data.toString('utf8')); + } + } else if (aggregatedStderr.length === 10) { + aggregatedStderr.push('Additional writes to stderr truncated'); + } }); } @@ -142,6 +174,9 @@ async function run() { // Fail on stderr. if (stderrFailure) { tl.error(tl.loc('JS_Stderr')); + aggregatedStderr.forEach((err: string) => { + tl.error(err); + }); result = tl.TaskResult.Failed; } @@ -152,4 +187,4 @@ async function run() { } } -run(); +run(); \ No newline at end of file diff --git a/Tasks/BashV3/task.json b/Tasks/BashV3/task.json index 8a0c735a0034..afd56123f12a 100644 --- a/Tasks/BashV3/task.json +++ b/Tasks/BashV3/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 3, - "Minor": 159, - "Patch": 3 + "Minor": 163, + "Patch": 1 }, "releaseNotes": "Script task consistency. Added support for multiple lines and added support for Windows.", "minimumAgentVersion": "2.115.0", diff --git a/Tasks/BashV3/task.loc.json b/Tasks/BashV3/task.loc.json index 7322073e532a..1e9d73a6775f 100644 --- a/Tasks/BashV3/task.loc.json +++ b/Tasks/BashV3/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 3, - "Minor": 159, - "Patch": 3 + "Minor": 163, + "Patch": 1 }, "releaseNotes": "ms-resource:loc.releaseNotes", "minimumAgentVersion": "2.115.0", diff --git a/Tasks/CmdLineV2/Tests/L0.ts b/Tasks/CmdLineV2/Tests/L0.ts index ec364030fa4a..edf430acdca3 100644 --- a/Tasks/CmdLineV2/Tests/L0.ts +++ b/Tasks/CmdLineV2/Tests/L0.ts @@ -32,4 +32,18 @@ describe('Cmd Suite', function () { assert(tr.stdout.indexOf('my script output') > 0,'Cmd should have correctly run the script'); }, tr, done); }); + + it('Reports stderr correctly', (done: MochaDone) => { + this.timeout(5000); + + let tp: string = path.join(__dirname, 'L0StdErr.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.failed, 'Bash should have failed'); + assert(tr.stdout.indexOf('##vso[task.issue type=error;]myErrorTest') > 0, 'Bash should have correctly written myErrorTest'); + }, tr, done); + }); }); \ No newline at end of file diff --git a/Tasks/CmdLineV2/Tests/L0StdErr.ts b/Tasks/CmdLineV2/Tests/L0StdErr.ts new file mode 100644 index 000000000000..5c45aeeb2b5b --- /dev/null +++ b/Tasks/CmdLineV2/Tests/L0StdErr.ts @@ -0,0 +1,69 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'cmdline.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('targetType', 'inline'); +tmr.setInput('workingDirectory', '/fakecwd'); +tmr.setInput('script', `echo 'Hello world'\necho 'Goodbye world'`); +tmr.setInput('failOnStderr', 'true'); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); +tmr.setInput('script2', `echo 'Hello world'\necho 'Goodbye world'`); + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash --noprofile --norc temp\\path\\fileName.sh': { + "code": 0, + "stdout": "", + "stderr": "myErrorTest" + }, + 'path/to/bash --noprofile --norc temp/path/fileName.sh': { + "code": 0, + "stdout": "", + "stderr": "myErrorTest" + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + console.log(`Writing ${contents} to ${filePath}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid/v4', function () { + return 'fileName'; +}); + +tmr.run(); \ No newline at end of file diff --git a/Tasks/CmdLineV2/cmdline.ts b/Tasks/CmdLineV2/cmdline.ts index 94271abb9bf6..a633911e94bd 100644 --- a/Tasks/CmdLineV2/cmdline.ts +++ b/Tasks/CmdLineV2/cmdline.ts @@ -47,9 +47,21 @@ async function run() { // Listen for stderr. let stderrFailure = false; + const aggregatedStderr: string[] = []; if (failOnStderr) { - bash.on('stderr', (data) => { + bash.on('stderr', (data: Buffer) => { stderrFailure = true; + // Truncate to at most 10 error messages + if (aggregatedStderr.length < 10) { + // Truncate to at most 1000 bytes + if (data.length > 1000) { + aggregatedStderr.push(`${data.toString('utf8', 0, 1000)}`); + } else { + aggregatedStderr.push(data.toString('utf8')); + } + } else if (aggregatedStderr.length === 10) { + aggregatedStderr.push('Additional writes to stderr truncated'); + } }); } @@ -67,6 +79,9 @@ async function run() { // Fail on stderr. if (stderrFailure) { tl.error(tl.loc('JS_Stderr')); + aggregatedStderr.forEach((err: string) => { + tl.error(err); + }); result = tl.TaskResult.Failed; } diff --git a/Tasks/CmdLineV2/task.json b/Tasks/CmdLineV2/task.json index 3811fd9c05d9..a65926fc6171 100644 --- a/Tasks/CmdLineV2/task.json +++ b/Tasks/CmdLineV2/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 151, - "Patch": 2 + "Minor": 163, + "Patch": 0 }, "releaseNotes": "Script task consistency. Added support for multiple lines.", "showEnvironmentVariables": true, diff --git a/Tasks/CmdLineV2/task.loc.json b/Tasks/CmdLineV2/task.loc.json index bc0d9916845f..c3cc01227bd5 100644 --- a/Tasks/CmdLineV2/task.loc.json +++ b/Tasks/CmdLineV2/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 151, - "Patch": 2 + "Minor": 163, + "Patch": 0 }, "releaseNotes": "ms-resource:loc.releaseNotes", "showEnvironmentVariables": true, diff --git a/Tasks/Common/MSBuildHelpers/ArgumentFunctions.ps1 b/Tasks/Common/MSBuildHelpers/ArgumentFunctions.ps1 index 298817920b4c..3d53ac10468f 100644 --- a/Tasks/Common/MSBuildHelpers/ArgumentFunctions.ps1 +++ b/Tasks/Common/MSBuildHelpers/ArgumentFunctions.ps1 @@ -40,8 +40,8 @@ function Format-MSBuildArguments { function Test-MSBuildParam ([string]$msbuildParam, [string]$parameterName) { - if ($msBuildParam -match '[<>*|:\/&%".#?]') + if ($msBuildParam -match '[<>*|:\/&%"#?]') { - throw "The value of MSBuild parameter '$parameterName' ($msBuildParam) contains an invalid character. The value of $parameterName may not contain any of the following characters: < > * | : \ / & % `" . # ?" + throw "The value of MSBuild parameter '$parameterName' ($msBuildParam) contains an invalid character. The value of $parameterName may not contain any of the following characters: < > * | : \ / & % `" # ?" } } \ No newline at end of file diff --git a/Tasks/Common/MSBuildHelpers/Tests/Format-MSBuildArguments.RejectsInvalidCharacters.ps1 b/Tasks/Common/MSBuildHelpers/Tests/Format-MSBuildArguments.RejectsInvalidCharacters.ps1 index 9a45a4fd1d47..ffb137951f8e 100644 --- a/Tasks/Common/MSBuildHelpers/Tests/Format-MSBuildArguments.RejectsInvalidCharacters.ps1 +++ b/Tasks/Common/MSBuildHelpers/Tests/Format-MSBuildArguments.RejectsInvalidCharacters.ps1 @@ -47,7 +47,7 @@ foreach ($acceptConfigurationCase in $acceptConfigurationCases) } # Arrange. -$rejectCases = 'Release; /Logger:"\\networkshare\\NotActuallyALogger.dll', '', 'ASTER*SKS', 'AMPER&AND', 'PER%ENT', '"double quotes"', 'periods.', '#HASHTAGS', 'question marks?' +$rejectCases = 'Release; /Logger:"\\networkshare\\NotActuallyALogger.dll', 'AngleelgnA', 'ASTER*SKS', 'AMPER&AND', 'PER%ENT', '"double quotes"', '#HASHTAGS', 'question marks?' # Act. foreach ($rejectCase in $rejectCases) diff --git a/Tasks/MSBuildV1/task.json b/Tasks/MSBuildV1/task.json index 01623a47b3e9..e3202e58d002 100644 --- a/Tasks/MSBuildV1/task.json +++ b/Tasks/MSBuildV1/task.json @@ -13,7 +13,7 @@ "version": { "Major": 1, "Minor": 161, - "Patch": 1 + "Patch": 2 }, "demands": [ "msbuild" diff --git a/Tasks/MSBuildV1/task.loc.json b/Tasks/MSBuildV1/task.loc.json index 81a58b64a418..69d6106cb7cf 100644 --- a/Tasks/MSBuildV1/task.loc.json +++ b/Tasks/MSBuildV1/task.loc.json @@ -13,7 +13,7 @@ "version": { "Major": 1, "Minor": 161, - "Patch": 1 + "Patch": 2 }, "demands": [ "msbuild" diff --git a/Tasks/PowerShellV2/Tests/L0.ts b/Tasks/PowerShellV2/Tests/L0.ts index c9de4df91adf..e8b8ab77145e 100644 --- a/Tasks/PowerShellV2/Tests/L0.ts +++ b/Tasks/PowerShellV2/Tests/L0.ts @@ -66,4 +66,17 @@ describe('PowerShell Suite', function () { }, tr, done); }); + it('Reports stderr correctly', (done: MochaDone) => { + this.timeout(5000); + + let tp: string = path.join(__dirname, 'L0StdErr.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.failed, 'Bash should have failed'); + assert(tr.stdout.indexOf('##vso[task.issue type=error;]myErrorTest') > 0, 'Bash should have correctly written myErrorTest'); + }, tr, done); + }); }); \ No newline at end of file diff --git a/Tasks/PowerShellV2/Tests/L0StdErr.ts b/Tasks/PowerShellV2/Tests/L0StdErr.ts new file mode 100644 index 000000000000..240158de4ad8 --- /dev/null +++ b/Tasks/PowerShellV2/Tests/L0StdErr.ts @@ -0,0 +1,81 @@ +import ma = require('vsts-task-lib/mock-answer'); +import tmrm = require('vsts-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'powershell.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('targetType', 'inline'); +tmr.setInput('script', 'Write-Host "my script output"'); +tmr.setInput('workingDirectory', '/fakecwd'); +tmr.setInput('ignoreLASTEXITCODE', 'true'); +tmr.setInput('failOnStderr', 'true'); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('vsts-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('vsts-task-lib/mock-task', tlClone); + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/powershell': true, + 'temp/path': true + }, + 'which': { + 'powershell': 'path/to/powershell' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/powershell --noprofile --norc -c pwd': { + "code": 0, + "stdout": "temp/path" + }, + "path/to/powershell -NoLogo -NoProfile -NonInteractive -Command . 'temp\\path\\fileName.ps1'": { + "code": 0, + "stdout": "", + "stderr": "myErrorTest" + }, + "path/to/powershell -NoLogo -NoProfile -NonInteractive -Command . 'temp/path/fileName.ps1'": { + "code": 0, + "stdout": "", + "stderr": "myErrorTest" + } + }, + 'stats': { + 'path/to/script.ps1': { + isFile() { + return true; + } + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFile = function(filePath, contents, options) { + // Normalize to linux paths for logs we check + console.log(`Writing ${contents} to ${filePath.replace(/\\/g, '/')}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid/v4', function () { + return 'fileName'; +}); + +tmr.run(); \ No newline at end of file diff --git a/Tasks/PowerShellV2/powershell.ts b/Tasks/PowerShellV2/powershell.ts index 894f64e135e8..613a846d7957 100644 --- a/Tasks/PowerShellV2/powershell.ts +++ b/Tasks/PowerShellV2/powershell.ts @@ -96,9 +96,21 @@ async function run() { // Listen for stderr. let stderrFailure = false; + const aggregatedStderr: string[] = []; if (input_failOnStderr) { - powershell.on('stderr', (data) => { + powershell.on('stderr', (data: Buffer) => { stderrFailure = true; + // Truncate to at most 10 error messages + if (aggregatedStderr.length < 10) { + // Truncate to at most 1000 bytes + if (data.length > 1000) { + aggregatedStderr.push(`${data.toString('utf8', 0, 1000)}`); + } else { + aggregatedStderr.push(data.toString('utf8')); + } + } else if (aggregatedStderr.length === 10) { + aggregatedStderr.push('Additional writes to stderr truncated'); + } }); } @@ -113,6 +125,9 @@ async function run() { // Fail on stderr. if (stderrFailure) { tl.setResult(tl.TaskResult.Failed, tl.loc('JS_Stderr')); + aggregatedStderr.forEach((err: string) => { + tl.error(err); + }); } } catch (err) { diff --git a/Tasks/PowerShellV2/task.json b/Tasks/PowerShellV2/task.json index ac025d73dba0..512d4f05e34d 100644 --- a/Tasks/PowerShellV2/task.json +++ b/Tasks/PowerShellV2/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 151, - "Patch": 2 + "Minor": 163, + "Patch": 0 }, "releaseNotes": "Script task consistency. Added support for macOS and Linux.", "minimumAgentVersion": "2.115.0", diff --git a/Tasks/PowerShellV2/task.loc.json b/Tasks/PowerShellV2/task.loc.json index ee934a36ff0d..96b413c57d22 100644 --- a/Tasks/PowerShellV2/task.loc.json +++ b/Tasks/PowerShellV2/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 151, - "Patch": 2 + "Minor": 163, + "Patch": 0 }, "releaseNotes": "ms-resource:loc.releaseNotes", "minimumAgentVersion": "2.115.0", diff --git a/Tasks/PublishTestResultsV2/make.json b/Tasks/PublishTestResultsV2/make.json index cb5408d910f9..953414bacdf1 100644 --- a/Tasks/PublishTestResultsV2/make.json +++ b/Tasks/PublishTestResultsV2/make.json @@ -2,7 +2,7 @@ "externals": { "archivePackages": [ { - "url": "https://publishtestresults.blob.core.windows.net/publishtestresults/11023201/PublishTestResults.zip", + "url": "https://publishtestresults.blob.core.windows.net/publishtestresults/11108202/PublishTestResults.zip", "dest": "./" } ] diff --git a/Tasks/PublishTestResultsV2/publishtestresults.ts b/Tasks/PublishTestResultsV2/publishtestresults.ts index 4d7af573c7db..fb67842b1f6a 100644 --- a/Tasks/PublishTestResultsV2/publishtestresults.ts +++ b/Tasks/PublishTestResultsV2/publishtestresults.ts @@ -1,4 +1,6 @@ import * as path from 'path'; +import * as fs from 'fs'; +import * as semver from "semver" import * as publishTestResultsTool from './publishtestresultstool'; import * as tl from 'azure-pipelines-task-lib/task'; import * as tr from 'azure-pipelines-task-lib/toolrunner'; @@ -147,12 +149,17 @@ async function run() { testRunTitle, publishRunAttachments, TESTRUN_SYSTEM); - } - else if(exitCode == 40000){ + } else if (exitCode === 40000) { // The exe returns with exit code: 40000 if there are test failures found and failTaskOnFailedTests is true ci.addToConsolidatedCi('failedTestsInRun', true); tl.setResult(tl.TaskResult.Failed, tl.loc('ErrorFailTaskOnFailedTests')); } + + if (exitCode !== 20000) { + // Doing it only for test results published using TestResultPublisher tool. + // For other publishes, publishing to evidence store happens as part of results.publish command itself. + readAndPublishTestRunSummaryToEvidenceStore(testRunner); + } } else { publish(testRunner, matchingTestResultsFiles, forceMerge ? true.toString() : mergeResults, @@ -165,11 +172,37 @@ async function run() { } } tl.setResult(tl.TaskResult.Succeeded, ''); - } catch (err) { + } catch (err) { tl.setResult(tl.TaskResult.Failed, err); } finally { ci.fireConsolidatedCi(); } } +function readAndPublishTestRunSummaryToEvidenceStore(testRunner: string) { + try { + const agentVersion = tl.getVariable('Agent.Version'); + if(semver.lt(agentVersion, "2.162.1")) { + throw "Required agent version greater than or equal to 2.162.0"; + } + + var tempPath = tl.getVariable('Agent.TempDirectory'); + var testRunSummaryPath = path.join(tempPath, "PTR_TEST_RUNSUMMARY.json"); + + var testRunSummary = fs.readFileSync(testRunSummaryPath, 'utf-8'); + + var properties = <{ [key: string]: string }>{}; + + properties['name'] = "PublishTestResults"; + properties['testrunner'] = testRunner; + properties['testrunsummary'] = testRunSummary; + properties['description'] = "Test Results published from Publish Test Results tool"; + + tl.command('results.publishtoevidencestore', properties, ''); + } catch (error) { + tl.debug(`Unable to publish the test run summary to evidencestore, error details:${error}`); + } + +} + run(); diff --git a/Tasks/PublishTestResultsV2/publishtestresultstool.ts b/Tasks/PublishTestResultsV2/publishtestresultstool.ts index 9d45d5e470d3..fd607f0e155f 100644 --- a/Tasks/PublishTestResultsV2/publishtestresultstool.ts +++ b/Tasks/PublishTestResultsV2/publishtestresultstool.ts @@ -119,6 +119,7 @@ export class TestResultsPublisher { envVars = this.addToProcessEnvVars(envVars, 'jobname', tl.getVariable('System.JobName')); envVars = this.addToProcessEnvVars(envVars, 'jobattempt', tl.getVariable('System.JobAttempt')); envVars = this.addToProcessEnvVars(envVars, 'jobidentifier', tl.getVariable('System.JobIdentifier')); + envVars = this.addToProcessEnvVars(envVars, 'agenttempdirectory', tl.getVariable('Agent.TempDirectory')); // Setting proxy details envVars = this.addToProcessEnvVars(envVars, "proxyurl", tl.getVariable('agent.proxyurl')); diff --git a/Tasks/PublishTestResultsV2/task.json b/Tasks/PublishTestResultsV2/task.json index cee7e150f9ba..b5af19a646b8 100644 --- a/Tasks/PublishTestResultsV2/task.json +++ b/Tasks/PublishTestResultsV2/task.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 162, - "Patch": 0 + "Minor": 163, + "Patch": 1 }, "demands": [], "releaseNotes": "
  • NUnit3 support
  • Support for Minimatch files pattern
", diff --git a/Tasks/PublishTestResultsV2/task.loc.json b/Tasks/PublishTestResultsV2/task.loc.json index ef711f77a2b5..286d9f370385 100644 --- a/Tasks/PublishTestResultsV2/task.loc.json +++ b/Tasks/PublishTestResultsV2/task.loc.json @@ -13,8 +13,8 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 162, - "Patch": 0 + "Minor": 163, + "Patch": 1 }, "demands": [], "releaseNotes": "ms-resource:loc.releaseNotes", diff --git a/Tasks/VSBuildV1/task.json b/Tasks/VSBuildV1/task.json index d0dcf7e8c96a..5042a81daf95 100644 --- a/Tasks/VSBuildV1/task.json +++ b/Tasks/VSBuildV1/task.json @@ -13,7 +13,7 @@ "version": { "Major": 1, "Minor": 161, - "Patch": 1 + "Patch": 2 }, "demands": [ "msbuild", diff --git a/Tasks/VSBuildV1/task.loc.json b/Tasks/VSBuildV1/task.loc.json index a1704f5c0650..20df29460203 100644 --- a/Tasks/VSBuildV1/task.loc.json +++ b/Tasks/VSBuildV1/task.loc.json @@ -13,7 +13,7 @@ "version": { "Major": 1, "Minor": 161, - "Patch": 1 + "Patch": 2 }, "demands": [ "msbuild", diff --git a/Tasks/VsTestV2/make.json b/Tasks/VsTestV2/make.json index fc101c5ce66d..4c3c75a6652a 100644 --- a/Tasks/VsTestV2/make.json +++ b/Tasks/VsTestV2/make.json @@ -6,7 +6,7 @@ "dest": "./" }, { - "url": "https://testexecution.blob.core.windows.net/testexecution/11022912/TestAgent.zip", + "url": "https://testexecution.blob.core.windows.net/testexecution/11089531/TestAgent.zip", "dest": "./Modules" }, { diff --git a/Tasks/VsTestV2/package-lock.json b/Tasks/VsTestV2/package-lock.json index b9e0b7b90350..6cb915be6825 100644 --- a/Tasks/VsTestV2/package-lock.json +++ b/Tasks/VsTestV2/package-lock.json @@ -18,10 +18,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "asn1": { @@ -29,7 +29,7 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": "~2.1.0" } }, "assert-plus": { @@ -58,11 +58,11 @@ "integrity": "sha512-PR8oap9z2j+o455W3PwAfB4SX1p4GdJc9OHQaQV0V+iQS1IBY6dVgcNSQMkHAXb0V1bbuLOFBLanXPe5eSgGTQ==", "requires": { "minimatch": "3.0.4", - "mockery": "1.7.0", - "q": "1.5.1", - "semver": "5.6.0", - "shelljs": "0.3.0", - "uuid": "3.1.0" + "mockery": "^1.7.0", + "q": "^1.1.2", + "semver": "^5.1.0", + "shelljs": "^0.3.0", + "uuid": "^3.0.1" } }, "balanced-match": { @@ -75,7 +75,7 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "brace-expansion": { @@ -83,7 +83,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -102,7 +102,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "concat-map": { @@ -120,7 +120,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "debug": { @@ -142,8 +142,8 @@ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "requires": { - "jsbn": "0.1.1", - "safer-buffer": "2.1.2" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "extend": { @@ -176,9 +176,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.7", - "mime-types": "2.1.21" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, "getpass": { @@ -186,7 +186,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "har-schema": { @@ -199,8 +199,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "http-signature": { @@ -208,9 +208,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.16.0" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "if-async": { @@ -235,7 +235,7 @@ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "requires": { - "unc-path-regex": "0.1.2" + "unc-path-regex": "^0.1.2" } }, "isarray": { @@ -295,7 +295,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", "requires": { - "mime-db": "1.37.0" + "mime-db": "~1.37.0" } }, "minimatch": { @@ -303,7 +303,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "mockery": { @@ -348,10 +348,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "optional": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "regedit": { @@ -360,10 +360,10 @@ "integrity": "sha1-yZszMCqKuuDjIhfqSPYXZdTk14k=", "optional": true, "requires": { - "debug": "2.6.9", - "if-async": "3.7.4", + "debug": "^2.1.1", + "if-async": "^3.7.4", "stream-slicer": "0.0.6", - "through2": "0.6.5" + "through2": "^0.6.3" } }, "request": { @@ -371,26 +371,26 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.8.0", - "caseless": "0.12.0", - "combined-stream": "1.0.7", - "extend": "3.0.2", - "forever-agent": "0.6.1", - "form-data": "2.3.3", - "har-validator": "5.0.3", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.21", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" }, "dependencies": { "performance-now": { @@ -430,15 +430,15 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.0.tgz", "integrity": "sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ==", "requires": { - "asn1": "0.2.4", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.2", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.2", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" } }, "stream-slicer": { @@ -464,8 +464,8 @@ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "optional": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } }, "tough-cookie": { @@ -473,7 +473,7 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tunnel": { @@ -486,7 +486,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -514,9 +514,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "vso-node-api": { @@ -524,9 +524,9 @@ "resolved": "https://registry.npmjs.org/vso-node-api/-/vso-node-api-6.0.4-preview.tgz", "integrity": "sha1-TqD5hSzRXIU/4yMBkHDuu6dZLcc=", "requires": { - "q": "1.5.1", + "q": "^1.0.1", "tunnel": "0.0.4", - "underscore": "1.9.1" + "underscore": "^1.8.3" } }, "xml2js": { @@ -534,8 +534,8 @@ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.16.tgz", "integrity": "sha1-+C/M0vlUDX4Km12sFj50cRlcnbM=", "requires": { - "sax": "1.2.4", - "xmlbuilder": "4.2.1" + "sax": ">=0.6.0", + "xmlbuilder": "^4.1.0" } }, "xmlbuilder": { @@ -543,7 +543,7 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", "requires": { - "lodash": "4.17.11" + "lodash": "^4.0.0" } }, "xtend": { diff --git a/Tasks/VsTestV2/task.json b/Tasks/VsTestV2/task.json index 19bb6fc84211..4a64c014fa00 100644 --- a/Tasks/VsTestV2/task.json +++ b/Tasks/VsTestV2/task.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 162, - "Patch": 5 + "Minor": 163, + "Patch": 0 }, "demands": [ "vstest" diff --git a/Tasks/VsTestV2/task.loc.json b/Tasks/VsTestV2/task.loc.json index 243a3827c8c4..553e1b81942e 100644 --- a/Tasks/VsTestV2/task.loc.json +++ b/Tasks/VsTestV2/task.loc.json @@ -17,8 +17,8 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 162, - "Patch": 5 + "Minor": 163, + "Patch": 0 }, "demands": [ "vstest" diff --git a/Tasks/XamarinAndroidV1/task.json b/Tasks/XamarinAndroidV1/task.json index eef260cfa0ab..ae7270f0afdf 100644 --- a/Tasks/XamarinAndroidV1/task.json +++ b/Tasks/XamarinAndroidV1/task.json @@ -13,7 +13,7 @@ "version": { "Major": 1, "Minor": 161, - "Patch": 0 + "Patch": 1 }, "demands": [ "MSBuild", diff --git a/Tasks/XamarinAndroidV1/task.loc.json b/Tasks/XamarinAndroidV1/task.loc.json index c83728e34d3d..ec506ba729f8 100644 --- a/Tasks/XamarinAndroidV1/task.loc.json +++ b/Tasks/XamarinAndroidV1/task.loc.json @@ -12,8 +12,8 @@ "author": "Microsoft Corporation", "version": { "Major": 1, - "Minor": 160, - "Patch": 0 + "Minor": 161, + "Patch": 1 }, "demands": [ "MSBuild", diff --git a/Tasks/XamariniOSV2/task.json b/Tasks/XamariniOSV2/task.json index 0bac20d74a23..560bf18af4da 100644 --- a/Tasks/XamariniOSV2/task.json +++ b/Tasks/XamariniOSV2/task.json @@ -13,7 +13,7 @@ "version": { "Major": 2, "Minor": 161, - "Patch": 0 + "Patch": 1 }, "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`.", "demands": [ diff --git a/Tasks/XamariniOSV2/task.loc.json b/Tasks/XamariniOSV2/task.loc.json index 6241b0465aa3..aa839f6f2750 100644 --- a/Tasks/XamariniOSV2/task.loc.json +++ b/Tasks/XamariniOSV2/task.loc.json @@ -12,8 +12,8 @@ "author": "Microsoft Corporation", "version": { "Major": 2, - "Minor": 160, - "Patch": 0 + "Minor": 161, + "Patch": 1 }, "releaseNotes": "ms-resource:loc.releaseNotes", "demands": [