我今天将 Jenkins 从 1.618 升级到 2.3。这包括安装它推荐的一大堆插件(主要是管道插件及其依赖项)。
自从升级以来,每当一个作业启动另一个作业时,我都会收到一个新错误(或者至少是一个新的不需要的行为)。除非子作业已经定义了这些键,否则作为“预定义参数”传递给子作业的任何值都将被忽略。
让我举例说明:假设我有一份
parent
工作和一份 child
工作。
Parent
通过“在其他项目上触发参数化构建”构建后操作启动 child
。在构建后操作的定义中,在“预定义参数”下,我定义了 FOO=BAR
。
在 Jenkins 1.618 中,当以这种方式触发
child
时,会将 FOO
设置为参数,值为 BAR
。
但在 2.3 中,
FOO
未在 child
的构建上设置。
如果我修改
child
以便 FOO
始终是该作业的参数,那么它将从 FOO=BAR
中获取 parent
集。这是一个不可接受的解决方法,因为我们以这种方式传递了数十个参数,并且在两端定义它们太脆弱并且违反了“不要重复自己”原则。
无论是通过“在其他项目上触发参数化构建”构建后操作还是通过多作业项目的多作业阶段触发子作业,我都会得到相同的结果。
这是有意的改变吗?是不是以前坏了,只是我们使用方法不对?或者这是一个错误?
根据 Jenkins 2 安全更新,可以通过设置绕过它:
hudson.model.ParametersAction.keepUndefinedParameters=true
要验证此解决方法,请转至管理 Jenkins -> 脚本控制台,然后运行:
System.setProperty("hudson.model.ParametersAction.keepUndefinedParameters", "true")
要使其永久化,请按如下方式更改 Jenkins 参数(然后重新启动 Jenkins):
在 Windows 上编辑 Jenkins 主目录中的 jenkins.xml,例如:
<arguments>
-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle
-Dhudson.model.ParametersAction.keepUndefinedParameters=true
-jar "%BASE%\jenkins.war" --httpPort=8080
</arguments>
对于大多数Linux发行版,您可以修改文件内的JENKINS_ARGS:
/etc/default/jenkins(或 jenkins-oc)
对于 CentOS,修改文件内的 JENKINS_JAVA_OPTIONS:
/etc/sysconfig/jenkins(或 jenkins-oc)
以下是已报告的插件列表,这些插件受该问题影响,并且已经存在一个未解决的错误: https://wiki.jenkins-ci.org/display/JENKINS/Plugins+affected+by+fix+for+SECURITY-170
有2种解决方案:
java -Dhudson.model.ParametersAction.keepUndefinedParameters=true -jar jenkins.war
import jenkins.model.*; System.setProperty("hudson.model.ParametersAction.keepUndefinedParameters", "true")
我找不到关于如何为 Linux 盒子进行设置的完整答案。经过几个小时的交叉参考指南后,这就是最终的成果。这些 Jenkins 配置应该有几种风格。我使用 Ubuntu 风格来回答这个问题。
$JENKINS_HOME
的设置位置。默认情况下,它应该位于 ~/.jenkins
,但我没有设置此服务器,所以我不得不深入研究一些配置文件。如果你也这样做,这就是我必须做的:
/etc/default/jenkins
检查 vi
的内容,以获取 $JENKINS_HOME
的值——我的是 /var/lib/$NAME
,在文件的更上方,$NAME
被设置为 jenkins
,所以它是 /etc/libs/jenkins
$JENKINS_HOME
路径init.groovy.d
的目录 - 如果不存在,则创建一个目录,然后按 cd
进入该目录。如果需要的话,你可能必须使用sudo
init.groovy.d
目录中创建一个以 .groovy
结尾的新文件——我刚刚调用了我的 params.groovy
import jenkins.model.*;
System.setProperty("hudson.model.ParametersAction.keepUndefinedParameters", "true")
保存并关闭,然后重新启动 Jenkins 服务器。
如果您遇到了我遇到的相同问题,那么这应该可以解除您的障碍。您的情况可能会有所不同:)我最终使用了一个启动脚本来结合 Jenkins 提出的解决方案来利用该功能。