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

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

Related

Is it possible to install and run docker inside node container in Jenkins?

This is somewhat complicated situation, but I have Jenkins installed inside a docker container. I'm trying to run some tests in node.js app, but this test environment requires docker+docker-compose to be enabled. At the moment, the Jenkins configuration is through pipeline code
So far, I've tried pulling docker inside a stage, as follow:
pipeline {
agent {
docker {
image 'node'
}
}
stages {
stage("Checkout") {
steps {
git url: ....
}
}
stage("Docker") {
steps {
script {
def image = docker.image('docker')
image.pull()
image.inside() {
sh 'docker --version'
sh 'docker-compose --version'
}
}
}
}
}
with error returning 'docker: not found'. I was expecting the script to succeed because I've tried exactly the same with 'agent any' which had no problem, but inside node image it doesn't seem to work.
I'm also not sure if this is the right way to do so because as I understand correctly, this way of running docker inside a docker is not recommended. One method that I have found is that when running docker, it is recommended to run docker -v /var/run/docker.sock:/var/run/docker.sock ... but currently I am running on docker-compose, with installation steps from https://www.jenkins.io/doc/book/installing/docker/ (instead of individual docker, I've combined both jenkins and jenkins-blueocean into a docker-compose file), and that did not work.
At this moment, I'm out of idea and any solutions or other suggestions as to how to run both node.js and docker in the same environment, would be greatly appreciated.
You can try to use docker-in-docker image https://hub.docker.com/_/docker

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'
}
}
}
}

Which plugin is required to have docker.build work in Jenkins?

I am using docker on Mac and have Jenkins running in docker container.
Client is interacting with docker daemon on host machine.
I have following plugins installed:
docker-plugin
workflow-aggregator
I do have docker client / command working in container. I have also checked it using sh and even docker cloud can spin up agents.
But below Jenkinsfile is contantly throwing error.
def image
pipeline {
agent {
label "container"
}
stages {
stage('Build') {
steps {
script {
image = docker.build("username/image:$BUILD")
}
}
}
}
}
But I am constantly facing below error message:
groovy.lang.MissingPropertyException: No such property: docker for class: groovy.lang.Binding
Error: No such property: docker for class: groovy.lang.Binding
No such Docker property indicates that Docker Pipeline plugin is not installed.
It's little confusing because name of these three plugins are very much similar to each other's id:
Docker have id docker-plugin
Pipeline plugin have id workflow-aggregator
Docker Pipeline plugin have id docker-workflow
If you have this issue:
groovy.lang.MissingPropertyException: No such property: docker for class: groovy.lang.Binding.
We most likely encountered the same issue, in order to fix it I only had to install the Docker Pipeline plugin in Jenkins, so all you have to do is go to:
Jenkins Homepage > Manage Jenkins > Manage Plugins > Available
Search for Docker Pipeline install it restart jenkins and you are ready to go.
For more info about Docker Pipeline Plugin Scripts click here.

Jenkins Pipeline - Switch node version dynamically

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'
}
}
}
}

Resources