0

我们使用 Jenkins 和 PowerShell 在我们的组织内进行大量自动化。它非常适合部署、计划任务、重新启动服务、回收 IIS 应用程序池等。现在我想用它来重新启动在 Windows 服务器上运行的控制台应用程序。

exe 控制台应用程序将启动一个 GUI,该 GUI 必须在服务器上的用户控制台会话中保持运行。服务更容易控制,并且这种方法要求我们始终有一个活动会话来运行,我们通过 RDP 对其进行监控,但是与构建系统的开发人员争论已经太迟了。

Jenkins 作为服务运行,当我启动 exe 时,即使用

& 'C:\gui.exe'

它在任务管理器中启动进程,但不会在会话中启动 GUI,所以我可以看到它。詹金斯会报错:

处理泄露的文件描述符。有关更多信息,请参阅http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build

但该页面没有解释如何定位特定的控制台会话并启动可见的 GUI。我错过了什么吗?帮助表示赞赏...

4

2 回答 2

0

我遇到了您报告的两个问题:未启动 GUI,以及文件描述符泄漏消息。这是我解决它们的方法。

问题 1 解决方案。不要将 Jenkins 作为服务启动。但默认情况下,Jenkins 使用系统帐户作为服务安装在 Windows 上。但是服务无法访问桌面,尤其是。系统帐户,它否定运行 GUI 应用程序。即使选中“允许服务与桌面交互”框也不够或更改服务的登录帐户。从命令行启动 Jenkins。

问题 2 解决方案。我做了两件事。首次添加

-Dhudson.util.ProcessTree.disable=true

命令行启动的参数。二、添加环境变量:

SET BUILD_ID=dontKillMe

我添加到詹金斯工作本身的工作。因此,虽然我对 Jenkins 作业有一个 Powershell 部分,但我也有一个“执行 Windows 批处理命令部分”,其中包含我放置在 Powershell 部分之前的 SET 命令。

顺便说一句,这里是完整的命令行启动,我把它放在一个批处理文件中:

CD "C:\Program Files (x86)\Jenkins"
java -Dhudson.util.ProcessTree.disable=true  -jar jenkins.war --httpListenAddress=127.0.0.1 --httpPort=8081 

碰巧我在 8080 上运行了其他东西,所以我改变了端口。

希望这可以帮助!

于 2014-08-08T15:38:31.753 回答
0

研究使我找到了这种解决方法,但这不是我问题的答案:

https://wiki.jenkins-ci.org/display/JENKINS/Tomcat

我在这里提供它是因为它会帮助我开始行动,并希望能帮助其他有同样问题的人,但不能完全解决问题。这意味着不允许 Jenkins 代理成为 Windows 服务。当我们打开浏览器弹出 jnlp 连接时,它可以在会话中启动 GUI,但如果弹出窗口关闭,服务器重新启动等,我们将失去连接,需要手动干预才能再次连接从站。该部分的解决方案是将 jnlp 代理的启动放入 Windows 调度程序以在登录时运行。或者偏执并编写一个脚本来检查它是否正在运行,如果没有,则启动它,然后每隔 x 分钟在调度程序上运行一次。

正如我所说,这可行,但它需要我返回环境并将从属代理的设置方式更改为不太健壮的模型。不理想,但它有效。

希望其他人可能有更好的解决方案(尽管 Jenkins/Hudson wiki 页面说这不太可能)。我不是要Jenkins解决方案,我更多的是寻找 PowerShell 解决方案,它允许我定位特定的控制台会话,但考虑到 PowerShell 通过 Jenkins(非交互式 shell)运行的独特方式。

于 2013-06-21T14:25:46.860 回答