Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
8a7dfe6
Node Tasks Node 24 upgrade
rajmishra1997 Dec 23, 2025
5fac248
Merge branch 'master' into users/rajmishra/NodeTasks
rajmishra1997 Dec 23, 2025
5788ca5
Remove deprecated use of url.parse
rajmishra1997 Dec 29, 2025
6134b71
Merge branch 'master' into users/rajmishra/NodeTasks
rajmishra1997 Dec 29, 2025
654b45f
Merge branch 'users/rajmishra/NodeTasks' of https://github.com/micros…
rajmishra1997 Dec 29, 2025
10499b6
Merge branch 'master' into users/rajmishra/NodeTasks
rajmishra1997 Dec 31, 2025
548cf76
Tasks Update after task-lib version update
rajmishra1997 Dec 31, 2025
4d804d3
Merge branch 'master' into users/rajmishra/NodeTasks
rajmishra1997 Dec 31, 2025
5caa399
Remove NodeTaskInstaller
rajmishra1997 Dec 31, 2025
43b9354
Merge branch 'users/rajmishra/NodeTasks' of https://github.com/micros…
rajmishra1997 Dec 31, 2025
02d33c1
Remove NodeTaskInstaller
rajmishra1997 Dec 31, 2025
444ec51
L0 Tests for task NodeTaskRunnerInstaller
rajmishra1997 Dec 31, 2025
dacb111
Update task version
rajmishra1997 Dec 31, 2025
ae63ad5
Node 24 upgrade
rajmishra1997 Dec 31, 2025
089d15b
Clean up branch
rajmishra1997 Dec 31, 2025
0e56dbe
Fix Tests failure
rajmishra1997 Jan 2, 2026
9e5d490
Fix Tests failure
rajmishra1997 Jan 2, 2026
948ae95
Fix Tests failure
rajmishra1997 Jan 2, 2026
dfb8a94
Fix Tests failure
rajmishra1997 Jan 2, 2026
18700e7
Fix Tests failure
rajmishra1997 Jan 5, 2026
ce1c099
Merge branch 'master' of https://github.com/microsoft/azure-pipelines…
rajmishra1997 Jan 6, 2026
10996f7
Merge branch 'master' into users/rajmishra/NodeTaskRunnerInstallerFix
raujaiswal Jan 7, 2026
5dda14b
Update mocked node path as per node version in tests
rajmishra1997 Jan 7, 2026
53301cc
Merge branch 'users/rajmishra/NodeTaskRunnerInstallerFix' of https://…
rajmishra1997 Jan 7, 2026
91e1fd4
Merge branch 'master' into users/rajmishra/NodeTaskRunnerInstallerFix
rajmishra1997 Jan 7, 2026
0748cd1
Merge branch 'master' into users/rajmishra/NodeTaskRunnerInstallerFix
rajmishra1997 Jan 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions Tasks/NodeTaskRunnerInstallerV0/Tests/L0.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import assert = require('assert');
import path = require('path');
import * as ttm from 'azure-pipelines-task-lib/mock-test';

function runValidations(validator: () => void, tr) {
try {
validator();
}
catch (error) {
console.log("STDERR", tr.stderr);
console.log("STDOUT", tr.stdout);
throw error;
}
}

describe('NodeTaskRunnerInstaller Suite', function () {
this.timeout(60000);

it('Succeeds when installing Node 6 runner', async () => {
this.timeout(5000);

let tp: string = path.join(__dirname, 'L0InstallNode6.js');
let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);

await tr.runAsync();

runValidations(() => {
assert(tr.succeeded, 'NodeTaskRunnerInstaller should have succeeded.');
assert(tr.stderr.length === 0, 'NodeTaskRunnerInstaller should not have written to stderr');
}, tr);
});

it('Succeeds when installing Node 10 runner', async () => {
this.timeout(5000);

let tp: string = path.join(__dirname, 'L0InstallNode10.js');
let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);

await tr.runAsync();

runValidations(() => {
assert(tr.succeeded, 'NodeTaskRunnerInstaller should have succeeded.');
assert(tr.stderr.length === 0, 'NodeTaskRunnerInstaller should not have written to stderr');
}, tr);
});

it('Succeeds when installing Node 16 runner', async () => {
this.timeout(5000);

let tp: string = path.join(__dirname, 'L0InstallNode16.js');
let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);

await tr.runAsync();

runValidations(() => {
assert(tr.succeeded, 'NodeTaskRunnerInstaller should have succeeded.');
assert(tr.stderr.length === 0, 'NodeTaskRunnerInstaller should not have written to stderr');
}, tr);
});

