簡體   English   中英

Jenkins 管道:選擇 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 但是......似乎不是“非常聰明”,並且不允許我正確處理我的特定版本的“Python”——是的,我也有 2 個不同版本的我想以與節點相同的方式處理 Python--

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 插件也是一個很好的解決方案。

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

如何在 Jenkins 管道中使用具有特定版本的節點和/或 python 的 docker 圖像? 這將是一個干凈的解決方案,因為您只需要在構建機器上安裝 docker 而不是並行版本的 python。

https://jenkins.io/doc/book/pipeline/docker/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM