Skip to content

Commit 4ee6f87

Browse files
Add task SDK token support (#1021)
Added task SDK token support; added a default value for the issue source property.
1 parent f1a07a7 commit 4ee6f87

13 files changed

+280
-11
lines changed

node/internal.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import crypto = require('crypto');
2020
export var _knownVariableMap: { [key: string]: _KnownVariableInfo; } = {};
2121

2222
export var _vault: vm.Vault;
23+
var _taskSdkToken: string;
24+
2325
//-----------------------------------------------------
2426
// Enums
2527
//-----------------------------------------------------
@@ -303,12 +305,12 @@ export function _command(command: string, properties: any, message: string) {
303305
_writeLine(taskCmd.toString());
304306
}
305307

306-
export function _warning(message: string, source?: IssueSource): void {
307-
_command('task.issue', { 'type': 'warning', 'source': source }, message);
308+
export function _warning(message: string, source: IssueSource = IssueSource.TaskInternal): void {
309+
_command('task.issue', { 'type': 'warning', 'source': source, 'token': _taskSdkToken }, message);
308310
}
309311

310-
export function _error(message: string, source?: IssueSource): void {
311-
_command('task.issue', { 'type': 'error', 'source': source }, message);
312+
export function _error(message: string, source: IssueSource = IssueSource.TaskInternal): void {
313+
_command('task.issue', { 'type': 'error', 'source': source, 'token': _taskSdkToken }, message);
312314
}
313315

314316
export function _debug(message: string): void {
@@ -754,6 +756,10 @@ export function _loadData(): void {
754756
}
755757
_debug('loaded ' + loaded);
756758

759+
let token = process.env["TASK_SDK_COMMAND_TOKEN"];
760+
delete process.env["TASK_SDK_COMMAND_TOKEN"];
761+
_taskSdkToken = token ? String(token) : "";
762+
757763
// store public variable metadata
758764
let names: string[];
759765
try {

node/package-lock.json

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "azure-pipelines-task-lib",
3-
"version": "4.9.1",
3+
"version": "4.10.0",
44
"description": "Azure Pipelines Task SDK",
55
"main": "./task.js",
66
"typings": "./task.d.ts",

node/test/taskissuecommandtests.ts

+180
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
// Copyright (c) Microsoft. All rights reserved.
2+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
3+
4+
import assert = require('assert');
5+
import * as testutil from './testutil';
6+
import * as tl from '../_build/task';
7+
import { IssueSource, _loadData } from '../_build/internal';
8+
9+
10+
describe('Task Issue command test without token', function () {
11+
12+
before(function (done) {
13+
try {
14+
testutil.initialize();
15+
} catch (err) {
16+
assert.fail('Failed to load task lib: ' + err.message);
17+
}
18+
19+
done();
20+
});
21+
22+
after(function (done) {
23+
done();
24+
});
25+
26+
it('adds issue sources for task.issue messages', function (done) {
27+
this.timeout(1000);
28+
29+
var stdStream = testutil.createStringStream();
30+
tl.setStdStream(stdStream);
31+
tl.error("Test error", IssueSource.CustomerScript)
32+
tl.warning("Test warning", IssueSource.TaskInternal)
33+
34+
var expected = testutil.buildOutput(
35+
['##vso[task.issue type=error;source=CustomerScript;]Test error',
36+
'##vso[task.issue type=warning;source=TaskInternal;]Test warning']);
37+
38+
var output = stdStream.getContents();
39+
40+
assert.equal(output, expected);
41+
42+
done();
43+
})
44+
45+
it('adds the default "TaskInternal" source for task.issue command', function (done) {
46+
this.timeout(1000);
47+
48+
var stdStream = testutil.createStringStream();
49+
tl.setStdStream(stdStream);
50+
tl.error("Test error");
51+
tl.warning("Test warning");
52+
53+
var expected = testutil.buildOutput(
54+
['##vso[task.issue type=error;source=TaskInternal;]Test error',
55+
'##vso[task.issue type=warning;source=TaskInternal;]Test warning']);
56+
57+
var output = stdStream.getContents();
58+
59+
assert.equal(output, expected);
60+
61+
done();
62+
})
63+
64+
it('adds the default "TaskInternal" source for the setResult', function (done) {
65+
this.timeout(1000);
66+
67+
var stdStream = testutil.createStringStream();
68+
tl.setStdStream(stdStream);
69+
tl.setResult(tl.TaskResult.Failed, 'failed msg');
70+
71+
var expected = testutil.buildOutput(
72+
['##vso[task.debug]task result: Failed',
73+
'##vso[task.issue type=error;source=TaskInternal;]failed msg',
74+
'##vso[task.complete result=Failed;]failed msg']);
75+
76+
var output = stdStream.getContents();
77+
78+
assert.equal(output, expected);
79+
80+
done();
81+
})
82+
});
83+
84+
describe('Task Issue command test with token', function () {
85+
86+
before(function (done) {
87+
try {
88+
testutil.initialize();
89+
} catch (err) {
90+
assert.fail('Failed to load task lib: ' + err.message);
91+
}
92+
93+
process.env['TASK_SDK_COMMAND_TOKEN'] = 'test_token123';
94+
_loadData();
95+
done();
96+
});
97+
98+
after(function (done) {
99+
delete process.env['TASK_SDK_COMMAND_TOKEN'];
100+
_loadData();
101+
done();
102+
});
103+
104+
it('removes the token from env var', function (done) {
105+
this.timeout(1000);
106+
107+
assert.equal(process.env['TASK_SDK_COMMAND_TOKEN'], undefined);
108+
109+
done();
110+
})
111+
112+
it('doesn\'t provide the token using task variables', function (done) {
113+
this.timeout(1000);
114+
115+
process.env['AGENT_VERSION'] = '2.115.0'
116+
let variable = tl.getVariable('TASK_SDK_COMMAND_TOKEN');
117+
let taskVariable = tl.getTaskVariable('TASK_SDK_COMMAND_TOKEN');
118+
assert.equal(variable, undefined);
119+
assert.equal(taskVariable, undefined);
120+
121+
done();
122+
})
123+
124+
it('adds the token for task.issue messages', function (done) {
125+
this.timeout(1000);
126+
127+
var stdStream = testutil.createStringStream();
128+
tl.setStdStream(stdStream);
129+
tl.error("Test error", IssueSource.CustomerScript)
130+
tl.warning("Test warning", IssueSource.TaskInternal)
131+
132+
var expected = testutil.buildOutput(
133+
['##vso[task.issue type=error;source=CustomerScript;token=test_token123;]Test error',
134+
'##vso[task.issue type=warning;source=TaskInternal;token=test_token123;]Test warning']);
135+
136+
var output = stdStream.getContents();
137+
138+
assert.equal(output, expected);
139+
140+
done();
141+
})
142+
143+
it('adds the default "TaskInternal" source for task.issue command', function (done) {
144+
this.timeout(1000);
145+
146+
var stdStream = testutil.createStringStream();
147+
tl.setStdStream(stdStream);
148+
tl.error("Test error");
149+
tl.warning("Test warning");
150+
151+
var expected = testutil.buildOutput(
152+
['##vso[task.issue type=error;source=TaskInternal;token=test_token123;]Test error',
153+
'##vso[task.issue type=warning;source=TaskInternal;token=test_token123;]Test warning']);
154+
155+
var output = stdStream.getContents();
156+
157+
assert.equal(output, expected);
158+
159+
done();
160+
})
161+
162+
it('adds the default "TaskInternal" source for the setResult', function (done) {
163+
this.timeout(1000);
164+
165+
var stdStream = testutil.createStringStream();
166+
tl.setStdStream(stdStream);
167+
tl.setResult(tl.TaskResult.Failed, 'failed msg');
168+
169+
var expected = testutil.buildOutput(
170+
['##vso[task.debug]task result: Failed',
171+
'##vso[task.issue type=error;source=TaskInternal;token=test_token123;]failed msg',
172+
'##vso[task.complete result=Failed;]failed msg']);
173+
174+
var output = stdStream.getContents();
175+
176+
assert.equal(output, expected);
177+
178+
done();
179+
})
180+
});

node/test/tsconfig.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"gethttpproxytests.ts",
2929
"mockertests.ts",
3030
"fakeModules/fakemodule1.ts",
31-
"fakeModules/fakemodule2.ts"
31+
"fakeModules/fakemodule2.ts",
32+
"taskissuecommandtests.ts"
3233
]
3334
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
[CmdletBinding()]
2+
param()
3+
4+
# Arrange.
5+
. $PSScriptRoot\..\lib\Initialize-Test.ps1
6+
Invoke-VstsTaskScript -ScriptBlock {
7+
$vstsModule = Get-Module -Name VstsTaskSdk
8+
9+
# 1
10+
$actual = & $vstsModule Write-TaskError -Message "test error" -AsOutput
11+
$expected = "##vso[task.logissue source=TaskInternal;type=error]test error"
12+
Assert-TaskIssueMessagesAreEqual $expected $actual "The default 'TastInternal' source was added for errors."
13+
14+
# 2
15+
$actual = & $vstsModule Write-TaskWarning -Message "test warning" -AsOutput
16+
$expected = "##vso[task.logissue source=TaskInternal;type=warning]test warning"
17+
Assert-TaskIssueMessagesAreEqual $expected $actual "The default 'TastInternal' source was added for warnings."
18+
19+
#3
20+
$actual = & $vstsModule Write-TaskError -Message "test error" -IssueSource $IssueSources.CustomerScript -AsOutput
21+
$expected = "##vso[task.logissue source=CustomerScript;type=error]test error"
22+
Assert-TaskIssueMessagesAreEqual $expected $actual "Adds the specified issue source for errors."
23+
24+
#4
25+
$actual = & $vstsModule Write-TaskWarning -Message "test warning" -IssueSource $IssueSources.CustomerScript -AsOutput
26+
$expected = "##vso[task.logissue source=CustomerScript;type=warning]test warning"
27+
Assert-TaskIssueMessagesAreEqual $expected $actual "Adds the specified issue source for warnings."
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
[CmdletBinding()]
2+
param()
3+
4+
$env:TASK_SDK_COMMAND_TOKEN = "test_token123"
5+
6+
# Arrange.
7+
. $PSScriptRoot\..\lib\Initialize-Test.ps1
8+
Invoke-VstsTaskScript -ScriptBlock {
9+
$vstsModule = Get-Module -Name VstsTaskSdk
10+
11+
# 1
12+
Assert-AreEqual $null $env:TASK_SDK_COMMAND_TOKEN "SDK removes the token after loading."
13+
14+
# 2
15+
$actual = & $vstsModule Get-TaskVariable -Name "TASK_SDK_COMMAND_TOKEN"
16+
Assert-AreEqual $null $actual "The token is inaccessible using task variables."
17+
18+
# 3
19+
$actual = & $vstsModule Write-TaskError -Message "test error" -AsOutput
20+
$expected = "##vso[task.logissue source=TaskInternal;type=error;token=test_token123]test error"
21+
Assert-TaskIssueMessagesAreEqual $expected $actual "The default 'TastInternal' source and the token were added for errors."
22+
23+
# 4
24+
$actual = & $vstsModule Write-TaskWarning -Message "test warning" -AsOutput
25+
$expected = "##vso[task.logissue source=TaskInternal;type=warning;token=test_token123]test warning"
26+
Assert-TaskIssueMessagesAreEqual $expected $actual "The default 'TastInternal' source and the token were added for warnings."
27+
28+
# 5
29+
$actual = & $vstsModule Write-TaskError -Message "test error" -IssueSource $IssueSources.CustomerScript -AsOutput
30+
$expected = "##vso[task.logissue source=CustomerScript;type=error;token=test_token123]test error"
31+
Assert-TaskIssueMessagesAreEqual $expected $actual "Adds the specified issue source and token for errors."
32+
33+
# 6
34+
$actual = & $vstsModule Write-TaskWarning -Message "test warning" -IssueSource $IssueSources.CustomerScript -AsOutput
35+
$expected = "##vso[task.logissue source=CustomerScript;type=warning;token=test_token123]test warning"
36+
Assert-TaskIssueMessagesAreEqual $expected $actual "Adds the specified issue source and token for warnings."
37+
}

powershell/Tests/lib/TestHelpersModule/PublicFunctions.ps1

+9
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,15 @@ function Assert-AreNotEqual {
1818
}
1919
}
2020

21+
function Assert-TaskIssueMessagesAreEqual {
22+
[CmdletBinding()]
23+
param([string]$Expected, [string]$Actual, [string]$Message)
24+
25+
if ($Expected -ne $Actual) {
26+
throw ("Assert are equal failed. Expected: '$Expected' ; Actual: '$Actual'. $Message".Trim())
27+
}
28+
}
29+
2130
function Assert-IsGreaterThan {
2231
[CmdletBinding()]
2332
param([object]$Expected, [object]$Actual, [string]$Message)

powershell/Tests/lib/TestHelpersModule/TestHelpersModule.psm1

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ param()
88
Export-ModuleMember -Verbose:$false -Function @(
99
'Assert-AreEqual'
1010
'Assert-AreNotEqual'
11+
'Assert-TaskIssueMessagesAreEqual'
1112
'Assert-IsNotNullOrEmpty'
1213
'Assert-IsNullOrEmpty'
1314
'Assert-IsGreaterThan'

powershell/VstsTaskSdk/LoggingCommandFunctions.ps1

+8-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ $script:loggingCommandEscapeMappings = @( # TODO: WHAT ABOUT "="? WHAT ABOUT "%"
88
# TODO: BUG: Escape % ???
99
# TODO: Add test to verify don't need to escape "=".
1010

11+
$taskSDKToken = $env:TASK_SDK_COMMAND_TOKEN
12+
if ($null -ne $taskSDKToken)
13+
{
14+
[System.Environment]::SetEnvironmentVariable("TASK_SDK_COMMAND_TOKEN", $null)
15+
}
16+
1117
$IssueSources = @{
1218
CustomerScript = "CustomerScript"
1319
TaskInternal = "TaskInternal"
@@ -554,7 +560,7 @@ function Write-LogIssue {
554560
[switch]$AsOutput,
555561
[AllowNull()]
556562
[ValidateSet('CustomerScript', 'TaskInternal')]
557-
[string]$IssueSource)
563+
[string]$IssueSource = $IssueSources.TaskInternal)
558564

559565
$command = Format-LoggingCommand -Area 'task' -Event 'logissue' -Data $Message -Properties @{
560566
'type' = $Type
@@ -563,6 +569,7 @@ function Write-LogIssue {
563569
'linenumber' = $LineNumber
564570
'columnnumber' = $ColumnNumber
565571
'source' = $IssueSource
572+
'token' = $taskSDKToken
566573
}
567574
if ($AsOutput) {
568575
return $command

powershell/VstsTaskSdk/VstsTaskSdk.psd1

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
PowerShellVersion = '3.0'
1010
FunctionsToExport = '*'
1111
CmdletsToExport = ''
12-
VariablesToExport = 'IssueSources'
12+
VariablesToExport = '*'
1313
AliasesToExport = ''
1414
PrivateData = @{
1515
PSData = @{

powershell/package-lock.json

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

powershell/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "0.19.0",
2+
"version": "0.20.0",
33
"private": true,
44
"scripts": {
55
"build": "node make.js build",

0 commit comments

Comments
 (0)