【问题标题】:How to Run http-server command on Jenkins Job如何在 Jenkins Job 上运行 http-server 命令
【发布时间】:2022-08-23 13:49:45
【问题描述】:

我想在 jenkins 上运行命令 http-server 命令。这是一个连续运行的命令,在我们执行 CTRL+C 之前它永远不会断开连接。发生的情况是作业失败,因为命令永远不会完成。任何解决方案。我希望服务器运行并且詹金斯工作能够成功任何解决方案?

更新:我在python中使用os库制作了一个脚本并在那里配置了命令并运行该脚本这对我有用

    标签: ubuntu jenkins google-cloud-platform


    【解决方案1】:

    任何由 Jenkins 执行的命令产生的进程都将是 Jenkins 进程的子节点。根据设计,Jenkins 会在构建完成后终止构建所典当的所有进程。

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

    export BUILD_ID=dontKillMe
    

    Pipeline 项目需要类似的环境变量设置。

    export JENKINS_NODE_COOKIE=dontKillMe
    

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

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

    最近,Jenkins 项目也建议使用守护进程包装器。

    daemonize -E BUILD_ID=dontKillMe http-server
    

    您还可以实现消息队列或其他异步服务

    【讨论】:

    • 这很有趣,但是如果构建脚本依赖于BUILD_ID 怎么办?让 HTTP 服务器永久运行似乎仍然是最可靠的方法,因为手头的问题将变成非问题。
    • 我应该在哪里将此行添加到工作中的执行外壳?
    • @MartinZeitler Jenkins 将在构建完成后终止在构建执行期间产生的任何进程。在后台运行、使用 nohup 运行等将不起作用。除了实现消息队列或执行 shell 命令的某种类型的同步服务之外,这是唯一的方法。您可以从十几个不同的地方获取您的构建 ID(下划线 SDK、对您的工作的 API 调用等)。您也可以在设置 envar 之前将构建 ID 保存在变量中。
    • @MartinZeitler 但总的来说我不同意你的看法。我个人不使用这种方法,但我认为如果您使用 Jenkins 作业来启动服务,您应该实现适当的队列
    • @RamKumarK 是的,您添加以在工作中执行 shell 脚本步骤。如果我的回答对你有用,请点赞并接受
    【解决方案2】:

    您如何将命令作为后台进程执行?

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

    【讨论】:

    • 实际上最好将标准输出通过管道传输到日志文件;用& 分离控制台是重要的部分。
    【解决方案3】:

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

    【讨论】:

    • 我尝试在最后添加 & 但服务器没有运行
    猜你喜欢
    • 2016-11-25
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 2019-10-31
    相关资源
    最近更新 更多