it('Skips installation when runner already installed', async () => {
this.timeout(5000);

let tp: string = path.join(__dirname, 'L0RunnerAlreadyInstalled.js');
let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);

await tr.runAsync();

runValidations(() => {
assert(tr.succeeded, 'NodeTaskRunnerInstaller should have succeeded.');
assert(tr.stderr.length === 0, 'NodeTaskRunnerInstaller should not have written to stderr');
}, tr);
});
});
90 changes: 90 additions & 0 deletions Tasks/NodeTaskRunnerInstallerV0/Tests/L0InstallNode10.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
process.env.AGENT_HOMEDIRECTORY = '/fake/agent/home';

import ma = require('azure-pipelines-task-lib/mock-answer');
import tmrm = require('azure-pipelines-task-lib/mock-run');
import fs = require('fs');
import os = require('os');
import path = require('path');

let taskPath = path.join(__dirname, '..', 'index.js');
let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath);

tmr.setInput('runnerVersion', '10');

let a: ma.TaskLibAnswers = <ma.TaskLibAnswers>{
"assertAgent": {
"2.144.0": true
}
};
tmr.setAnswers(a);
const tl = require('azure-pipelines-task-lib/mock-task');
const tlClone = Object.assign({}, tl);
tlClone.retry = function (func: Function, args: any[], retryOptions: any): any {
return func.apply(this, args);
}
tlClone.getVariable = function (variable: string) {
if (variable.toLowerCase() === 'agent.homedirectory') {
return '/fake/agent/home';
}
if (variable.toLowerCase() === 'agent.tempdirectory') {
return '/fake/agent/temp';
}
return null;
};
tlClone.rmRF = function(path) {
console.log('Removing ' + path);
};
tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone);
tmr.registerMock('os', {
platform: () => os.platform(),
arch: () => 'x64'
});
tmr.registerMock('fs', {
existsSync: function (pathToCheck: string): boolean {
return true;
},
mkdirSync: function () { },
writeFileSync: function () { },
readdirSync: function (pathToCheck: string): string[] {
if (pathToCheck === '/fake/agent/temp') {
return ['node-v10.0.0-linux-x64'];
}
return [];
},
statSync: function () {
return { isDirectory: () => true } as any;
},
copyFileSync: function () { },
readFileSync: function (filePath: string, encoding: string) {
return JSON.stringify([]);
},
constants: fs.constants
});
tmr.registerMock('azure-pipelines-tool-lib/tool', {
cleanVersion: function (version: string) {
return '10.24.1';
},
findLocalTool: function (toolName: string, versionSpec: string, arch?: string) {
if (toolName !== 'node10') {
throw new Error('Searching for wrong tool');
}
return '';
},
downloadTool: function (url: string) {
if (url.includes('10.24.1')) {
return Promise.resolve('/tmp/node-download');
}
throw new Error('Incorrect URL');
},
extractTar: function (file: string, dest?: string) {
return Promise.resolve('/tmp/extracted-node');
},
extract7z: function (file: string, dest?: string) {
return Promise.resolve('/tmp/extracted-node');
},
cacheDir: function (sourceDir: string, tool: string, version: string, arch?: string) {
return Promise.resolve('/cache/node10/10.24.1/x64');
}
});

tmr.run();
90 changes: 90 additions & 0 deletions Tasks/NodeTaskRunnerInstallerV0/Tests/L0InstallNode16.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
process.env.AGENT_HOMEDIRECTORY = '/fake/agent/home';

import ma = require('azure-pipelines-task-lib/mock-answer');
import tmrm = require('azure-pipelines-task-lib/mock-run');
import fs = require('fs');
import os = require('os');
import path = require('path');

let taskPath = path.join(__dirname, '..', 'index.js');
let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath);

tmr.setInput('runnerVersion', '16');

