npm:在 jenkins agent 上找不到,但可以通过 ssh 获得

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

我正在尝试建立一个使用多个代理的 jenkins 管道。代理是 ubuntu 个生活在云租赁 (openstack) 中的实例。在某些实例上尝试 运行 某些 npm 命令时,出现错误 npm: not found。我已经阅读了多个其他主题,但我很难理解为什么找不到 npm。我自己设置了这些实例,我知道我安装了所有要求,包括节点和 npm。

假设我有 2 个节点 - agent1 在 IP1,agent2 在 IP2。他们都有用户名 cooluser1 的用户登录。当我执行 ssh cooluser1@IP1ssh cooluser1@IP2 时,无论哪种情况,运行ning npm -v 都会给我一个正确的节点版本 (6.14.13)。但是,在我的管道中,IP2 实例中找不到 npm。这是我的管道脚本:

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

如您所见,在主代理 agent1 和并行阶段,我 运行 使用相同的代码,检查主机 IP、用户名、路径和npm 版本。 IP 符合预期 - IP1 和 IP2。两种情况下的 $USER 确实是 cooluser1。路径看起来像这样:

// 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

有点奇怪,但两种情况都相同。

但是,当我到达 npm --v 时,对于 agent1,我得到了一个版本号,并且我想要 运行 的任何 npm 命令都在工作。但是在 agent2 中,我得到 npm: not found,如果我尝试使用任何 npm 命令,管道就会失败。完整的错误在这里:

+ 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

但我清楚地看到 ssh cooluser1@IP2 该用户可以在该机器上使用 npm

这里可能出了什么问题?

我会建议你安装 nodejs 插件,在 'manage jenkins' -> 'global tools configurations' 中配置你想要的任何 nodejs 版本并在管道中设置 nodejs:

pipeline {
  agent any
  tools {
    nodejs 'NodeJS_14.17.1'
  }
  stages {
    stage ('nodejs test') {
      steps {
        sh 'npm -v'
      }
    }
  }
}