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"
}
我有一堆使用同一个共享库的多分支声明管道。在每个管道中,我需要定义一个自定义路径:
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"
}