如何在 Jenkins 声明式管道中设置 PATH

Posted

技术标签:

【中文标题】如何在 Jenkins 声明式管道中设置 PATH【英文标题】:How to set PATH in Jenkins Declarative Pipeline 【发布时间】:2017-08-31 09:56:08 【问题描述】:

在 Jenkins 脚本化管道中,您可以像这样设置 PATH 环境变量:

node 
   git url: 'https://github.com/jglick/simple-maven-project-with-tests.git'
   withEnv(["PATH+MAVEN=$tool 'M3'/bin"]) 
      sh 'mvn -B verify'
   

请注意 PATH+MAVEN,如此处https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-withenv-code-set-environment-variables 所述:

要设置的环境变量列表,每个都在表单中 VARIABLE=value 或 VARIABLE= 取消设置其他定义的变量。你 也可以使用语法 PATH+WHATEVER=/something 前置 /something 到 $PATH。

但我没有找到如何使用环境语法在声明性管道中执行此操作(如此处所述:https://jenkins.io/doc/pipeline/tour/environment)。

environment 
    DISABLE_AUTH = 'true'
    DB_ENGINE    = 'sqlite'

理想情况下,我想更新 PATH 以在我的所有阶段使用自定义工具。

【问题讨论】:

【参考方案1】:

environment 部分是可能的:

pipeline 
  agent  label 'docker' 
  environment 
    PATH = "/hot/new/bin:$env.PATH"
  
  stages 
    stage ('build') 
      steps 
        echo "PATH is: $env.PATH"
      
    
  

有关信息,请参阅this answer。

【讨论】:

这比withEnv(['PATH+WHATEVER=...']) 乱七八糟的好多了! 这几乎可以工作,但PATH 在环境块中为空,所以当我使用它时,我最终只得到/hot/new/bin 而没有别的。 如果我将它设置在舞台级别而不是管道,这将有效。 @Jeremy 它必须是 $env.PATH 此方法不会在 shell 内设置 PATH 变量。尝试运行 sh 'echo $PATH',它不会有 /hot/new/bin 部分。 echo 步骤通过 Jenkins 的 env 插值获取路径变量。如果您尝试调用命令,例如由 python pip 安装的命令,此解决方案不适用于将 $HOME/.local/bin 附加到 PATH。【参考方案2】:

作为一种解决方法,您可以定义一个环境变量并在sh 步骤中使用它:

pipeline 
    environment 
        MAVEN_HOME = tool('M3')
    

    stages 
        stage(Maven') 
           sh '$MAVEN_HOME/bin/mvn -B verify'
        
    

【讨论】:

tool 函数定义在哪里? 是预定义的,但是需要在全局设置中配置工具:jenkins.io/doc/pipeline/steps/workflow-basic-steps/… 你能做一些类似 MAVEN_HOME = powershell("doSomething") 的事情吗 - doSomething 是系统路径上定义的函数吗?我正在尝试调用将返回 python 位置的 powershell 脚本。 我看到有一个powershell 函数,所以powershell(script = "doSomething", returnStdout = true) 可能有效,但我从未尝试过。【参考方案3】:

查看以下链接,这说明了如何配置您的工具。 使用声明式管道会有些不同,但总体而言更容易理解。

declarative-maven-project

【讨论】:

【参考方案4】:

仅允许在预安装的全局工具中使用管道中的工具部分。有些工具是插件提供的,如果不存在,恐怕不能通过管道工具声明使用环境设置。

我希望是错的!

【讨论】:

在下面查看我的答案

以上是关于如何在 Jenkins 声明式管道中设置 PATH的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jenkins 声明式管道中创建方法?

如何获取/获取 Jenkins 管道中设置的环境变量到我们的 maven pom.xml

如何在没有 Maven 和 Docker 的 Jenkins 声明式管道中执行 SonarQube 扫描仪

如何在 Jenkins Groovy 中设置位置参数

如何在声明性 Jenkins 管道的各个阶段之间传递变量?

在 Jenkins 声明式管道中使用 waitForQualityGate