dudewad
dudewad

Reputation: 13933

Return a value from node.js script in azure pipeline?

In Azure Pipelines, I see that you can access the environment variables from scripts in node.js during a pipeline run. However, I want to actually return a value and then capture/use it.

Does anyone know how to do this? I can't find any references on how to do this in documentation.

For consistency's sake it'd be nice to use node scripts for everything and not go back and forth between node and bash.

Thanks

Upvotes: 2

Views: 1799

Answers (1)

dudewad
dudewad

Reputation: 13933

Okay I finally figured this out. Azure documentation is a bit confusing on the topic, but my approach was what follows. In this example, I'm going to make a rather pointless simple script that sets a variable whose value is the name of the source branch, but all lower case.

1) Define your variable

Defining a variable can be done simply (though there is a lot of depth to how variables are used and I suggest consulting Azure documentation on variable creation for more). However, at the top of your pipeline yaml file you can define it as such:

variables
  lowerCaseBranchName: ''

This creates an empty variable for use across your jobs. We'll use this variable as our example.

2) Create your script

"Returning a value" from your script simply means outputting it via node's stdout, the output of which will be consumed by the task to set it as a pipeline variable.

An important thing to remember is that any environment variables from the pipeline can be used within node, they are just reformatted and moved under node's process.env global. For instance, the commonly used Build.SourceBranchName environment variable in azure pipelines is accessible in your node script via its alias process.env.BUILD_SOURCEBRANCHNAME. This uppercase name transformation should be uniform across all environment variables.

Here's an example node.js script:

const lowerCaseBranchName = process.env.BUILD_SOURCEBRANCHNAME.toLowerCase();

process.stdout.write(lowerCaseBranchName);

3) Consume the output in the relevant step in azure pipelines

To employ that script in a job step, call it with a script task. Remember that a script task is, in this case, a bash script (though you can use others) that runs node as a command as it sets the value of our variable:

- script: |
    echo "##vso[task.setvariable variable=lowerCaseBranchName]$(node path/to/your/script)"
    displayName: 'Get lower case branch name'

Breaking down the syntax

Using variable definition syntax is, in my opinion extremely ugly, but pretty easy to use once you understand it. The basic syntax for setting a variable in a script is the following:

##vso[task.setvariable variable=SOME_VARIABLE_NAME]SOME_VARIABLE_VALUE

Above, SOME_VARIABLE_NAME is the name of our variable (lowerCaseBranchName) as defined in our azure pipeline configuration at the beginning. Likewise, SOME_VARIABLE_VALUE is the value we want to set that variable to.

You could do an additional line above this line to create a variable independently that you can then use to set the env variable with, however I chose to just inline the script call as you can see in the example above usign the $() syntax.

That's it. In following tasks, the environment variable lowerCaseBranchName can be utilized using any of the variable syntaxes such as $(lowerCaseBranchName),

Final result

Defining our variable in our yaml file:

variables
  lowerCaseBranchName: ''

Our nodejs script:

const lowerCaseBranchName = process.env.BUILD_SOURCEBRANCHNAME.toLowerCase();

process.stdout.write(lowerCaseBranchName);

Our pipeline task implementation/execution of said script:

- script: |
    echo "##vso[task.setvariable variable=lowerCaseBranchName]$(node path/to/your/script)"
    displayName: 'Get lower case branch name'

A following task using its output:

- script: |
  echo "$(lowerCaseBranchName)"
  displayName: 'Output lower case branch name'

This will print the lower-cased branch name to the pipline console when it runs.

Hope this helps somebody! Happy devops-ing!

Upvotes: 4

Related Questions