Jenkins 声明式管道 - 从共享库设置 PATH

Jenkins Declarative Pipeline - Set PATH from shared library

我有一堆使用同一个共享库的多分支声明管道。在每个管道中,我需要定义一个自定义路径:

environment {
    PATH = "$PATH:$HOME/my/cool/scripts:$HOME/some/other/scripts:/yet/another/path"
}

我想我可以把它移到一个共享库中,避免在每个 Jenkinsfile 中重复它:

// shared library
class Utilities {
    public static String PATH = "$PATH:$HOME/my/cool/scripts:$HOME/some/other/scripts:/yet/another/path"
}

// in Jenkinsfile
environment {
    PATH = "${Utilities.PATH}"
}

当我尝试此操作时,它在共享库中抱怨未设置 $PATH$HOME。所以我意识到 Groovy 由于双引号而试图进行变量替换并将其更改为:

class Utilities {
    public static String PATH = '$PATH:$HOME/my/cool/scripts:$HOME/some/other/scripts:/yet/another/path'
}

但是当变量替换在 Jenkinsfile 中使用时不会发生,因此 shell 上的实际 PATH 最终变成了文字字符串 $PATH:$HOME/my/cool/scripts:$HOME/some/other/scripts:/yet/another/path,这显然不是没用。

我已经用谷歌搜索好几天了,但我不知道从这里该去哪里。我正在努力理解 Jenkinsfile 与 shell 中的变量作用域。回到这个例子:

environment {
    PATH = "$PATH:$HOME/my/cool/scripts:$HOME/some/other/scripts:/yet/another/path"
}

我认为 PATH 的字面值正在传递给 shell 并且变量替换发生在 bash 中。然而,情况似乎并非如此。那必须意味着 shell 中的变量(例如 $HOME)在 Jenkinsfile?

中可用

有没有办法在共享库中定义 PATH,这样我就不必在每个管道中都复制它?

Jenkins 直接注入新值而不解析其中的环境变量,因此唯一的选择是使用当前值和字符串插值。

确保从节点而不是主节点传递 PATH。

像这样。

static String newPath(env) {
    return "${env.PATH}:my-path"
}

pipeline {
   agent none
   stages {
       stage ('Preparation') {
          agent { label 'my-node'}
          environment {       
              PATH = newPath(env)
          }
          steps {
              echo PATH
          }
      }
   }
}

下面的示例不使用 shell 环境变量,而是使用字符串插值,groovy 在字符串中看到一个变量并尝试解析它,它被配置为将它委托给主脚本和 jenkins 添加环境变量作为主脚本的属性。

environment {
    PATH = "$PATH:$HOME/my/cool/scripts:$HOME/some/other/scripts:/yet/another/path"
}