Jenkins 管道:select nodejs 版本(+ python 版本)
Jenkins pipeline : select nodejs version (+ python version)
我在 Jenkinsfile 中遇到 Jenkins 管道问题。
我的 Jenkins 实例上有 4 个不同的 nodeJs 版本。我想选择在我的管道中使用哪一个,但官方插件示例 (https://wiki.jenkins-ci.org/display/JENKINS/NodeJS+Plugin) 根本不起作用。
我尝试了第一种方法,但失败了,因为 $PATH 被 tools
部分覆盖了。
pipeline {
agent any
tools {
// I hoped it would work with this command...
nodejs 'nodejs6'
}
stages {
stage('Example') {
steps {
sh 'npm --version'
// Failed saying :
// Running shell script
//nohup: failed to run command 'sh': No such file or directory
}
}
}
}
我尝试了第二种方法,但失败了,因为 tool
命令似乎什么都不做。
pipeline {
agent any
stages {
stage('Example') {
steps {
// ... or this one
tool name: 'nodejs6'
sh 'node --version'
sh 'npm --version'
// Does not use this version of node, but the default one... 7.5.0 with npm 4.3.0
}
}
}
}
最后,我尝试了这个,它适用于 NodeJS 但...似乎不是 "very smart",并且不允许我正确处理我的特定版本 "Python" --是的,我也有 2 个不同版本的 Python,我想以与处理 node--
相同的方式处理它们
pipeline {
agent any
stages{
stage ('Which NodeJS'){
steps{
withEnv(["PATH+NODEJS=${tool 'nodejs6'}/bin","PATH+PYTHON27=${tool 'python27'}"]) {
// Check node version
sh 'which node' // Works properly
sh 'node -v' // Expected 6.9.x version
sh 'npm -v' // Expected 3.x version
sh 'python27 -v'
// Failed with
// /nd-jenkinsfile_XXX@tmp/xx/script.sh: python27: not found
}
}
}
}
}
我还有第四个解决方案,不使用 pipeline
语法。它适用于 nodejs,但不适用于 python(到目前为止)。再一次,手动定义env.PATH
...
似乎不是很优雅
node {
// Setup tools...
stage ('Setup NodeJs'){
def nodejsHome = tool 'nodejs6'
env.NODE_HOME = "${nodejsHome}"
env.PATH = "${nodejsHome}/bin:${env.PATH}"
sh 'which node'
sh 'node -v'
sh 'npm -v'
}
stage ('Setup Python 2.7'){
def pythonBin = tool 'python27'
// Jenkins docker image has Jenkins user's home in "/var/jenkins_home"
sh "rm -Rf /var/jenkins_home/tools/python ; mkdir -p /var/jenkins_home/tools/python"
// Link python to python 2.7
sh "ln -s ${pythonBin} /var/jenkins_home/tools/python/python"
// Include link in path --don't use "~" in path, it won't be resolved
env.PATH = "~/tools/python:${env.PATH}:~/tools/python"
// Displays correctly Python 2.7
sh "python --version"
}
}
总而言之,我只是想知道哪种解决方案(当然是我未在此处列出的另一种解决方案)是最好的?你建议哪一个?为什么?
干杯,
奥利维尔
所以。这是 "EnvInject" 插件的问题:https://issues.jenkins-ci.org/browse/JENKINS-26583
如果您想保留 EnvInject,我上面的解决方法 #4 是正确的解决方案。
env.NODE_HOME="${tool 'Node 6.x'}"
env.PATH="${env.NODE_HOME}/bin:${env.PATH}"
sh 'npm -version'
否则,尽可能移除 EnvInject 插件也是一个很好的解决方案。
在您的 Jenkins 管道中使用具有特定版本节点 and/or python 的 docker 图像怎么样?这将是一个干净的解决方案,因为您只需要在构建机器上安装 docker 而不是 python.
的并排版本
pipeline {
agent {
label 'slave-machine'
}
environment {
NODE_HOME = tool name: 'Node 10.13.0', type: 'jenkins.plugins.nodejs.tools.NodeJSInstallation'
}
stages {
stage('test') {]
steps {
script {
env.PATH="${env.NODE_HOME}/bin:${env.PATH}"
sh 'node -v'
sh 'echo $NODE_HOME'
}
}
}
}
}
我在 Jenkinsfile 中遇到 Jenkins 管道问题。 我的 Jenkins 实例上有 4 个不同的 nodeJs 版本。我想选择在我的管道中使用哪一个,但官方插件示例 (https://wiki.jenkins-ci.org/display/JENKINS/NodeJS+Plugin) 根本不起作用。
我尝试了第一种方法,但失败了,因为 $PATH 被 tools
部分覆盖了。
pipeline {
agent any
tools {
// I hoped it would work with this command...
nodejs 'nodejs6'
}
stages {
stage('Example') {
steps {
sh 'npm --version'
// Failed saying :
// Running shell script
//nohup: failed to run command 'sh': No such file or directory
}
}
}
}
我尝试了第二种方法,但失败了,因为 tool
命令似乎什么都不做。
pipeline {
agent any
stages {
stage('Example') {
steps {
// ... or this one
tool name: 'nodejs6'
sh 'node --version'
sh 'npm --version'
// Does not use this version of node, but the default one... 7.5.0 with npm 4.3.0
}
}
}
}
最后,我尝试了这个,它适用于 NodeJS 但...似乎不是 "very smart",并且不允许我正确处理我的特定版本 "Python" --是的,我也有 2 个不同版本的 Python,我想以与处理 node--
相同的方式处理它们pipeline {
agent any
stages{
stage ('Which NodeJS'){
steps{
withEnv(["PATH+NODEJS=${tool 'nodejs6'}/bin","PATH+PYTHON27=${tool 'python27'}"]) {
// Check node version
sh 'which node' // Works properly
sh 'node -v' // Expected 6.9.x version
sh 'npm -v' // Expected 3.x version
sh 'python27 -v'
// Failed with
// /nd-jenkinsfile_XXX@tmp/xx/script.sh: python27: not found
}
}
}
}
}
我还有第四个解决方案,不使用 pipeline
语法。它适用于 nodejs,但不适用于 python(到目前为止)。再一次,手动定义env.PATH
...
node {
// Setup tools...
stage ('Setup NodeJs'){
def nodejsHome = tool 'nodejs6'
env.NODE_HOME = "${nodejsHome}"
env.PATH = "${nodejsHome}/bin:${env.PATH}"
sh 'which node'
sh 'node -v'
sh 'npm -v'
}
stage ('Setup Python 2.7'){
def pythonBin = tool 'python27'
// Jenkins docker image has Jenkins user's home in "/var/jenkins_home"
sh "rm -Rf /var/jenkins_home/tools/python ; mkdir -p /var/jenkins_home/tools/python"
// Link python to python 2.7
sh "ln -s ${pythonBin} /var/jenkins_home/tools/python/python"
// Include link in path --don't use "~" in path, it won't be resolved
env.PATH = "~/tools/python:${env.PATH}:~/tools/python"
// Displays correctly Python 2.7
sh "python --version"
}
}
总而言之,我只是想知道哪种解决方案(当然是我未在此处列出的另一种解决方案)是最好的?你建议哪一个?为什么?
干杯, 奥利维尔
所以。这是 "EnvInject" 插件的问题:https://issues.jenkins-ci.org/browse/JENKINS-26583
如果您想保留 EnvInject,我上面的解决方法 #4 是正确的解决方案。
env.NODE_HOME="${tool 'Node 6.x'}"
env.PATH="${env.NODE_HOME}/bin:${env.PATH}"
sh 'npm -version'
否则,尽可能移除 EnvInject 插件也是一个很好的解决方案。
在您的 Jenkins 管道中使用具有特定版本节点 and/or python 的 docker 图像怎么样?这将是一个干净的解决方案,因为您只需要在构建机器上安装 docker 而不是 python.
的并排版本pipeline {
agent {
label 'slave-machine'
}
environment {
NODE_HOME = tool name: 'Node 10.13.0', type: 'jenkins.plugins.nodejs.tools.NodeJSInstallation'
}
stages {
stage('test') {]
steps {
script {
env.PATH="${env.NODE_HOME}/bin:${env.PATH}"
sh 'node -v'
sh 'echo $NODE_HOME'
}
}
}
}
}