【问题标题】:How to set PATH in Jenkins Declarative Pipeline如何在 Jenkins 声明式管道中设置 PATH
【发布时间】: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 以在我的所有阶段使用自定义工具。

【问题讨论】:

    标签: jenkins path environment-variables jenkins-pipeline


    【解决方案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】:

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

      我希望是错的!

      【讨论】:

      • 在下面查看我的答案
      猜你喜欢
      • 2019-08-05
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 2018-10-26
      • 2018-05-17
      • 2017-08-12
      • 2021-01-15
      相关资源
      最近更新 更多