我有一个Jenkins主/从设置,它一直很愉快,在某些Linux机器上运行Oracle导入。
我刚刚添加了一个新的从属节点,并试图在这个新节点上运行我们现有的数据库导入作业。这项工作包括三个子项目;第一个运行一些执行shell,复制文件和更改权限,这当前成功完成,第二个运行一个以Oracle impdp结尾的执行shell。 impdp完成(db存在且ps -ef
不再显示impdp正在运行)但Jenkins子项目永远不会完成。用户界面就坐在那里,时钟响起。
我尝试在impdp之后添加一个echo,这也正确执行,但子项目仍然没有完成。
如果我添加Post-Build电子邮件通知,则不会发送。
永远不会到达第三个子项目。
可能是什么原因以及如何调试正在发生的事情?
答案 0 :(得分:5)
在我们的案例中,工作将宣布"完成:成功",然后继续与一些未知的Jenkins业务再持续10或20分钟。在进行更详细的日志记录后,我们发现它与名不副实的LogRotator有关。
我们有数千个旧版本,并且正在删除超过特定天数的文件。由于处理旧构建的方式,Jenkins会搜索旧构建的整个列表,即使它们已经删除了它们的工件。
现在修复了与此相关的问题:https://issues.jenkins-ci.org/browse/JENKINS-22607
截至目前,我没有在发布中看到它,但如果您遇到此问题,则临时解决方法是关闭删除。
答案 1 :(得分:3)
这结果是可怕的: - )
完成工作后,Jenkins试图杀死它产生的所有进程。为了识别它们,它会遍历操作系统中的所有进程,从/proc/<pid>/environ
(这是一个Linux框)读取,其中包含进程的环境变量,并将它们与它为Jenkins进程设置的环境进行比较。
问题是我们的数据库服务器上运行了一个特定的Oracle进程,如果你试图从/proc/pid/environ
读取它,它就会永远挂起 - 这就是Jenkins代码卡住的地方。
我不知道为什么它会像这样被卡住,我的DBA也没有。我们重新启动它,现在它可以工作。
答案 2 :(得分:0)
您可以将set +x
添加到shell脚本的顶部,以查看实际执行的命令。这样你就可以从输出中轻松看到哪个命令阻塞了。