当前位置: 首页 > 面试题库 >

Jenkins管道:选择nodejs版本(+ python版本)

莫繁
2023-03-14
问题内容

我在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插件也是一个可行的解决方案。



 类似资料:
  • 我正在尝试使用 Jenkinsfile 实现一个新的 Jenkins 管道。 GIT存储库并没有在每个分支上都有一个Jenkinsfile,只是在一个特定的分支下(因为我目前正在为一个遗留存储库构建CI)。 Jenkins管道是使用以下配置创建的: 丢弃旧版本(我不想手动清理) Bitbucket webhook trigger (on push event) 来自 SCM 的管道脚本 Bitbu

  • 问题内容: 我想在Jenkins声明式管道的不同阶段使用不同的JDK版本。在第一阶段中,我正在使用Java8。在第二阶段中,我正在使用Java6。如何在Jenkins的声明性管道中选择多个JDK版本? 问题答案: 您可以为每个阶段添加一个工具部分。

  • 以下是 Laravel 的版本路线图: 版本 发布日期 版本类型 维护周期 Laravel 5.1 2015 年 6 月 LTS 长久支持 Bug 修复 2017 年 6 月份,安全修复 2018 年 6 月份 Laravel 5.2 2015 年 12 月 一般发行 提供 6 个月的 Bug 修复支持,一年的安全修复支持 Laravel 5.3 2016 年 8 月 一般发行 提供 6 个月的

  • 我将我的Jenkins Pipeline存储为Jenkins共享库中的Groovy脚本。我想为不同的工作使用不同的版本。我的共享库脚本称为如下: 我已将sharedLib repo中的不同版本标记为。万一我想用v1。0,我用注释引用了它,如下所示。 在我的工作中,我通过调用groovy脚本访问了共享库,并使用了上面的注释,如图所示: 我运行这项工作时出错了。以下是我看到的错误。 当我使用。我哪里出

  • Git 允许你通过几种方法来指明特定的或者一定范围内的提交。 了解它们并不是必需的,但是了解一下总没坏处。 单个修订版本 你可以通过 Git 给出的 SHA-1 值来获取一次提交,不过还有很多更人性化的方式来做同样的事情。 本节将会介绍获取单个提交的多种方法。 简短的 SHA-1 Git 十分智能,你只需要提供 SHA-1 的前几个字符就可以获得对应的那次提交,当然你提供的 SHA-1 字符数量不

  • RT-Thread 是以 Apache License v2 开源许可发布的物联网操作系统。RT-Thread 有十多年的历史,在开发过程中也放在 Github 上由大家协同开发,并发布一个个版本,导致了不同人群面对多样的版本无从下手,此文档将说明如何选择一个合适自己的版本进行开发。 RT-Thread 的版本 / 分支有以下几种可供选择: 开发分支(master 主分支)、长期支持分支(lts-