当前位置: 首页 > 知识库问答 >
问题:

无法覆盖Jenkins中的env PATH变量

令狐弘益
2023-03-14

在Jenkins服务器中,定义了两个全局环境变量。在管理Jenkins中-

名称:MAVEN_HOME Value:/var/HOME/tools/hudson。任务。Maven_Maven安装/maven3.5.2

名称:PATH EXTRA$PATH:/usr/local/bin:$MAVEN\u HOME/bin

我看到PATH EXTRA会将MAVEN PATH添加到PATH环境变量中。这就是我现有的服务器设置。现在我需要使用Maven 3.8.2更新Jenkins,所以我使用Manage Jenkins在服务器中下载了Maven 3.8.2-

在Jenkins管道脚本中

def maven_version = 'maven_3.8.2'
pipeline {
    agent any
  stages {
    stage ('build') {
      steps {
        withEnv(["PATH+MAVEN=${tool maven_version}/bin"]) {
          echo "PATH is: $PATH"
          echo env.PATH
          echo env.MAVEN_HOME
          sh 'env'
          sh 'mvn --version'
        }
      }
    }
  }
}

结果:

>

  • 回显“PATH is:$PATH”=

    回声环境。路径=

    回声环境。MAVEN_主页=

    sh“env”=

    为什么路径在前面附加了Maven 3.5.2。如何让PATH指向Maven 3.8.2?

    • sh“mvn--版本”=

    如何使用maven3.8.2获取mvn--version结果?

    注意:我也尝试过自由风格的项目,并使用以下命令覆盖这些值,但mvn版本总是打印3.5.2。知道这是Jenkins无法覆盖路径的错误吗?或者有什么方法可以做到吗?导出MAVEN_HOME=/var/HOME/tools/hudson。任务。Maven\u MavenInstallation/Maven\u 3.8.2导出路径=$PATH:$Maven\u HOME/bin

  • 共有1个答案

    程举
    2023-03-14

    用于修改路径变量的格式使用串联,将新值前置到现有值。这意味着

    PATH+MAVEN=${tool maven_version}/bin
    

    相当于:

    PATH=${tool maven_version}/bin:$PATH
    

    您可以通过显式覆盖PATH变量并将新路径放在变量末尾来解决此问题。尝试像这样测试管道:

    def maven_version = 'maven_3.8.2'
    pipeline {
        agent any
      stages {
        stage ('build') {
          steps {
            withEnv(["PATH=${tool maven_version}/bin:$PATH"]) {
              echo "PATH is: $PATH"
              echo env.PATH
              echo env.MAVEN_HOME
              sh 'env'
              sh 'mvn --version'
            }
          }
        }
      }
    }
    
     类似资料:
    • 问题内容: 我得到输出b 3。为什么它没有给出b13作为输出。任何人都可以解释一下。 问题答案: 假设Foo类声明如下 变量没有覆盖的概念。他们只是被蒙面。 它正在打印3,因为当您使用超类引用访问变量时,它仅访问在超类中声明的变量。 请记住,超类对子类一无所知。

    • 问题内容: 我尝试按照食谱中的描述自定义行为。 在ipython中: 没有被调用。看来在我的python 2.5安装中不起作用。 问题答案: 使用的是ipython,而不是普通的Python交互式shell,它本身捕获所有异常,并且不使用sys.excepthook。以代替just的方式运行它,它将在未捕获的异常时自动调用pdb,就像您尝试使用excepthook一样。

    • 注意:这里有几个人引用的解决方案不适用于我的问题。。。 我有一个java。sql。要在getter中格式化为字符串的时间戳字段。我在课程开始时使用Lombok@Data。但是,当我用自己的getter覆盖Lombok的getter(格式化时间戳)时,字段总是空的。我在文档中没有看到任何东西来解释这种行为。 这段代码将结算日期作为时间戳提供给我: 这个代码块给了我一个NPE,因为setementDa

    • 为什么我不能重写类中的doInBackground方法? 错误:类AttemptLogin必须声明为抽象或实现抽象方法'doInBackground(参数…)在“异步任务”中 如果我将doInBackground的参数更改为(Object[]),它就会工作。为什么我不能传递字符串值?

    • 问题内容: 我有一个Dockerfile,我想使用默认值来配置API。 来自socialengine / nginx-spa ENV API_URL本地主机:6007 因此,当我运行此映像时,我将能够使用以下内容覆盖localhost:6007: 码头工人运行-e API_URL = production.com:6007 ui 这是行不通的,我找不到如何执行此操作的清晰说明。 有什么建议吗? 问

    • 在for循环中,为不同的变量分配一个值。已经赋值的变量将从下一次迭代中获得赋值。最后,两个变量的值相同。该代码用于验证文件中的数据。当我打印这些值时,它会为第一次迭代打印正确的值,但在下一次迭代中,第一次迭代中指定的值会更改。当我在for循环中打印$value3和$value4的值时,它会为$value4显示null,为$value3显示一些值,但在下一次迭代中,$value3的值会被$value