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