猿问

Jenkins 在脚本化 Jenkinsfile 的分布式构建中找不到 krb5.conf 文件

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

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

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

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

具体的错误消息,我没有设法在几十个不同的构建中让步,试图将 krb5.conf 文件放在我认为 Jenkins 可能会寻找它的任何地方,是这样的:

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

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

我尝试使用 Jenkinsfile 中的 System.setProperty() 指向一个已签入项目的文件,使用 Jenkins 文件凭据创建,并使用 writeFile 步骤将包含配置文件的字符串直接写入构建工作区。在每种情况下,Jenkins 似乎都找不到 krb5.conf 文件,并且我收到相同的“无法找到默认领域”错误。

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

如果您知道发生了什么,任何帮助将不胜感激。

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


繁花不似锦
浏览 283回答 2
2回答

慕的地8271018

回答我自己的问题,因为我最终找到了解决此问题的方法,并在我们的构建过程中成功地将 Kerberos 身份验证(以某种方式)与 Jenkins Pipeline 结合使用。我们的 Jenkins 实例在 AWS 云的一小部分中使用了许多执行程序。实际上,我们管道中唯一在执行器上运行的部分是构建步骤:Jenkins 将工作区检出到构建节点(执行器)并在这些节点上执行构建。几乎所有其他内容,以及 Jenkins 所谓的全局共享库中的所有内容,包括在我的原始问题中引用的 Kerberos 代码,实际上都是在 master 上运行的: 即使您将调用包装在 node() 中的全局共享库中的函数进入您的 Jenkinsfile,这些调用仍然在 master 上运行。因为,很明显,对吧?我试图做的是将 krb5.conf 文件放在它应该在构建节点上的所有位置。但是由于我的 Kerberos 代码不是构建的一部分(或其他几个步骤之一,如在 Jenkins 中的节点上运行的 sh()),它没有发生在节点上:它发生在 Jenkins 主节点上. 即使调用包含在节点步骤中。我不苦。没关系。将 krb5.conf 文件放在 master 上的正确位置解决了这个问题,但产生了其他问题。最终,我将 Kerberos 逻辑与相应的配置文件一起放入 jar 中的一个小型 Java 命令行实用程序中。这是通过 curl 下载并执行的,所有这些都在我们管道的 sh() 步骤中。不是最优雅的解决方案,但即使在与 Cloudbees 支持讨论了这个问题之后,这也是他们为我们尝试做的事情推荐的解决方案。

芜湖不芜

JDK 中的 Kerberos 实现使用系统属性“java.security.krb5.conf”来定位 krb5.conf。我不确定您是否在使用 3rd-party Kerberos 库。
随时随地看视频慕课网APP

相关分类

Java
我要回答