Jenkins Pipeline - Switch node version dynamically - node.js

Is there a way we can set NodeJS version dynamically in Jenkins Pipeline. I am not able to make available nvm as well inside the pipeline.
sh 'export NVM_DIR=~/.nvm'
sh 'source ~/.nvm/nvm.sh
script.sh: line 2: nvm: command not found
None of this helped. Multiple teams using the pipeline need specific version of nodeJS. Earlier with non-pipeline jobs, this used to work using nvm.

You can create a choice parameter and use it in tools declaration.
pipeline {
agent any
parameters {
choice(name: 'NODE_VERSION', choices: ['NodeJS 9.6.1', 'NodeJS 7.7.0'], description: '')
}
tools {
nodejs params.NODE_VERSION
}
stages{
stage("Run"){
steps{
sh 'node --version'
}
}
}
}

Related

Jenkins npm: not found, despite node plugin

I have a multibranch pipeline that uses many agents. The agents are all the same (supposedly) - they are all openstack instances created from the same snapshot. All of these instances have node and npm installed globally, which I confirmed by ssh'ing in to each one under various usernames and checking node -v and npm -v, and getting expected version numbers. I had been running into problems with Jenkins throwing npm: not found, so I followed this answer from "Jenkins unable to find npm", which was to use the node plugin. In my pipeline:
pipeline {
agent {
node {
label 'agent-1'
}
}
options {
disableConcurrentBuilds()
}
tools {
nodejs 'NodeJS 14.10.1'
}
stages {
stage ('Parallel tests'){
steps {
script {
parallel parallelStages
}
}
}
}
}
Where parallelStages is a collection that contains a bunch of parallel stages, each one running on its own agent, and requiring use of npm. To avoid question bloat, I'll leave that code out, but you can see it in my other question here. Adding nodejs under tools helped solve this npm: not found problem the first time.
I just added a new stage to parallelStages, with a newly minted agent. I am again running into that old issue of npm: not found on this new agent only. I am using the nodejs plugin in my tools. I manually checked that npm is available on my new agent. When ssh'ing to the agent, which npm gave the path of /home/jenkins_user/.nvm/versions/node/v14.16.1/bin/npm. This is the case for all my agents. However, when putting sh 'which npm' in the steps for each of the parallel stages, the working nodes return /home/jenkins_user/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/NodeJS_14.10.1/bin/npm, and the non-working node returns nothing, and the stage fails there.
Just to be sure, I added this path to the tool locations in "Node Properties" in the jenkins UI:
The error persists. I checked that Jenkins is using the same credentials for all agents, and those credentials indeed work. Why is Jenkins not finding npm? Is this a problem with Jenkins? With my agent? I'm struggling to find the disconnect here.

npm: not found on jenkins agent, but available through ssh

I am trying to set up a jenkins pipeline that utilizes multiple agents. The agents are ubuntu instances living in a cloud tenancy (openstack). When trying to run some npm commands on some of the instances, I am getting the error npm: not found. I've read multiple other threads, but I am struggling to understand why npm might not be found. I set these instances up myself, and I know I installed all requirements, including node and npm.
Let's say I have 2 nodes - agent1 at IP1, and agent2 at IP2. They both have a user login with username cooluser1. When I do an ssh cooluser1#IP1 or ssh cooluser1#IP2, in either case, running npm -v gives me a proper node version (6.14.13). However, in my pipeline, npm is not found in the IP2 instance. Here's my pipline script:
pipeline {
agent {
node {
label 'agent1'
}
}
stages {
stage('Build'){
steps {
sh 'hostname -I'
sh 'echo "$USER"'
sh 'echo "$PATH"'
sh 'npm -v'
}
}
stage ('Run Tests'){
parallel {
stage('Running tests in parallel') {
agent {
node {
label 'agent2'
}
}
steps {
sh 'hostname -I'
sh 'echo "$USER"'
sh 'echo "$PATH"'
sh 'npm -v'
}
}
stage {
// more stuff running on another agent (agent3)
}
}
}
}
}
As you can see, in both the main agent agent1, and in the parallel stages, I run the same code, which checks the host IP, the username, the path, and the npm version. The IPs are as expected - IP1 and IP2. The $USER in both cases is indeed cooluser1. The path looks something like this:
// agent1
+ echo
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
// agent2
+ echo
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
A bit strange, but identical in both cases.
However, when I get to npm --v, for agent1, I get a version number, and any npm commands I want to run are workoing. but in agent2, I get npm: not found, and the pipeline fails if I try to use any npm commands. The full error is here:
+ npm -v
/home/vine/workspace/tend-multibranch_jenkins-testing#tmp/durable-d2a0251e/script.sh: 1: /home/vine/workspace/tend-multibranch_jenkins-testing#tmp/durable-d2a0251e/script.sh: npm: not found
But I clearly saw with ssh cooluser1#IP2 that npm is available in that machine to that user.
What might be going wrong here?
I will propose to you to install nodejs plugin, configure any nodejs version you want in 'manage jenkins' -> 'global tools configurations' and set nodejs in pipeline:
pipeline {
agent any
tools {
nodejs 'NodeJS_14.17.1'
}
stages {
stage ('nodejs test') {
steps {
sh 'npm -v'
}
}
}
}

Use node.js and ANSIcolor plugin in Jenkins

