JumpServer 远程应用发布:升级 DBeaver 到最新版本(适配无 dbeaver-cli.exe)

JumpServer 远程应用发布:升级 DBeaver 到最新版本(适配无 dbeaver-cli.exe)
JumpServer 的应用市场提供了 DBeaver 社区版的发布包但版本停留在 22.3.4。本文记录如何将其升级到最新的 DBeaver 版本并解决新版中dbeaver-cli.exe被移除带来的兼容性问题。1. JumpServer 远程应用 ZIP 包结构JumpServer 的远程应用发布依赖一套约定的 ZIP 包格式。上传到应用市场后JumpServer 服务端根据包内的声明文件自动完成软件安装和连接启动两个阶段。一个标准的 DBeaver 应用 ZIP 包含以下文件dbeaver/ ├── manifest.yml # 元数据名称、版本、支持的协议 ├── setup.yml # 安装指令下载源、静默安装参数、目标路径 ├── patch.yml # 补丁安装指令 ├── main.py # 入口点接收连接参数启动应用 ├── app.py # 核心逻辑配置 DBeaver、拼接连接串、启动进程 ├── common.py # 工具库base64 解码、数据模型、进程管理 ├── icon.png # 应用图标 ├── config/ │ └── drivers.xml # 数据库驱动模板 └── README.md关键文件是setup.yml管安装和app.py管启动。2. 旧版的安装与启动流程2.1 setup.yml — 自动下载安装type:exesource:jms:///download/applets/dbeaver-ce-22.3.4-x86_64-setup.exearguments:-/S-/allusersdestination:C:\Program Files\DBeaverprogram:C:\Program Files\DBeaver\dbeaver-cli.exemd5:EDA4440D4E32312DD25C9CE5289A228EJumpServer 服务端读取此文件后从内部文件服务器jms://协议下载dbeaver-ce-22.3.4-x86_64-setup.exe在远程应用宿主机上静默执行dbeaver-ce-22.3.4-x86_64-setup.exe /S /allusers校验md5确认安装到C:\Program Files\DBeaver2.2 app.py — 连接启动_default_pathrC:\Program Files\DBeaver\dbeaver-cli.exe# ...exec_string%s -con %s%(self.path,params)retsubprocess.Popen(exec_string,startupinfostartupinfo)当用户通过 JumpServer 连接数据库时JumpServer 将连接信息主机、端口、账号、密码、数据库名等序列化为 JSONbase64 编码作为命令行参数传给main.pyapp.py解析参数拼出 DBeaver CLI 连接串执行dbeaver-cli.exe -con name...|driver...|host...|port...|user...|password...|connecttrue轮询 PID 等待用户关闭 DBeaver 后退出会话3. 升级遇到的问题3.1 dbeaver-cli.exe 已被移除从DBeaver 25.2.3起Windows 安装包不再包含dbeaver-cli.exeGitHub Issue #39488。这意味着旧版app.py中的_default_path指向的文件不存在应用无法启动。3.2 解决方案dbeaver.exe 直接替代好消息是dbeaver.exe本身完全支持同样的-con参数连接串格式没有任何变化dbeaver.exe-condrivermysql|host127.0.0.1|port3306|databasetest|userroot|passwordxxx|nametest|connecttrue唯一区别dbeaver-cli.exe是控制台程序dbeaver.exe是 GUI 程序因此启动方式需要调整去掉CREATE_NEW_CONSOLE和SW_HIDE。4. 实战制作新版手动安装包整体思路将setup.yml改为manual类型让 JumpServer 跳过自动下载安装同时修改app.py适配新版 DBeaver。Step 1修改 setup.yml# 修改前type:exesource:jms:///download/applets/dbeaver-ce-22.3.4-x86_64-setup.exearguments:-/S-/allusersdestination:C:\Program Files\DBeaverprogram:C:\Program Files\DBeaver\dbeaver-cli.exemd5:EDA4440D4E32312DD25C9CE5289A228E# 修改后type:manualsource:arguments:[]destination:C:\Program Files\DBeaverprogram:C:\Program Files\DBeaver\dbeaver.exetype: manual告诉 JumpServer跳过下载和安装步骤直接使用program路径启动应用。source、arguments、md5均可清空。Step 2修改 patch.yml同理补丁安装也改为 manual# 修改前type:msisource:jms:///download/applets/dbeaver-patch-22.3.4-x86_64-setup.msiarguments:-/quietdestination:# 修改后type:manualsource:arguments:[]destination:Step 3修改 app.py两处改动① 默认路径# 修改前_default_pathrC:\Program Files\DBeaver\dbeaver-cli.exe# 修改后_default_pathrC:\Program Files\DBeaver\dbeaver.exe② 启动方式# 修改前 — 控制台程序需要隐藏窗口startupinfosubprocess.STARTUPINFO()startupinfo.dwFlagssubprocess.CREATE_NEW_CONSOLE|subprocess.STARTF_USESHOWWINDOW startupinfo.wShowWindowsubprocess.SW_HIDE exec_string%s -con %s%(self.path,params)retsubprocess.Popen(exec_string,startupinfostartupinfo)# 修改后 — GUI 程序不需要这些直接 Popenexec_string%s -con %s%(self.path,params)retsubprocess.Popen(exec_string)dbeaver.exe是 GUI 程序不需要CREATE_NEW_CONSOLE创建控制台窗口也不需要SW_HIDE隐藏。Step 4更新 manifest.yml 版本号可选version:25.2.5# 写你实际安装的版本Step 5打包 ZIPzip-rdbeaver-jumpserver-v25.zip dbeaver/-x*.DS_Store__pycache__/**.pycStep 6手动安装 DBeaver 上传在远程应用 Windows 宿主机上手动安装新版 DBeaver到C:\Program Files\DBeaver将打包好的 ZIP 上传到 JumpServer 应用市场5. 潜在风险与验证5.1 进程存活检测app.py的wait()方法通过tasklist轮询dbeaver.exe的 PID 来判断用户是否关闭了 DBeaverdefwait(self):wait_pid(self.pid)# 每 5 秒检查一次 PID 是否存活dbeaver-cli.exe作为控制台程序会在 GUI 打开期间一直存活。dbeaver.exe是 GUI 程序通常也是这样但某些情况下主进程可能启动后立即退出、实际窗口在子进程中。建议先在远程机上验证# 启动 DBeaver 并记下 PIDdbeaver.exe-condrivermysql|host127.0.0.1|port3306|databasetest|userroot|passwordxxx|nametest|connecttrue# 另开终端检查进程tasklist|findstr dbeaver如果dbeaver.exe进程在窗口关闭前一直存在就没问题。如果启动后立即退出需要调整wait()逻辑比如用-reuseWorkspace或进程名匹配。5.2 workspace 路径兼容性app.py中写死了workspace6self.app_work_pathrC:\Users\%s\AppData\Roaming\DBeaverDatadriver_yml_pathos.path.join(self.app_work_path,workspace6,.metadata,.config)DBeaver 25.x 的 workspace 目录是workspace6还是更高版本如workspace7需要在新版安装后确认%APPDATA%\DBeaverData\如果路径变了需要修改app.py中init_driver_config()和init_other_config()里的 workspace 路径。5.3 驱动 XML 兼容性config/drivers.xml是从 DBeaver 22.3.4 导出的驱动模板。新版 DBeaver 的drivers.xml结构如果发生了变化_merge_driver_xml()方法可能出问题。如果遇到驱动加载异常可以从新版 DBeaver 安装目录导出drivers.xml替换config/drivers.xml。5.4 连接参数兼容性-con参数格式在 22.x 到 25.x 之间基本保持稳定。已验证的参数参数说明name连接名称driver驱动 IDmysql, postgresql, oracle 等host数据库主机port端口database数据库名user用户名password密码save是否保存连接false表示临时连接connect创建后是否立即连接6. 总结项目改动setup.ymltype: exe→type: manualprogram改为dbeaver.exepatch.ymltype: msi→type: manualapp.py_default_path改为dbeaver.exe去掉CREATE_NEW_CONSOLESW_HIDEmanifest.ymlversion更新为实际版本号整个过程核心思路就是把自动安装改为手动安装同时用dbeaver.exe替代已移除的dbeaver-cli.exe。两者接受的-con参数格式完全一致改动量很小。如果 JumpServer 远程应用宿主机上有多个 DBeaver 版本也可以不用manual模式而是保持type: exe把新版安装包上传到 JumpServer 文件服务器并更新source和md5这样就可以继续享受自动安装的便利——只是需要确认新版安装包仍然支持/S /allusers静默参数。