【发布时间】:2019-07-07 15:45:28
【问题描述】:
问题
我正在从事一项 Jenkins 工作,该工作接受来自用户的一些参数。我遇到了一个不受欢迎的行为:Jenkins 似乎在我的脚本有机会读取它们之前在参数环境变量中扩展环境变量引用。
如果用户输入foo-$BUILD_NUMBER 作为参数,我的脚本实际看到的是foo-123;环境变量被扩展。如果输入的值包含$$,我的脚本只会看到一个$。但是,如果它包含环境中不存在的 $variable,则该值保持不变(不会引发任何类型的错误)。
这很不方便,因为它甚至发生在密码字段中,我通常使用可以包含$ 字符的密码生成器。我不希望我的密码被默默地破坏。
示例
我最初的测试用例如下,使用 Jenkins Job Builder Groovy DSL。
new BaseJobBuilder(
jobName: 'example',
jobBuildName: 'example-${BUILD_NUMBER}',
).build(this).with {
parameters {
nonStoredPasswordParam('SERVICE_PASSWORD')
}
steps {
shell('echo "$SERVICE_PASSWORD";')
}
}
但是,为了更精简的测试用例,我从jenkins/jenkins:lts Docker 映像创建了一个新的 Jenkins 安装,在没有任何插件(甚至是默认插件)的情况下对其进行了配置,并使用 Web UI 创建了一个等效作业。
当我使用参数SERVICE_PASSWORD 的值hello $BUILD_NUMBER $HOME world 运行这些作业时,输出会扩展变量,而不是我想要的文字值。
Started by user jeremy
Building in workspace /var/jenkins_home/workspace/jeremy
[jeremy] $ /bin/sh -xe /tmp/jenkins2451955822062381529.sh
+ echo hello 3 /var/jenkins_home world
hello 3 /var/jenkins_home world
Finished: SUCCESS
问题
有没有办法在 Jenkins 受到变量扩展/插值之前访问它们的原始参数值,或者以其他方式禁用或规避这种行为?
我怎样才能接受可能包含$ 美元字符的原始文本参数而不会有被破坏的风险?
相关链接
- JENKINS-10779 Non-existing parameters are not empty but replaced with parameter name
- JENKINS-16143 Jenkins escapes 2 dollar signs in the Parameterized Build fields
- JENKINS-26916 There should be an option to turn on/off variable substitution in build parameters
- Jenkins text parameter - special characters garbled (unwanted variable substitution)
【问题讨论】:
标签: jenkins groovy environment-variables jenkins-plugins jenkins-job-dsl