azure-pipelines-task-lib 4.5.0 → 4.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Strings/resources.resjson/en-US/resources.resjson +2 -1
- package/ThirdPartyNotice.txt +5 -3
- package/lib.json +2 -1
- package/mock-answer.d.ts +3 -0
- package/mock-task.d.ts +1 -0
- package/mock-task.js +5 -1
- package/mock-test.d.ts +7 -1
- package/mock-test.js +288 -147
- package/package.json +4 -2
- package/task.d.ts +5 -0
- package/task.js +18 -1
|
@@ -31,5 +31,6 @@
|
|
|
31
31
|
"loc.messages.LIB_UseFirstGlobMatch": "Multiple workspace matches. using first.",
|
|
32
32
|
"loc.messages.LIB_MergeTestResultNotSupported": "Merging test results from multiple files to one test run is not supported on this version of build agent for OSX/Linux, each test result file will be published as a separate test run in VSO/TFS.",
|
|
33
33
|
"loc.messages.LIB_PlatformNotSupported": "Platform not supported: %s",
|
|
34
|
-
"loc.messages.LIB_CopyFileFailed": "Error while copying the file. Attempts left: %s"
|
|
34
|
+
"loc.messages.LIB_CopyFileFailed": "Error while copying the file. Attempts left: %s",
|
|
35
|
+
"loc.messages.LIB_UndefinedNodeVersion": "Node version is undefined."
|
|
35
36
|
}
|
package/ThirdPartyNotice.txt
CHANGED
|
@@ -36,7 +36,7 @@ This Azure Pipelines extension (azure-pipelines-task-lib) is based on or incorpo
|
|
|
36
36
|
30. semver (git+https://github.com/npm/node-semver.git)
|
|
37
37
|
31. shelljs (git://github.com/arturadib/shelljs.git)
|
|
38
38
|
32. string_decoder (git://github.com/rvagg/string_decoder.git)
|
|
39
|
-
33.
|
|
39
|
+
33. nodejs-file-downloader (git://github.com/ibrod83/nodejs-file-downloader.git)
|
|
40
40
|
34. then-request (git+https://github.com/then/then-request.git)
|
|
41
41
|
35. typedarray (git://github.com/substack/typedarray.git)
|
|
42
42
|
36. typescript (git+https://github.com/Microsoft/TypeScript.git)
|
|
@@ -889,7 +889,8 @@ IN THE SOFTWARE.
|
|
|
889
889
|
=========================================
|
|
890
890
|
END OF string_decoder NOTICES, INFORMATION, AND LICENSE
|
|
891
891
|
|
|
892
|
-
|
|
892
|
+
|
|
893
|
+
%% nodejs-file-downloader NOTICES, INFORMATION, AND LICENSE BEGIN HERE
|
|
893
894
|
=========================================
|
|
894
895
|
Copyright (c) 2014 Forbes Lindesay
|
|
895
896
|
|
|
@@ -911,7 +912,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
911
912
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
912
913
|
THE SOFTWARE.
|
|
913
914
|
=========================================
|
|
914
|
-
END OF
|
|
915
|
+
END OF nodejs-file-downloader NOTICES, INFORMATION, AND LICENSE
|
|
916
|
+
|
|
915
917
|
|
|
916
918
|
%% then-request NOTICES, INFORMATION, AND LICENSE BEGIN HERE
|
|
917
919
|
=========================================
|
package/lib.json
CHANGED
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
"LIB_UseFirstGlobMatch": "Multiple workspace matches. using first.",
|
|
33
33
|
"LIB_MergeTestResultNotSupported": "Merging test results from multiple files to one test run is not supported on this version of build agent for OSX/Linux, each test result file will be published as a separate test run in VSO/TFS.",
|
|
34
34
|
"LIB_PlatformNotSupported": "Platform not supported: %s",
|
|
35
|
-
"LIB_CopyFileFailed": "Error while copying the file. Attempts left: %s"
|
|
35
|
+
"LIB_CopyFileFailed": "Error while copying the file. Attempts left: %s",
|
|
36
|
+
"LIB_UndefinedNodeVersion": "Node version is undefined."
|
|
36
37
|
}
|
|
37
38
|
}
|
package/mock-answer.d.ts
CHANGED
package/mock-task.d.ts
CHANGED
|
@@ -58,6 +58,7 @@ export interface FsOptions {
|
|
|
58
58
|
export declare function writeFile(file: string, data: string | Buffer, options?: string | FsOptions): void;
|
|
59
59
|
export declare function osType(): string;
|
|
60
60
|
export declare function getPlatform(): task.Platform;
|
|
61
|
+
export declare function getNodeMajorVersion(): Number;
|
|
61
62
|
export declare function getAgentMode(): task.AgentHostedMode;
|
|
62
63
|
export declare function cwd(): string;
|
|
63
64
|
export declare function cd(path: string): void;
|
package/mock-task.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getHttpCertConfiguration = exports.getHttpProxyConfiguration = exports.CodeCoverageEnabler = exports.CodeCoveragePublisher = exports.TestPublisher = exports.legacyFindFiles = exports.findMatch = exports.tool = exports.execSync = exports.execAsync = exports.exec = exports.mv = exports.rmRF = exports.find = exports.retry = exports.cp = exports.ls = exports.which = exports.resolve = exports.mkdirP = exports.checkPath = exports.popd = exports.pushd = exports.cd = exports.cwd = exports.getAgentMode = exports.getPlatform = exports.osType = exports.writeFile = exports.exist = exports.stats = exports.FsStats = exports.loc = exports.setResourcePath = exports.setAnswers = void 0;
|
|
3
|
+
exports.getHttpCertConfiguration = exports.getHttpProxyConfiguration = exports.CodeCoverageEnabler = exports.CodeCoveragePublisher = exports.TestPublisher = exports.legacyFindFiles = exports.findMatch = exports.tool = exports.execSync = exports.execAsync = exports.exec = exports.mv = exports.rmRF = exports.find = exports.retry = exports.cp = exports.ls = exports.which = exports.resolve = exports.mkdirP = exports.checkPath = exports.popd = exports.pushd = exports.cd = exports.cwd = exports.getAgentMode = exports.getNodeMajorVersion = exports.getPlatform = exports.osType = exports.writeFile = exports.exist = exports.stats = exports.FsStats = exports.loc = exports.setResourcePath = exports.setAnswers = void 0;
|
|
4
4
|
var path = require("path");
|
|
5
5
|
var task = require("./task");
|
|
6
6
|
var tcm = require("./taskcommand");
|
|
@@ -189,6 +189,10 @@ function getPlatform() {
|
|
|
189
189
|
return mock.getResponse('getPlatform', 'getPlatform', module.exports.debug);
|
|
190
190
|
}
|
|
191
191
|
exports.getPlatform = getPlatform;
|
|
192
|
+
function getNodeMajorVersion() {
|
|
193
|
+
return mock.getResponse('getNodeMajorVersion', 'getNodeMajorVersion', module.exports.debug);
|
|
194
|
+
}
|
|
195
|
+
exports.getNodeMajorVersion = getNodeMajorVersion;
|
|
192
196
|
function getAgentMode() {
|
|
193
197
|
return mock.getResponse('getAgentMode', 'getAgentMode', module.exports.debug);
|
|
194
198
|
}
|
package/mock-test.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare class MockTestRunner {
|
|
2
|
-
constructor(testPath
|
|
2
|
+
constructor(testPath?: string, taskJsonPath?: string);
|
|
3
3
|
private _testPath;
|
|
4
4
|
private _taskJsonPath;
|
|
5
5
|
nodePath: string;
|
|
@@ -10,14 +10,20 @@ export declare class MockTestRunner {
|
|
|
10
10
|
succeeded: boolean;
|
|
11
11
|
errorIssues: string[];
|
|
12
12
|
warningIssues: string[];
|
|
13
|
+
LoadAsync(testPath: string, taskJsonPath?: string): Promise<MockTestRunner>;
|
|
13
14
|
get failed(): boolean;
|
|
14
15
|
ran(cmdline: string): boolean;
|
|
15
16
|
createdErrorIssue(message: string): boolean;
|
|
16
17
|
createdWarningIssue(message: string): boolean;
|
|
17
18
|
stdOutContained(message: string): boolean;
|
|
18
19
|
stdErrContained(message: string): boolean;
|
|
20
|
+
runAsync(nodeVersion?: number): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* @deprecated This method uses library which is not prefered to use on production
|
|
23
|
+
*/
|
|
19
24
|
run(nodeVersion?: number): void;
|
|
20
25
|
private getNodePath;
|
|
26
|
+
private getNodePathSync;
|
|
21
27
|
private getNodeVersion;
|
|
22
28
|
private getTaskJsonPath;
|
|
23
29
|
private downloadNode;
|
package/mock-test.js
CHANGED
|
@@ -1,4 +1,40 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
2
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
39
|
exports.MockTestRunner = void 0;
|
|
4
40
|
var cp = require("child_process");
|
|
@@ -8,7 +44,8 @@ var os = require("os");
|
|
|
8
44
|
var path = require("path");
|
|
9
45
|
var cmdm = require("./taskcommand");
|
|
10
46
|
var shelljs = require("shelljs");
|
|
11
|
-
var
|
|
47
|
+
var deasync = require("deasync");
|
|
48
|
+
var Downloader = require("nodejs-file-downloader");
|
|
12
49
|
var COMMAND_TAG = '[command]';
|
|
13
50
|
var COMMAND_LENGTH = COMMAND_TAG.length;
|
|
14
51
|
var downloadDirectory = path.join(process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE, 'azure-pipelines-task-lib', '_download');
|
|
@@ -24,10 +61,39 @@ var MockTestRunner = /** @class */ (function () {
|
|
|
24
61
|
this.succeeded = false;
|
|
25
62
|
this.errorIssues = [];
|
|
26
63
|
this.warningIssues = [];
|
|
64
|
+
if (testPath === undefined)
|
|
65
|
+
return;
|
|
27
66
|
this._taskJsonPath = taskJsonPath || '';
|
|
28
67
|
this._testPath = testPath;
|
|
29
|
-
this.nodePath = this.
|
|
68
|
+
this.nodePath = this.getNodePathSync();
|
|
30
69
|
}
|
|
70
|
+
MockTestRunner.prototype.LoadAsync = function (testPath, taskJsonPath) {
|
|
71
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
72
|
+
var _this = this;
|
|
73
|
+
return __generator(this, function (_a) {
|
|
74
|
+
return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
|
|
75
|
+
var _a;
|
|
76
|
+
return __generator(this, function (_b) {
|
|
77
|
+
switch (_b.label) {
|
|
78
|
+
case 0:
|
|
79
|
+
if (this.nodePath != '') {
|
|
80
|
+
resolve(this);
|
|
81
|
+
return [2 /*return*/];
|
|
82
|
+
}
|
|
83
|
+
this._taskJsonPath = taskJsonPath || '';
|
|
84
|
+
this._testPath = testPath;
|
|
85
|
+
_a = this;
|
|
86
|
+
return [4 /*yield*/, this.getNodePath()];
|
|
87
|
+
case 1:
|
|
88
|
+
_a.nodePath = _b.sent();
|
|
89
|
+
resolve(this);
|
|
90
|
+
return [2 /*return*/];
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}); })];
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
};
|
|
31
97
|
Object.defineProperty(MockTestRunner.prototype, "failed", {
|
|
32
98
|
get: function () {
|
|
33
99
|
return !this.succeeded;
|
|
@@ -50,103 +116,135 @@ var MockTestRunner = /** @class */ (function () {
|
|
|
50
116
|
MockTestRunner.prototype.stdErrContained = function (message) {
|
|
51
117
|
return this.stderr.indexOf(message) > 0;
|
|
52
118
|
};
|
|
53
|
-
MockTestRunner.prototype.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
119
|
+
MockTestRunner.prototype.runAsync = function (nodeVersion) {
|
|
120
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
121
|
+
var nodePath, spawn, lines, traceFile;
|
|
122
|
+
var _this = this;
|
|
123
|
+
return __generator(this, function (_a) {
|
|
124
|
+
switch (_a.label) {
|
|
125
|
+
case 0:
|
|
126
|
+
this.cmdlines = {};
|
|
127
|
+
this.invokedToolCount = 0;
|
|
128
|
+
this.succeeded = true;
|
|
129
|
+
this.errorIssues = [];
|
|
130
|
+
this.warningIssues = [];
|
|
131
|
+
nodePath = this.nodePath;
|
|
132
|
+
if (!nodeVersion) return [3 /*break*/, 2];
|
|
133
|
+
return [4 /*yield*/, this.getNodePath(nodeVersion)];
|
|
134
|
+
case 1:
|
|
135
|
+
nodePath = _a.sent();
|
|
136
|
+
_a.label = 2;
|
|
137
|
+
case 2:
|
|
138
|
+
spawn = cp.spawnSync(nodePath, [this._testPath]);
|
|
139
|
+
// Clean environment
|
|
140
|
+
Object.keys(process.env)
|
|
141
|
+
.filter(function (key) { return (key.substr(0, 'INPUT_'.length) === 'INPUT_' ||
|
|
142
|
+
key.substr(0, 'SECRET_'.length) === 'SECRET_' ||
|
|
143
|
+
key.substr(0, 'VSTS_TASKVARIABLE_'.length) === 'VSTS_TASKVARIABLE_'); })
|
|
144
|
+
.forEach(function (key) { return delete process.env[key]; });
|
|
145
|
+
if (spawn.error) {
|
|
146
|
+
console.error('Running test failed');
|
|
147
|
+
console.error(spawn.error.message);
|
|
148
|
+
return [2 /*return*/];
|
|
149
|
+
}
|
|
150
|
+
this.stdout = spawn.stdout.toString();
|
|
151
|
+
this.stderr = spawn.stderr.toString();
|
|
152
|
+
if (process.env['TASK_TEST_TRACE']) {
|
|
153
|
+
console.log('');
|
|
154
|
+
}
|
|
155
|
+
lines = this.stdout.replace(/\r\n/g, '\n').split('\n');
|
|
156
|
+
traceFile = this._testPath + '.log';
|
|
157
|
+
lines.forEach(function (line) {
|
|
158
|
+
var ci = line.indexOf('##vso[');
|
|
159
|
+
var cmd;
|
|
160
|
+
var cmi = line.indexOf(COMMAND_TAG);
|
|
161
|
+
if (ci >= 0) {
|
|
162
|
+
cmd = cmdm.commandFromString(line.substring(ci));
|
|
163
|
+
if (cmd.command === 'task.complete' && cmd.properties['result'] === 'Failed') {
|
|
164
|
+
_this.succeeded = false;
|
|
165
|
+
}
|
|
166
|
+
if (cmd.command === 'task.issue' && cmd.properties['type'] === 'error') {
|
|
167
|
+
_this.errorIssues.push(cmd.message.trim());
|
|
168
|
+
}
|
|
169
|
+
if (cmd.command === 'task.issue' && cmd.properties['type'] === 'warning') {
|
|
170
|
+
_this.warningIssues.push(cmd.message.trim());
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else if (cmi == 0 && line.length > COMMAND_LENGTH) {
|
|
174
|
+
var cmdline = line.substr(COMMAND_LENGTH).trim();
|
|
175
|
+
_this.cmdlines[cmdline] = true;
|
|
176
|
+
_this.invokedToolCount++;
|
|
177
|
+
}
|
|
178
|
+
if (process.env['TASK_TEST_TRACE']) {
|
|
179
|
+
fs.appendFileSync(traceFile, line + os.EOL);
|
|
180
|
+
if (line && !cmd) {
|
|
181
|
+
console.log(line);
|
|
182
|
+
}
|
|
183
|
+
// don't print task.debug commands to console - too noisy.
|
|
184
|
+
// otherwise omit command details - can interfere during CI.
|
|
185
|
+
else if (cmd && cmd.command != 'task.debug') {
|
|
186
|
+
console.log(cmd.command + " details omitted");
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
if (this.stderr && process.env['TASK_TEST_TRACE']) {
|
|
191
|
+
console.log('STDERR: ' + this.stderr);
|
|
192
|
+
fs.appendFileSync(traceFile, 'STDERR: ' + this.stderr + os.EOL);
|
|
193
|
+
}
|
|
194
|
+
if (process.env['TASK_TEST_TRACE']) {
|
|
195
|
+
console.log('TRACE FILE: ' + traceFile);
|
|
196
|
+
}
|
|
197
|
+
return [2 /*return*/];
|
|
91
198
|
}
|
|
92
|
-
|
|
93
|
-
_this.errorIssues.push(cmd.message.trim());
|
|
94
|
-
}
|
|
95
|
-
if (cmd.command === 'task.issue' && cmd.properties['type'] === 'warning') {
|
|
96
|
-
_this.warningIssues.push(cmd.message.trim());
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
else if (cmi == 0 && line.length > COMMAND_LENGTH) {
|
|
100
|
-
var cmdline = line.substr(COMMAND_LENGTH).trim();
|
|
101
|
-
_this.cmdlines[cmdline] = true;
|
|
102
|
-
_this.invokedToolCount++;
|
|
103
|
-
}
|
|
104
|
-
if (process.env['TASK_TEST_TRACE']) {
|
|
105
|
-
fs.appendFileSync(traceFile, line + os.EOL);
|
|
106
|
-
if (line && !cmd) {
|
|
107
|
-
console.log(line);
|
|
108
|
-
}
|
|
109
|
-
// don't print task.debug commands to console - too noisy.
|
|
110
|
-
// otherwise omit command details - can interfere during CI.
|
|
111
|
-
else if (cmd && cmd.command != 'task.debug') {
|
|
112
|
-
console.log(cmd.command + " details omitted");
|
|
113
|
-
}
|
|
114
|
-
}
|
|
199
|
+
});
|
|
115
200
|
});
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* @deprecated This method uses library which is not prefered to use on production
|
|
204
|
+
*/
|
|
205
|
+
MockTestRunner.prototype.run = function (nodeVersion) {
|
|
206
|
+
var completeExecution = false;
|
|
207
|
+
this.runAsync(nodeVersion).then(function (t) { return completeExecution = true; });
|
|
208
|
+
deasync.loopWhile(function () { return !completeExecution; });
|
|
123
209
|
};
|
|
124
210
|
// Returns a path to node.exe with the correct version for this task (based on if its node10 or node)
|
|
125
211
|
MockTestRunner.prototype.getNodePath = function (nodeVersion) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
212
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
213
|
+
var version, downloadVersion, downloadDestination, pathToExe, result;
|
|
214
|
+
return __generator(this, function (_a) {
|
|
215
|
+
switch (_a.label) {
|
|
216
|
+
case 0:
|
|
217
|
+
version = nodeVersion || this.getNodeVersion();
|
|
218
|
+
switch (version) {
|
|
219
|
+
case 6:
|
|
220
|
+
downloadVersion = 'v6.17.1';
|
|
221
|
+
break;
|
|
222
|
+
case 10:
|
|
223
|
+
downloadVersion = 'v10.21.0';
|
|
224
|
+
break;
|
|
225
|
+
case 16:
|
|
226
|
+
downloadVersion = 'v16.13.0';
|
|
227
|
+
break;
|
|
228
|
+
default:
|
|
229
|
+
throw new Error('Invalid node version, must be 6, 10, or 16 (received ' + version + ')');
|
|
230
|
+
}
|
|
231
|
+
downloadDestination = path.join(downloadDirectory, 'node' + version);
|
|
232
|
+
pathToExe = this.getPathToNodeExe(downloadVersion, downloadDestination);
|
|
233
|
+
if (!pathToExe) return [3 /*break*/, 1];
|
|
234
|
+
return [2 /*return*/, pathToExe];
|
|
235
|
+
case 1: return [4 /*yield*/, this.downloadNode(downloadVersion, downloadDestination)];
|
|
236
|
+
case 2:
|
|
237
|
+
result = _a.sent();
|
|
238
|
+
return [2 /*return*/, result];
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
};
|
|
243
|
+
MockTestRunner.prototype.getNodePathSync = function (nodeVersion) {
|
|
244
|
+
var nodePath = '';
|
|
245
|
+
this.getNodePath(nodeVersion).then(function (t) { return nodePath = t; });
|
|
246
|
+
deasync.loopWhile(function () { return nodePath == ''; });
|
|
247
|
+
return nodePath;
|
|
150
248
|
};
|
|
151
249
|
// Determines the correct version of node to use based on the contents of the task's task.json. Defaults to Node 16.
|
|
152
250
|
MockTestRunner.prototype.getNodeVersion = function () {
|
|
@@ -201,65 +299,108 @@ var MockTestRunner = /** @class */ (function () {
|
|
|
201
299
|
};
|
|
202
300
|
// Downloads the specified node version to the download destination. Returns a path to node.exe
|
|
203
301
|
MockTestRunner.prototype.downloadNode = function (nodeVersion, downloadDestination) {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
302
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
303
|
+
var nodeUrl, downloadPath, _a, marker;
|
|
304
|
+
return __generator(this, function (_b) {
|
|
305
|
+
switch (_b.label) {
|
|
306
|
+
case 0:
|
|
307
|
+
shelljs.rm('-rf', downloadDestination);
|
|
308
|
+
nodeUrl = process.env['TASK_NODE_URL'] || 'https://nodejs.org/dist';
|
|
309
|
+
nodeUrl = nodeUrl.replace(/\/$/, ''); // ensure there is no trailing slash on the base URL
|
|
310
|
+
downloadPath = '';
|
|
311
|
+
_a = this.getPlatform();
|
|
312
|
+
switch (_a) {
|
|
313
|
+
case 'darwin': return [3 /*break*/, 1];
|
|
314
|
+
case 'linux': return [3 /*break*/, 3];
|
|
315
|
+
case 'win32': return [3 /*break*/, 5];
|
|
316
|
+
}
|
|
317
|
+
return [3 /*break*/, 8];
|
|
318
|
+
case 1: return [4 /*yield*/, this.downloadTarGz(nodeUrl + '/' + nodeVersion + '/node-' + nodeVersion + '-darwin-x64.tar.gz', downloadDestination)];
|
|
319
|
+
case 2:
|
|
320
|
+
_b.sent();
|
|
321
|
+
downloadPath = path.join(downloadDestination, 'node-' + nodeVersion + '-darwin-x64', 'bin', 'node');
|
|
322
|
+
return [3 /*break*/, 8];
|
|
323
|
+
case 3: return [4 /*yield*/, this.downloadTarGz(nodeUrl + '/' + nodeVersion + '/node-' + nodeVersion + '-linux-x64.tar.gz', downloadDestination)];
|
|
324
|
+
case 4:
|
|
325
|
+
_b.sent();
|
|
326
|
+
downloadPath = path.join(downloadDestination, 'node-' + nodeVersion + '-linux-x64', 'bin', 'node');
|
|
327
|
+
return [3 /*break*/, 8];
|
|
328
|
+
case 5: return [4 /*yield*/, this.downloadFile(nodeUrl + '/' + nodeVersion + '/win-x64/node.exe', downloadDestination, 'node.exe')];
|
|
329
|
+
case 6:
|
|
330
|
+
_b.sent();
|
|
331
|
+
return [4 /*yield*/, this.downloadFile(nodeUrl + '/' + nodeVersion + '/win-x64/node.lib', downloadDestination, 'node.lib')];
|
|
332
|
+
case 7:
|
|
333
|
+
_b.sent();
|
|
334
|
+
downloadPath = path.join(downloadDestination, 'node.exe');
|
|
335
|
+
_b.label = 8;
|
|
336
|
+
case 8:
|
|
337
|
+
marker = downloadDestination + '.completed';
|
|
338
|
+
fs.writeFileSync(marker, '');
|
|
339
|
+
return [2 /*return*/, downloadPath];
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
});
|
|
226
343
|
};
|
|
227
344
|
// Downloads file to the downloadDestination, making any necessary folders along the way.
|
|
228
345
|
MockTestRunner.prototype.downloadFile = function (url, downloadDestination, fileName) {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
346
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
347
|
+
var downloader;
|
|
348
|
+
return __generator(this, function (_a) {
|
|
349
|
+
switch (_a.label) {
|
|
350
|
+
case 0:
|
|
351
|
+
if (!url) {
|
|
352
|
+
throw new Error('Parameter "url" must be set.');
|
|
353
|
+
}
|
|
354
|
+
if (!downloadDestination) {
|
|
355
|
+
throw new Error('Parameter "downloadDestination" must be set.');
|
|
356
|
+
}
|
|
357
|
+
console.log('Downloading file:', url);
|
|
358
|
+
shelljs.mkdir('-p', downloadDestination);
|
|
359
|
+
downloader = new Downloader({
|
|
360
|
+
url: url,
|
|
361
|
+
directory: downloadDestination,
|
|
362
|
+
fileName: fileName
|
|
363
|
+
});
|
|
364
|
+
return [4 /*yield*/, downloader.download()];
|
|
365
|
+
case 1:
|
|
366
|
+
_a.sent();
|
|
367
|
+
return [2 /*return*/];
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
});
|
|
240
371
|
};
|
|
241
372
|
// Downloads tarGz to the download destination, making any necessary folders along the way.
|
|
242
373
|
MockTestRunner.prototype.downloadTarGz = function (url, downloadDestination) {
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
374
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
375
|
+
var tarGzName, originalCwd;
|
|
376
|
+
return __generator(this, function (_a) {
|
|
377
|
+
switch (_a.label) {
|
|
378
|
+
case 0:
|
|
379
|
+
if (!url) {
|
|
380
|
+
throw new Error('Parameter "url" must be set.');
|
|
381
|
+
}
|
|
382
|
+
if (!downloadDestination) {
|
|
383
|
+
throw new Error('Parameter "downloadDestination" must be set.');
|
|
384
|
+
}
|
|
385
|
+
tarGzName = 'node.tar.gz';
|
|
386
|
+
return [4 /*yield*/, this.downloadFile(url, downloadDestination, tarGzName)];
|
|
387
|
+
case 1:
|
|
388
|
+
_a.sent();
|
|
389
|
+
originalCwd = process.cwd();
|
|
390
|
+
process.chdir(downloadDestination);
|
|
391
|
+
try {
|
|
392
|
+
ncp.execSync("tar -xzf \"" + path.join(downloadDestination, tarGzName) + "\"");
|
|
393
|
+
}
|
|
394
|
+
catch (_b) {
|
|
395
|
+
throw new Error('Failed to unzip node tar.gz from ' + url);
|
|
396
|
+
}
|
|
397
|
+
finally {
|
|
398
|
+
process.chdir(originalCwd);
|
|
399
|
+
}
|
|
400
|
+
return [2 /*return*/];
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
});
|
|
263
404
|
};
|
|
264
405
|
// Checks if node is installed at downloadDestination. If it is, returns a path to node.exe, otherwise returns null.
|
|
265
406
|
MockTestRunner.prototype.getPathToNodeExe = function (nodeVersion, downloadDestination) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "azure-pipelines-task-lib",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.6.1",
|
|
4
4
|
"description": "Azure Pipelines Task SDK",
|
|
5
5
|
"main": "./task.js",
|
|
6
6
|
"typings": "./task.d.ts",
|
|
@@ -27,12 +27,14 @@
|
|
|
27
27
|
},
|
|
28
28
|
"homepage": "https://github.com/Microsoft/azure-pipelines-task-lib",
|
|
29
29
|
"dependencies": {
|
|
30
|
+
"adm-zip": "^0.5.10",
|
|
31
|
+
"deasync": "^0.1.28",
|
|
30
32
|
"minimatch": "3.0.5",
|
|
31
33
|
"mockery": "^2.1.0",
|
|
34
|
+
"nodejs-file-downloader": "^4.11.1",
|
|
32
35
|
"q": "^1.5.1",
|
|
33
36
|
"semver": "^5.1.0",
|
|
34
37
|
"shelljs": "^0.8.5",
|
|
35
|
-
"sync-request": "6.1.0",
|
|
36
38
|
"uuid": "^3.0.1"
|
|
37
39
|
},
|
|
38
40
|
"devDependencies": {
|
package/task.d.ts
CHANGED
|
@@ -325,6 +325,11 @@ export declare function osType(): string;
|
|
|
325
325
|
* @throws {Error} Platform is not supported by our agent
|
|
326
326
|
*/
|
|
327
327
|
export declare function getPlatform(): Platform;
|
|
328
|
+
/**
|
|
329
|
+
* Resolves major version of Node.js engine used by the agent.
|
|
330
|
+
* @returns {Number} Node's major version.
|
|
331
|
+
*/
|
|
332
|
+
export declare function getNodeMajorVersion(): Number;
|
|
328
333
|
/**
|
|
329
334
|
* Return hosted type of Agent
|
|
330
335
|
* @returns {AgentHostedMode}
|
package/task.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.updateReleaseName = exports.addBuildTag = exports.updateBuildNumber = exports.uploadBuildLog = exports.associateArtifact = exports.uploadArtifact = exports.logIssue = exports.logDetail = exports.setProgress = exports.setEndpoint = exports.addAttachment = exports.uploadSummary = exports.prependPath = exports.uploadFile = exports.CodeCoverageEnabler = exports.CodeCoveragePublisher = exports.TestPublisher = exports.getHttpCertConfiguration = exports.getHttpProxyConfiguration = exports.findMatch = exports.filter = exports.match = exports.tool = exports.execSync = exports.exec = exports.execAsync = exports.rmRF = exports.legacyFindFiles = exports.find = exports.retry = exports.mv = exports.cp = exports.ls = exports.which = exports.resolve = exports.mkdirP = exports.popd = exports.pushd = exports.cd = exports.checkPath = exports.cwd = exports.getAgentMode = exports.getPlatform = exports.osType = exports.writeFile = exports.exist = exports.stats = exports.debug = exports.error = exports.warning = exports.command = exports.setTaskVariable = exports.getTaskVariable = exports.getSecureFileTicket = exports.getSecureFileName = exports.getEndpointAuthorization = exports.getEndpointAuthorizationParameterRequired = exports.getEndpointAuthorizationParameter = exports.getEndpointAuthorizationSchemeRequired = exports.getEndpointAuthorizationScheme = exports.getEndpointDataParameterRequired = exports.getEndpointDataParameter = exports.getEndpointUrlRequired = exports.getEndpointUrl = exports.getPathInputRequired = exports.getPathInput = exports.filePathSupplied = exports.getDelimitedInput = exports.getBoolFeatureFlag = exports.getBoolInput = exports.getInputRequired = exports.getInput = exports.setSecret = exports.setVariable = exports.getVariables = exports.assertAgent = exports.getVariable = exports.loc = exports.setResourcePath = exports.setResult = exports.setErrStream = exports.setStdStream = exports.AgentHostedMode = exports.Platform = exports.FieldType = exports.ArtifactType = exports.IssueType = exports.TaskState = exports.TaskResult = void 0;
|
|
3
|
+
exports.updateReleaseName = exports.addBuildTag = exports.updateBuildNumber = exports.uploadBuildLog = exports.associateArtifact = exports.uploadArtifact = exports.logIssue = exports.logDetail = exports.setProgress = exports.setEndpoint = exports.addAttachment = exports.uploadSummary = exports.prependPath = exports.uploadFile = exports.CodeCoverageEnabler = exports.CodeCoveragePublisher = exports.TestPublisher = exports.getHttpCertConfiguration = exports.getHttpProxyConfiguration = exports.findMatch = exports.filter = exports.match = exports.tool = exports.execSync = exports.exec = exports.execAsync = exports.rmRF = exports.legacyFindFiles = exports.find = exports.retry = exports.mv = exports.cp = exports.ls = exports.which = exports.resolve = exports.mkdirP = exports.popd = exports.pushd = exports.cd = exports.checkPath = exports.cwd = exports.getAgentMode = exports.getNodeMajorVersion = exports.getPlatform = exports.osType = exports.writeFile = exports.exist = exports.stats = exports.debug = exports.error = exports.warning = exports.command = exports.setTaskVariable = exports.getTaskVariable = exports.getSecureFileTicket = exports.getSecureFileName = exports.getEndpointAuthorization = exports.getEndpointAuthorizationParameterRequired = exports.getEndpointAuthorizationParameter = exports.getEndpointAuthorizationSchemeRequired = exports.getEndpointAuthorizationScheme = exports.getEndpointDataParameterRequired = exports.getEndpointDataParameter = exports.getEndpointUrlRequired = exports.getEndpointUrl = exports.getPathInputRequired = exports.getPathInput = exports.filePathSupplied = exports.getDelimitedInput = exports.getBoolFeatureFlag = exports.getBoolInput = exports.getInputRequired = exports.getInput = exports.setSecret = exports.setVariable = exports.getVariables = exports.assertAgent = exports.getVariable = exports.loc = exports.setResourcePath = exports.setResult = exports.setErrStream = exports.setStdStream = exports.AgentHostedMode = exports.Platform = exports.FieldType = exports.ArtifactType = exports.IssueType = exports.TaskState = exports.TaskResult = void 0;
|
|
4
4
|
var shell = require("shelljs");
|
|
5
5
|
var childProcess = require("child_process");
|
|
6
6
|
var fs = require("fs");
|
|
@@ -616,6 +616,23 @@ function getPlatform() {
|
|
|
616
616
|
}
|
|
617
617
|
}
|
|
618
618
|
exports.getPlatform = getPlatform;
|
|
619
|
+
/**
|
|
620
|
+
* Resolves major version of Node.js engine used by the agent.
|
|
621
|
+
* @returns {Number} Node's major version.
|
|
622
|
+
*/
|
|
623
|
+
function getNodeMajorVersion() {
|
|
624
|
+
var _a;
|
|
625
|
+
var version = (_a = process === null || process === void 0 ? void 0 : process.versions) === null || _a === void 0 ? void 0 : _a.node;
|
|
626
|
+
if (!version) {
|
|
627
|
+
throw new Error(exports.loc('LIB_UndefinedNodeVersion'));
|
|
628
|
+
}
|
|
629
|
+
var parts = version.split('.').map(Number);
|
|
630
|
+
if (parts.length < 1) {
|
|
631
|
+
return NaN;
|
|
632
|
+
}
|
|
633
|
+
return parts[0];
|
|
634
|
+
}
|
|
635
|
+
exports.getNodeMajorVersion = getNodeMajorVersion;
|
|
619
636
|
/**
|
|
620
637
|
* Return hosted type of Agent
|
|
621
638
|
* @returns {AgentHostedMode}
|