V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
CodeXx
V2EX  ›  程序员

求助 V 友! Jenkins 在 windows 服务器上启动 jar 包的问题

  •  1
     
  •   CodeXx · 2019-11-21 21:47:55 +08:00 · 4547 次点击
    这是一个创建于 1827 天前的主题,其中的信息可能已经有所发展或是发生改变。

    第一次接触 Jenkins,有多台 windows 服务器部署同一个 jar,想用一个 job 执行部署。通过 java-jar 的方式启动后控制台会一直输出内容,导致无法部署到下一台服务器。看网上的是都是 start javaw -jar 执行的,但是我用了 start 执行后服务器上没反应,jar 包没有启动。

    第 1 条附言  ·  2019-11-21 22:30:34 +08:00
    start 后加了 ping /n 50 127.1 >nul 相当于 sleep 了 50s,发现程序启动成功了,但是 50s 后又关闭了。
    应该是 Jenkins build 结束后会 kill 掉衍生进程。看了下要设置变量 BUILD_ID,研究下 batch 脚本怎么设置
    第 2 条附言  ·  2019-11-22 08:59:37 +08:00
    在 start 前加上 set BUILD_ID = dontKillMe 也没用。。
    32 条回复    2021-01-26 09:52:59 +08:00
    fonlan
        1
    fonlan  
       2019-11-21 22:30:36 +08:00 via Android
    windows 的话为啥不直接部署成服务模式?
    CodeXx
        2
    CodeXx  
    OP
       2019-11-21 22:52:17 +08:00
    @fonlan 感觉有点麻烦,实在不行再考虑吧
    xwbz2018
        3
    xwbz2018  
       2019-11-22 08:50:45 +08:00 via Android
    nohup 了解一下
    xwbz2018
        4
    xwbz2018  
       2019-11-22 08:51:21 +08:00 via Android
    @xwbz2018 噢,Windows,打扰了
    CodeXx
        5
    CodeXx  
    OP
       2019-11-22 08:52:38 +08:00
    @xwbz2018 Windows 上有 nohup 的插件。。但不想搞乱系统
    CodeXx
        6
    CodeXx  
    OP
       2019-11-22 09:00:06 +08:00
    啊啊啊,没人用 Jenkins 整 Windows 服务器的吗??
    xwbz2018
        7
    xwbz2018  
       2019-11-22 09:04:48 +08:00 via Android
    @CodeXx #5 start 加上再新建一个启动.bat ,里面直接 java -jar

    jenkins 脚本里 start 启动. bat

    应该可行
    CodeXx
        8
    CodeXx  
    OP
       2019-11-22 09:22:53 +08:00
    @xwbz2018 试过了,job 执行完后又把启动的 Java 进程关掉了
    CodeXx
        9
    CodeXx  
    OP
       2019-11-22 09:37:13 +08:00
    发现一个骚操作,把超时时间设为 20s,超时关闭连接的时候不会把启动的 Java 进程关掉
    julyclyde
        10
    julyclyde  
       2019-11-22 10:25:49 +08:00
    @CodeXx 你啥都不想搞,那你就继续享受“无法部署下一台”吧
    CodeXx
        11
    CodeXx  
    OP
       2019-11-22 10:37:50 +08:00
    @julyclyde 想啊,只是优先用常规的方式部署。实在不行再搞其他方法嘛
    CodeXx
        12
    CodeXx  
    OP
       2019-11-22 10:38:44 +08:00
    我就很纳闷了,网上都是直接 start 启动的,他们不会出现杀进程的情况吗
    julyclyde
        13
    julyclyde  
       2019-11-22 10:40:10 +08:00
    @CodeXx 常规情况大家不会用 windows 的
    CodeXx
        14
    CodeXx  
    OP
       2019-11-22 11:14:33 +08:00
    @julyclyde 额额,公司用的我也没办法,还 tm 十几台
    Elfred2096
        15
    Elfred2096  
       2019-11-22 12:03:17 +08:00
    这样试试?
    新建一个批处理 run.bat:
    @echo off

    start javaw -jar xx.jar

    exit
    tomczhen
        16
    tomczhen  
       2019-11-22 12:08:08 +08:00 via Android
    文档上不是有 install Jenkins as Windows service 这段吗?
    CodeXx
        17
    CodeXx  
    OP
       2019-11-22 12:58:42 +08:00
    @tomczhen 把 Jenkins 作为服务启动?现在是 war 包启动的,和这个有关?
    CodeXx
        18
    CodeXx  
    OP
       2019-11-22 12:58:52 +08:00
    @Elfred2096 试过了
    Firxiao
        19
    Firxiao  
       2019-11-22 13:51:16 +08:00
    你的问题应该是 Windows 如何在 cmd 下跑后台进程吧?
    帮你搜了下.
    https://superuser.com/questions/198525/how-can-i-execute-a-windows-command-line-in-background
    ```
    START /B program
    ```
    fonlan
        20
    fonlan  
       2019-11-22 13:58:50 +08:00 via Android
    @CodeXx 麻烦????启动 agent 的 jar 包后不是有个界面的么,界面左上角有个菜单,点下就安装成 windows 服务了啊,没有更简单的了吧
    CodeXx
        21
    CodeXx  
    OP
       2019-11-22 14:24:04 +08:00
    @Firxiao 试过了,start /b 启动一样的,会在任务结束后杀死进程
    CodeXx
        22
    CodeXx  
    OP
       2019-11-22 14:25:17 +08:00
    @fonlan 我以为是说把要部署的 jar 包搞成 Windows 服务来启动。Jenkins 作为 Windows 服务后可以解决这个问题吗?我去试下
    qweznmadmin
        23
    qweznmadmin  
       2019-11-23 14:24:31 +08:00
    @CodeXx 你这个问题是 jenkins 默认会在构建完成后杀死构建过程中由 jenkins 中的 shell 命令触发的衍生进程
    可以考虑关闭这个功能。
    话说你怎么解决下次部署的时候自动关闭程序。我是直接用 c#嵌套解决
    mmdsun
        24
    mmdsun  
       2019-11-23 19:13:15 +08:00 via Android
    启动外部.bat 即可。Jenkins 有个配置可以不杀死启动进程
    mmdsun
        25
    mmdsun  
       2019-11-23 19:18:09 +08:00 via Android
    BUILD_ID=dontKillMe /linedata/home/jenkins/auto_build.bat
    CodeXx
        26
    CodeXx  
    OP
       2019-11-25 09:13:40 +08:00
    @mmdsun 这样启动提示:'BUILD_ID' 不是内部或外部命令,也不是可运行的程序或批处理文件。
    CodeXx
        27
    CodeXx  
    OP
       2019-11-25 09:23:01 +08:00
    @qweznmadmin 用的是 batch 脚本,启动 Jenkins 的时候加了这个参数
    java -Dhudson.util.ProcessTree.disable=true -jar D:\Jenkins\jenkins.war
    但是没用。
    我现在的解决方案是把构建的超时时间设为 20s,超时后会断开 ssh,这样断开就不会杀死进程。然后又执行下一个服务器的操作,也算是实现了部署多台服务器了
    CodeXx
        28
    CodeXx  
    OP
       2019-11-25 09:35:28 +08:00
    @mmdsun batch 应该是
    set BUILD_ID = dontKillMe
    xxx.bat
    不过也没用
    mmdsun
        29
    mmdsun  
       2019-11-25 18:42:57 +08:00 via Android
    @CodeXx
    什么版本的?
    去 Windows batch command
    点击输入框下方的“可用环境变量”。

    jenkins 默认会在构建完成后杀掉构建过程中又 jenkins 中 shell 命令触发的衍生进程。jenkins 根据 BUILD_ID 识别某个进程是否为构建过程的衍生进程,故修改 BUILD_ID 后,jenkins 就无法识别是否为衍生进程,则此进程能在后台保留运行。
    CodeXx
        30
    CodeXx  
    OP
       2019-11-26 09:01:05 +08:00
    @mmdsun 官网最新的 war 包,在“可用环境变量”里有 BUILD_ID
    CodeXx
        31
    CodeXx  
    OP
       2019-11-26 09:04:01 +08:00
    @mmdsun 我的构建不是用的 Execute Windows batch command,我用的 Send File or excute commands over SSH
    lngg057
        32
    lngg057  
       2021-01-26 09:52:59 +08:00
    看官方文档,有描述。
    启动 war 包的时候,采用这种方式:java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war
    禁用 ProcessTree 即可避免自动杀进程
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3845 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 00:58 · PVG 08:58 · LAX 16:58 · JFK 19:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.