如何在Jenkins Job上运行http服务器命令



我想在jenkins上运行命令http server命令。这是一个连续运行的命令,在我们按下CTRL+C之前,它永远不会断开连接。由于命令从未完成,因此作业失败。任何解决方案。我想让服务器运行,让詹金斯的工作成功,有什么解决方案吗??

更新:我使用python中的操作系统库制作了一个脚本,并在那里配置了命令并运行了该脚本,这对我来说很有效

Jenkins ProcessTreeKiller

在Jenkins作业或管道中执行的命令产生的任何进程都将是相应Jenkins构建节点的子进程。根据设计,一旦构建完成,Jenkins就会杀死构建产生的所有子进程。

此功能称为ProcessTreeKiller。对于Freestyle作业,Jenkins文档传统上建议在作业的Execute Shell步骤中设置以下环境变量。

export BUILD_ID=dontKillMe

管道项目需要类似的环境变量。

export JENKINS_NODE_COOKIE=dontKillMe

如果您想全局禁用此功能,可以使用以下Java系统属性

java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war

最近,Jenkins项目文档建议将守护进程包装器与适当的环境变量结合使用。

daemonize -E BUILD_ID=dontKillMe http-server

如果上述选项都不适合您的特定用例,您可以开发Jenkins项目,将消息发布到消息队列。然后,您可以让使用者作为服务运行,该服务使用您的消息并根据消息指令执行命令。

发布脚本

在关于修改Freestyle作业中的BUILD_ID环境变量的评论中提出了一个问题。

虽然这是未记录的并且可能被弃用,但我相信您可以使用以下环境变量来防止ProcessTreeKiller杀死您的Freestyle Job的子进程。

export JENKINS_SERVER_COOKIE=dontKillMe 

作为后台进程执行命令怎么样?

http-server > /dev/null 2>&1 & 

不要使用CtrlC,而是使用CtrlZ1或使用&分离控制台(第二个选项更适合脚本编写(。在Jenkins上,您可能还想获得该进程的PID,以便再次杀死它;否则,每次构建都会产生一个新的进程。设置Apache或Ngnix可能会提供更可靠的体验;否则,您将不得不处理PID,而不仅仅是部署(无论如何,脚本最终都不会在http-server上运行(。

最新更新