Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added feature helpers #1010

Merged
merged 12 commits into from
Jan 30, 2024
8 changes: 8 additions & 0 deletions node/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@

## 4.x

### 4.9.0

- Added internal feature helpers [#1010](https://github.com/microsoft/azure-pipelines-task-lib/pull/1010)

### 4.8.0

- Added `source` property for error/warning [#1009](https://github.com/microsoft/azure-pipelines-task-lib/pull/1009)

### 4.7.0

Replaced mockery - [#989](https://github.com/microsoft/azure-pipelines-task-lib/pull/989)
Expand Down
1 change: 1 addition & 0 deletions node/mock-task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ module.exports.getInput = task.getInput;
module.exports.getInputRequired = task.getInputRequired;
module.exports.getBoolInput = task.getBoolInput;
module.exports.getBoolFeatureFlag = task.getBoolFeatureFlag;
module.exports.getPipelineFeature = task.getPipelineFeature;
module.exports.getDelimitedInput = task.getDelimitedInput;
module.exports.filePathSupplied = task.filePathSupplied;

Expand Down
2 changes: 1 addition & 1 deletion node/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion node/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "azure-pipelines-task-lib",
"version": "4.8.1",
"version": "4.9.0",
"description": "Azure Pipelines Task SDK",
"main": "./task.js",
"typings": "./task.d.ts",
Expand Down
27 changes: 25 additions & 2 deletions node/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -279,10 +279,11 @@ export function getBoolInput(name: string, required?: boolean): boolean {

/**
* Gets the value of an feature flag and converts to a bool.
*
* @IMPORTANT This method is only for internal Microsoft development. Do not use it for external tasks.
* @param name name of the feature flag to get.
* @param defaultValue default value of the feature flag in case it's not found in env. (optional. Default value = false)
* @returns boolean
* @deprecated Don't use this for new development. Use getPipelineFeature instead.
*/
export function getBoolFeatureFlag(ffName: string, defaultValue: boolean = false): boolean {
const ffValue = process.env[ffName];
Expand All @@ -297,6 +298,28 @@ export function getBoolFeatureFlag(ffName: string, defaultValue: boolean = false
return ffValue.toLowerCase() === "true";
}

/**
* Gets the value of an task feature and converts to a bool.
* @IMPORTANT This method is only for internal Microsoft development. Do not use it for external tasks.
* @param name name of the feature to get.
* @returns boolean
*/
export function getPipelineFeature(featureName: string): boolean {
const variableName = im._getVariableKey(`DistributedTask.Tasks.${featureName}`);
const featureValue = process.env[variableName];

if (!featureValue) {
debug(`Feature '${featureName}' not found. Returning false as default.`);
return false;
}

const boolValue = featureValue.toLowerCase() === "true";

debug(`Feature '${featureName}' = '${featureValue}'. Processed as '${boolValue}'.`);

return boolValue;
}

/**
* Gets the value of an input and splits the value using a delimiter (space, comma, etc).
* Empty values are removed. This function is useful for splitting an input containing a simple
Expand Down Expand Up @@ -801,7 +824,7 @@ export function mkdirP(p: string): void {
let testDir: string = p;
while (true) {
// validate the loop is not out of control
if (stack.length >= (process.env['TASKLIB_TEST_MKDIRP_FAILSAFE'] || 1000)) {
if (stack.length >= Number(process.env['TASKLIB_TEST_MKDIRP_FAILSAFE'] || 1000)) {
KonstantinTyukalov marked this conversation as resolved.
Show resolved Hide resolved
// let the framework throw
debug('loop is out of control');
fs.mkdirSync(p);
Expand Down
34 changes: 34 additions & 0 deletions node/test/inputtests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1200,4 +1200,38 @@ describe('Input Tests', function () {
assert.equal(ffValue, true);
})
});

describe('Pipeline features tests', () => {
it(`Should return if no feature variable present.`, () => {
const featureName = "TestFeature"
delete process.env[im._getVariableKey(`DistributedTask.Tasks.${featureName}`)];

const ffValue = tl.getPipelineFeature(featureName);

assert.deepStrictEqual(ffValue, false);
})

const testInputs = ([
["true", true],
["TRUE", true],
["TruE", true],
["false", false],
["treu", false],
["fasle", false],
["On", false],
["", false],
[undefined, false]
] as [string, boolean][])
for (const [input, expected] of testInputs) {
it(`Should return '${expected}' if feature is '${input}'`, () => {
const featureVariable = "DISTRIBUTEDTASK_TASKS_TESTFEATURE";
const featureName = "TestFeature";
process.env[featureVariable] = input;

const result = tl.getPipelineFeature(featureName);

assert.deepStrictEqual(result, expected);
})
}
})
});
36 changes: 36 additions & 0 deletions powershell/Tests/L0/Get-PipelineFeature.InputsTest.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
[CmdletBinding()]
param()

. $PSScriptRoot\..\lib\Initialize-Test.ps1

$featureName = "TestFeature"
$featureVariable = "DISTRIBUTEDTASK_TASKS_TESTFEATURE"

Invoke-VstsTaskScript -ScriptBlock {
$testInputs = @(
@("true", $true),
@("TRUE", $true),
@("TruE", $true),
@("false", $false),
@("treu", $false),
@("fasle", $false),
@("On", $false),
@("", $false),
@($null, $false)
)
foreach ($testInput in $testInputs) {
$inputValue = $testInput[0]
$expectedValue = $testInput[1]

Set-Item -Path env:$featureVariable -Value $inputValue

$result = Get-VstsPipelineFeature -FeatureName $featureName

try {
Assert-AreEqual -Expected $expectedValue -Actual $result -Message "Suite failed. Input value: '$inputValue'"
}
finally {
${env:$featureVariable} = ""
}
}
}
31 changes: 31 additions & 0 deletions powershell/VstsTaskSdk/InputFunctions.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,37 @@ function Set-TaskVariable {
Write-SetVariable -Name $Name -Value $Value -Secret:$Secret
}

<#
.SYNOPSIS
Gets the value of an task feature and converts to a bool.

.PARAMETER $FeatureName
Name of the feature to get.

.NOTES
This method is only for internal Microsoft development. Do not use it for external tasks.
#>
function Get-PipelineFeature {
[CmdletBinding(DefaultParameterSetName = 'Require')]
param(
[Parameter(Mandatory = $true)]
[string]$FeatureName
)

$featureValue = Get-TaskVariable -Name "DistributedTask.Tasks.$FeatureName"

if (!$featureValue) {
Write-Debug "Feature '$FeatureName' is not set. Defaulting to 'false'"
return $false
}

$boolValue = $featureValue.ToLowerInvariant() -eq 'true'

Write-Debug "Feature '$FeatureName' = '$featureValue'. Processed as '$boolValue'"

return $boolValue
}

########################################
# Private functions.
########################################
Expand Down
1 change: 1 addition & 0 deletions powershell/VstsTaskSdk/VstsTaskSdk.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ Export-ModuleMember -Function @(
'Get-TaskVariable'
'Get-TaskVariableInfo'
'Set-TaskVariable'
'Get-PipelineFeature'
# Legacy find functions.
'Find-Files'
# Localization functions.
Expand Down
2 changes: 1 addition & 1 deletion powershell/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion powershell/package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "0.18.1",
"version": "0.19.0",
"private": true,
"scripts": {
"build": "node make.js build",
Expand Down