I want to display colored output in jenkins which is produced by node.js
Both work separately, but not combined:
Node Script
My test script test.js:
console.log(require("chalk").red("Node Red"))
Calling the test script in the shell works:
node test.js => OK
Calling a colored shell script in jenkins works:
echo -e "\033[31mShell Red\033[0m" => OK
But calling the node script in jenkins does not display any colors:
node test.js => No Color, when executed in jenkins
For me it worked when putting
export FORCE_COLOR=1
at the top of my script.
See https://github.com/chalk/supports-color#info
The answer of Raphael pointed me in the right direction. Here my complete solution for a Jenkins Pipeline Script (Scripted Pipeline):
:
node {
ansiColor('xterm') {
withEnv(['FORCE_COLOR=3']) {
...
sh "some-node-script-using-chalk.js"
...
}
}
}
If you are using the Declarative Pipeline see https://jenkins.io/doc/pipeline/tour/environment/ how to set environment variables in a Declarative Pipeline Script.
I just found the problem in my case :
In The Job Configuration
Look at the Bindings
Check the checkbox named "Color ANSI Console Output"
And it works (for me...)

Jenkins - env: ‘node’: No such file or directory

I have a jenkins server that is configured using
https://github.com/shierro/jenkins-docker-examples/tree/master/05-aws-ecs
I am running a blue ocean pipeline using a simple Jenkinsfile and the jenkins NodeJS plugin
pipeline {
agent any
tools {
nodejs 'node10'
}
stages {
stage ('Checkout Code') {
steps {
checkout scm
}
}
stage ('Install dependencies') {
steps {
sh "echo $PATH"
sh "npm install"
}
}
}
}
I made sure to add the node10 global tool as well w/c is used above
When the pipeline gets to the script sh "npm install" i am running through this error
this is the output of the command echo $PATH
so i think it's not a path issue
Also, it also wasn't able to add the global package
More info that might help:
Docker Jenkins server: FROM jenkins/jenkins:2.131-alpine
Blue ocean version: 1.7.0
NodeJS Plugin: 1.2.6
Multiple server restarts already
Any ideas why the jenkins server does not know where node is?
Big thanks in advance!
Thanks to #JoergS for some insight! The culprit in this case is: using alpine image as the docker base. So switching from jenkins/jenkins:2.131-alpine to jenkins/jenkins:2.131 solved the NodeJS plugin issue.
I have faced the same issue with jenkinsci/blueocean. I have resolved this by installing nodejs with below command(inside docker) not as jenkins plugin
apk add nodejs
I have faced the same issue with jenkinsci/blueocean. No jenkins nodejs plugin needed.
pipeline {
agent any
stages {
stage ('Checkout Code') {
steps {
checkout scm
}
}
stage ('Install dependencies') {
steps {
sh "apk add nodejs"
sh "echo $PATH"
sh "npm install"
}
}
}
}
Make a symbolic link like this:
sudo ln -s /var/lib/jenkins/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/node/bin/node /usr/bin/node
I want to highlight Mitch Downey's comment, it can't be just a comment because after spending 4 hours with no solution this comment helped me to resolve the solution
My issue ended up being with the jenkinsci/blueocean image. I was able
to just replace that image with jenkins/jenkins:lts and the NodeJS
plugin began working as expected

installing node on jenkins 2.0 using the pipeline plugin

I am running the following docker image jenkinsci/jenkins:2.0-rc-1 to try out jenkins 2.0, and the "pipeline" view.
I can't seem to install node. Here's my pipeline script:
node {
//tool([name: 'node-5.10.1', type: 'jenkins.plugins.nodejs.tools.NodeJSInstallation'])
sh 'echo $(whoami)'
sh 'node -v'
}
The response when this runs is:
[ci] Running shell script
+ whoami
+ echo jenkins
jenkins
[Pipeline] sh
[ci] Running shell script
+ node -v
/../durable-3b0b1b07/script.sh: 2: /../durable-3b0b1b07/script.sh: node: not found
Here's what i've tried:
the jenkins NodeJS tool (which works correctly when used with a freestyle job)
logging into the docker container and installing node manually, for the same user:
UPDATE:
Building on Jesse Glick's answer below, i added the result to my scripts PATH:
node {
def nodeHome = tool name: 'node-5.10.1', type: 'jenkins.plugins.nodejs.tools.NodeJSInstallation'
env.PATH = "${nodeHome}/bin:${env.PATH}"
sh 'npm install'
}
Either
node {
withEnv(["PATH+NODE=${tool name: 'node-5.10.1', type: 'jenkins.plugins.nodejs.tools.NodeJSInstallation'}/bin"]) {
sh 'node -v'
}
}
or
node {
def nodeHome = tool name: 'node-5.10.1', type: 'jenkins.plugins.nodejs.tools.NodeJSInstallation'
sh "${nodeHome}/bin/node -v"
}
should work. See JENKINS-28718 for further proposals.
By the way you can omit the type parameter and just use
tool 'node-5.10.1'
for brevity.
For me work next code:
node(){
def nodeHome = tool 'nodejs5'
env.PATH="${env.PATH}:${nodeHome}/bin"
...
sh 'npm install'
}
nodejs5 is the name of the tool specified in Jenkins configuration.
If anyone happens to deal with this issue on Jenkins running on Windows. Do the following:
def nodeHome = tool 'Node.js 6.9.5'
bat "\"${nodeHome}\"\\node.exe -v"
bat "\"${nodeHome}\"\\npm -v"

Resources