Jenkins 未在分布式构建中从脚本 Jenkinsfile 中找到 krb5.conf 文件

Jenkins not finding krb5.conf file in distributed build from scripted Jenkinsfile

我在我们的分布式 Jenkins 构建环境中有一个脚本化的 Jenkinsfile 运行ning。

我在 Jenkinsfile 中有执行 Kerberos 身份验证的代码。该代码基于两个小型 Java 程序,它们都成功通过了 Kerberos 的身份验证。这两个 Java 程序 运行 在我的 Windows 工作站和 Linux 虚拟机来宾上。

即:我有一对工作 Java 程序,它们使用一组 Kerberos 配置文件从 Windows 和 Linux 成功执行 Kerberos 身份验证。当我将代码转换为我的 Jenkinsfile 时,它​​显然在第 1 步失败:找到我精心构建的 krb5.conf(和 login.conf)文件。

Kerberos 代码位于正确配置的全局共享库中。我知道它已正确配置,因为该库已在我的 Jenkinsfile 中的其他地方使用,并且我知道它已从我们的存储库下载了正确的 Kerberos 库,因为我没有得到任何类型的编译或 class 未发现错误。

具体的错误信息是这样的:

GSSException: Invalid name provided (Mechanism level: KrbException: Cannot locate default realm)

是的,有更长的堆栈跟踪,但如果您知道发生了什么,这就是您所需要的。

我尝试使用 Jenkinsfile 中的 System.setProperty() 指向已签入项目的文件,使用 Jenkins 文件凭据创建,并使用 writeFile 步骤写入包含的字符串配置文件直接到构建工作区。在每种情况下,Jenkins 似乎根本找不到 krb5.conf 文件,我得到相同的 "Cannot locate default realm" 错误。

由于各种原因,将文件放在/etc 中是有问题的。另外,当有明确阐明的查找 Kerberos 配置文件的算法并且我似乎在遵循它时,我真的必须将 Kerberos 配置文件放在那里吗?

如果您知道发生了什么,我们将不胜感激。

注意:我已经使用此处讨论的 krb5.conf 和 login.conf 文件成功通过了 Kerberos 身份验证。他们工作。 Kerberos 和我的配置似乎不是问题所在。无论 Jenkins 做什么或不做什么似乎都是问题所在。

JDK 中的 Kerberos 实现使用系统 属性 "java.security.krb5.conf" 来定位 krb5.conf。我不确定您是否在使用第 3 方 Kerberos 库。

回答我自己的问题,因为我最终找到了解决这个问题的方法,并在我们的构建过程的一部分中成功地使用 Jenkins Pipeline 进行了 Kerberos 身份验证。

我们的 Jenkins 实例在 AWS 云的一小部分中使用了许多执行程序。实际上,我们管道中 运行 在执行程序上的唯一部分是构建步骤:Jenkins 将工作空间签出到构建节点(执行程序)并在这些节点上执行构建。

几乎所有其他内容,以及 Jenkins 所谓的 全局共享库 中的所有内容,包括我最初问题中引用的 Kerberos 代码,实际上是 运行 在 master 上: 即使您在 Jenkinsfile 的 node() 步骤中包装对全局共享库中函数的调用,这些调用仍然 运行 在 master 上。

因为,显然,对吧?

我试图做的是将 krb5.conf 文件放在它应该在构建节点上的所有位置。但是因为我的 Kerberos 代码不是构建的一部分(或者其他几个步骤之一,比如 sh(),在 Jenkins 的节点上 运行),它没有发生在节点上:它正在发生在詹金斯大师身上。即使调用包含在节点步骤中。我不苦。没关系。

将 krb5.conf 文件放在 master 上的正确位置解决了这个问题,但产生了其他问题。最终,我将 Kerberos 逻辑与相应的配置文件一起放入 jar 中的一个小型 Java 命令行实用程序中。这是通过 curl 下载并执行的,所有这些都在我们管道中的 sh() 步骤中进行。这不是最优雅的解决方案,但即使在与 Cloudbees 支持讨论了这个问题之后,这也是他们为我们尝试做的事情推荐的解决方案。