let a: ma.TaskLibAnswers = <ma.TaskLibAnswers>{
"assertAgent": {
"2.144.0": true
}
};
tmr.setAnswers(a);
const tl = require('azure-pipelines-task-lib/mock-task');
const tlClone = Object.assign({}, tl);
tlClone.retry = function (func: Function, args: any[], retryOptions: any): any {
return func.apply(this, args);
}
tlClone.getVariable = function (variable: string) {
if (variable.toLowerCase() === 'agent.homedirectory') {
return '/fake/agent/home';
}
if (variable.toLowerCase() === 'agent.tempdirectory') {
return '/fake/agent/temp';
}
return null;
};
tlClone.rmRF = function(path) {
console.log('Removing ' + path);
};
tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone);
tmr.registerMock('os', {
platform: () => os.platform(),
arch: () => 'x64'
});
tmr.registerMock('fs', {
existsSync: function (pathToCheck: string): boolean {
return true;
},
mkdirSync: function () { },
writeFileSync: function () { },
readdirSync: function (pathToCheck: string): string[] {
if (pathToCheck === '/fake/agent/temp') {
return ['node-v16.0.0-linux-x64'];
}
return [];
},
statSync: function () {
return { isDirectory: () => true } as any;
},
copyFileSync: function () { },
readFileSync: function (filePath: string, encoding: string) {
return JSON.stringify([]);
},
constants: fs.constants
});
tmr.registerMock('azure-pipelines-tool-lib/tool', {
cleanVersion: function (version: string) {
return '16.20.2';
},
findLocalTool: function (toolName: string, versionSpec: string, arch?: string) {
if (toolName !== 'node16') {
throw new Error('Searching for wrong tool');
}
return '';
},
downloadTool: function (url: string) {
if (url.includes('16.20.2')) {
return Promise.resolve('/tmp/node-download');
}
throw new Error('Incorrect URL');
},
extractTar: function (file: string, dest?: string) {
return Promise.resolve('/tmp/extracted-node');
},
extract7z: function (file: string, dest?: string) {
return Promise.resolve('/tmp/extracted-node');
},
cacheDir: function (sourceDir: string, tool: string, version: string, arch?: string) {
return Promise.resolve('/cache/node16/16.20.2/x64');
}
});

tmr.run();
93 changes: 93 additions & 0 deletions Tasks/NodeTaskRunnerInstallerV0/Tests/L0InstallNode6.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
process.env.AGENT_HOMEDIRECTORY = '/fake/agent/home';

import ma = require('azure-pipelines-task-lib/mock-answer');
import tmrm = require('azure-pipelines-task-lib/mock-run');
import fs = require('fs');
import os = require('os');
import path = require('path');

let taskPath = path.join(__dirname, '..', 'index.js');
let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath);

tmr.setInput('runnerVersion', '6');

let a: ma.TaskLibAnswers = <ma.TaskLibAnswers>{
"assertAgent": {
"2.144.0": true
}
};
tmr.setAnswers(a);
const tl = require('azure-pipelines-task-lib/mock-task');
const tlClone = Object.assign({}, tl);
tlClone.retry = function (func: Function, args: any[], retryOptions: any): any {
return func.apply(this, args);
}
tlClone.getVariable = function (variable: string) {
if (variable.toLowerCase() === 'agent.homedirectory') {
return '/fake/agent/home';
}
if (variable.toLowerCase() === 'agent.tempdirectory') {
return '/fake/agent/temp';
}
return null;
};
tlClone.rmRF = function(path) {
console.log('Removing ' + path);
};
tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone);

tmr.registerMock('os', {
platform: () => os.platform(),
arch: () => 'x64'
});

tmr.registerMock('fs', {
existsSync: function (pathToCheck: string): boolean {
return true;
},
mkdirSync: function () { },
writeFileSync: function () { },
readdirSync: function (pathToCheck: string): string[] {
if (pathToCheck === '/fake/agent/temp') {
return ['node-v6.0.0-linux-x64'];
}
return [];
},
statSync: function () {
return { isDirectory: () => true } as any;
},
copyFileSync: function () { },
readFileSync: function (filePath: string, encoding: string) {
return JSON.stringify([]);
},
constants: fs.constants
});

tmr.registerMock('azure-pipelines-tool-lib/tool', {
cleanVersion: function (version: string) {
return '6.17.1';
},
findLocalTool: function (toolName: string, versionSpec: string, arch?: string) {
if (toolName !== 'node') {
throw new Error('Searching for wrong tool');
}
return '';
},
downloadTool: function (url: string) {
if (url.includes('6.17.1')) {
return Promise.resolve('/tmp/node-download');
}
throw new Error('Incorrect URL');
},
extractTar: function (file: string, dest?: string) {
return Promise.resolve('/tmp/extracted-node');
},
extract7z: function (file: string, dest?: string) {
return Promise.resolve('/tmp/extracted-node');
},
cacheDir: function (sourceDir: string, tool: string, version: string, arch?: string) {
return Promise.resolve('/cache/node/6.17.1/x64');
}
});

tmr.run();
Loading