升级到 Jenkins LTS 2.138.x

每个部分涵盖了从之前的 LTS 版本升级,2.138.1 的部分涵盖了从 2.121.3 升级。

升级到 Jenkins LTS 2.138.4

用户记录的迁移

应用此升级后, Jenkins 将用户记录迁移到稍有不同的存储格式,该存储格式使用中央索引将用户 ID 映射到目录名称。 这是一个向前不兼容的更改, 因此较旧的 Jenkins 版本将无法处理新的存储格式。 强烈建议您在升级之前至少备份 $JENKINS_HOME/users/ 目录。

如果 Jenkins 崩溃或在启动过程中被杀死, 则迁移可能不完整,可能使一部分用户记录不可用。 要确定是否属于这种情况,请检查 $JENKINS_HOME/users/users.xml 文件是否存在。 如果不存在,但是用户目录已按如下所述重命名,则迁移被中断。 在这种情况下,如果没有备份可用,我们建议检查 Jenkins 系统日志,并使用其中的信息将目录恢复为以前的名称。 日志条目看起来类似于以下消息:

INFO: 迁移用户 'admin' 从 'users/admin/' 到 'users/admin_6635238516816951048/'

在这种情况下,在 Jenkins 非运行状态下,将目录 $JENKINS_HOME/users/admin_6635238516816951048/ 重命名为 $JENKINS_HOME/users/admin/。 对日志中列出的所有其他用户目录重复此操作。 完成上述所有操作将撤消部分迁移。 Jenkins 将在下次启动时重新运行它。

如果更新后 Jenkins 需要降级并成功应用了用户目录迁移,请执行上述所有操作,并同时删除 $JENKINS_HOME/users/users.xml 文件。 这将还原迁移并将所有用户记录还原为与 Jenkins 2.138.3 及更早版本兼容的格式。 IMPORTANT: 请注意,降级 Jenkins 通常不受支持,并且可能由于与迁移无关的原因而失败。

HTTP 请求路由的新限制

Stapler web 框架中的一个设计缺陷允许通过访问特定 URLs 来访问原本不打算通过这种方式调用的字段和方法。 For further details, see the security advisory.

作为此安全修复的副作用,某些 HTTP 请求将不再像以前那样工作。 这通常会导致 HTTP 404 Not Found 响应,尽管一小部分请求将成功,但响应将与应用程序修复之前完全不同。 无论何时发生, Jnkins都会向Jenkins 系统日志中写入类似于以下内容的消息:

WARNING: New Stapler routing rules result in the URL "/example" no longer being allowed. If you consider it safe to use, add the following to the whitelist: "method hudson.model.Hudson doExample". Learn more: https://jenkins.io/redirect/stapler-routing

如果这是由于合法使用 Jenkins UI 造成的,则可以将受影响的签名添加到已批准的签名列表中。 为此,请以管理员身份在 Jenkins 脚本控制台中运行以下命令:

jenkins.security.stapler.StaticRoutingDecisionProvider.get().add('method hudson.model.Hudson doExample')

这将在 Jenkins 主目录中创建一个名为 stapler-whitelist.txt 的文件,并添加指定的条目。 也可以手动修改此文件,但如果 Jenkins已经在运行,则需要在应用任何更改后执行以下脚本:

jenkins.security.stapler.StaticRoutingDecisionProvider.get().reload()

我们在link中跟踪已知受影响的插件及其状态: the Jenkins wiki

升级到 Jenkins LTS 2.138.3

没有需要升级说明的显著变化。

升级到 Jenkins LTS 2.138.2

加强安全性以防止 XSS 漏洞

Jenkins 中的视图应用了一种安全性强化,以防止跨站点脚本漏洞被利用。 在极少数情况下,这会导致视图中某些内容转义两次(通常会导致可见的 HTML 实体)。

我们认为这些影响是插件的一个 bug ,要么选择跳过默认测试套件,要么使用过时的工具链。 我们在 the Jenkins wiki 上跟踪已知受影响的插件及其状态。

作为临时解决方法,可以通过将系统属性 org.kohsuke.stapler.jelly.CustomJellyContext.escapeByDefault 设置为 false 来禁用此强化。

升级后首次启动时的登录告警

第一次启动 Jenkins 2.138.2 ,如果插件 jobConfigHistory[Job Config History Plugin] 安装的是 2.19 之前的版本,则可能会记录如下警告。

Oct 10, 2018 2:27:17 PM hudson.ExtensionFinder$GuiceFinder$FaultTolerantScope$1 error
WARNING: Failed to instantiate Key[type=jenkins.telemetry.Correlator, annotation=[none]]; skipping this component
com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) Tried proxying jenkins.telemetry.Correlator to support a circular dependency, but it is not an interface.

这似乎不会导致进一步的问题。 Jenkins 的后续重新启动将不再记录此警告。

安全强化影响 GitHub OAuth 插件的使用

2.138.2 和 2.146 中的安全强化可能导致使用 github-oauth[GitHub OAuth Plugin] 插件访问任务时出现问题,由于插件的 bug 。

作为解决方法,可以通过将 Java system properties hudson.model.AbstractItem.skipPermissionCheckhudson.model.Run.skipPermissionCheck 设置为 true 来暂时禁用部分安全强化。

请查看 description of SECURITY-595 in the 2018-12-05 security advisory 获取有关此解决方案的重要信息。

升级到 LTS 2.138.1

新的登录和用户注册页面

登陆和用户注册页面被重新设计。 作为副作用,现有的 PageDecorator 实现将不会在重新设计的页面上使用。

查看 announcement blog post 获取进一步信息。

新的 API token 系统

允许访问 HTTP 远程 API 的用户API 令牌 已重新设计: API 令牌现在可以被创建和撤销,并以不可恢复的格式存储。

查看 announcement blog post 获取进一步信息。

禁用已弃用的代理协议

已经禁用已弃用的 Jenkins CLI 协议 1 和 2 版本,以及 Java Web 启动代理协议的 1、 2 和 3 版本。

如果仍然使用这些协议(例如基于远程处理的CLI 或代理上的旧 slave.jar 文件),则需要在升级后重新启用这些协议,或升级客户端。 相同的建议 用于远程处理更改的 2.121.x 升级指南适用于此处。

Unix系统上需要 2.7 以上版本的GUN C 库

从当前版本开始, Jenkins 需要 2.7 版本以上的 GNU C 库。 它使得一些 Linux 发行版不受支持,特别是 RHEL 5 和 CentOS 5 。 查看 JENKINS-53924JENKINS-53832 获取更多信息。