当前位置: 首页 > 知识库问答 >
问题:

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

鞠子轩
2023-03-14

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

我在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:提供的名称无效(机制级别:KrbException:无法找到默认领域)

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

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

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

如果您知道发生了什么,我们将非常感谢您的帮助。

注意:我已经使用krb5.conf和登录成功地对Kerberos进行了身份验证。这里有争议的conf文件。他们工作。Kerberos和我的配置似乎不是问题所在。无论詹金斯在做什么或不在做什么似乎都是问题所在。

共有2个答案

宗建章
2023-03-14

JDK内部的Kerberos实现使用系统属性“java.security.krb5.conf”来定位krb5.conf。我不确定您是否在使用第三方Kerberos库。

慕容星晖
2023-03-14

回答我自己的问题,因为我最终找到了解决方案,并在我们的构建过程中成功地使用Jenkins Pipeline的Kerberos身份验证(以某种方式)。

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

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

因为,很明显,对吗?

我试图做的是将krb5.conf文件放在构建节点上所有应该放的地方。但是,由于我的Kerberos代码不是构建的一部分(或其他几个步骤之一,如sh(),在Jenkins中的节点上运行),所以它不会发生在节点上:它发生在Jenkins主机上。即使调用包装在节点步骤中。我不苦。很好。

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

 类似资料:
  • 我正在尝试使用tomcat设置kerberos/spnego身份验证。我在tomcat目录下添加了一个krb5.conf文件,在SpnegoFilterConfig中读取值并设置java.security.krb5.conf,但是似乎没有考虑到这一点。无论文件是否存在,我都会得到相同的结果。 如果我把jce安全文件放在lib/security中,我会得到 然而,无论我是否拥有krb5.conf,这

  • 问题内容: 我正在使用groovy脚本获取当前正在运行的jenkins作业的构建状态,作为构建后的动作,如下所示: 现在,我想将“ result”变量的值发送到文件中的特定位置 既然我是groovy的新手,我对此并不了解,有没有办法像在shell脚本中那样做到这一点: 问题答案: 如果只想在文件中写一行,则可以使用下一个调用:

  • 目前,我有一个“包罗万象”的jenkinsfile,其中包含各种函数。为了在其他jenkinsfile中重用这些函数,我想将它们放在单独的groovy脚本中,并从jenkinsfile中加载它们。 scmHandler。groovy: 在jenkinsfile中,我执行以下操作: <代码>。。。def scmHandler=负载(“测试/scmHandler.groovy”)scmHandler。

  • 我已经成功地在svn中检入的java项目的根目录下添加了build.xml。 现在,下面是jenkin构建的控制台输出 复制 /var/lib/jenkins/workspace/FinalWar/WebContent/WEB-INF/WEB。xml转换为 /var/lib/jenkins/workspace/FinalWar/build/WebContent/WEB-INF/WEB。xml 文件

  • 问题内容: 我有一个时髦的脚本去推广代码。长话短说,我知道该脚本中的某个时间点是否成功。如果不成功,我想使构建失败。有什么办法使构建失败? 例: 在“执行Groovy脚本”插件中。您可以编写代码。 其中,“ checkPromote”根据促销的状态返回true或false值。 问题答案: 我认为,中止程序的最优雅方法是声明。

  • 我有一个Jenkins的自由式构建,基于一个使用SBT的Scala项目。我正试图使用Jenkins艺术工厂插件将生成的工件发布到艺术工厂存储库,特别是托管在artifactoryonline.com.的存储库。然而,我正在努力寻找一个合理的配置。我倾向于怀疑我错过了什么,但我无计可施,我找到的留档似乎都没有详细介绍这个用例,我厌倦了浏览艺术工厂插件源代码。非常感谢任何帮助。 情况如下。我想: 使用