From 6249c9252837a9ecbe0290c722b6bc755a622753 Mon Sep 17 00:00:00 2001 From: Aimili Date: Thu, 27 Aug 2026 20:44:58 +0800 Subject: [PATCH] release: prepare v2.1.4 --- .github/workflows/release.yml | 4 ++-- RELEASE_NOTES.md | 16 +++++++++++----- VERSION | 2 +- install.sh | 4 ++-- tests/test_manager_logic.py | 12 ++++++------ vpngate_manager.py | 8 ++++---- 6 files changed, 26 insertions(+), 20 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 755a4da..aba1da6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,9 +7,9 @@ on: workflow_dispatch: inputs: release_tag: - description: Existing formal tag to publish, for example v2.1.3 + description: Existing formal tag to publish, for example v2.1.4 required: true - default: v2.1.3 + default: v2.1.4 type: string concurrency: diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 29bcecf..ac8fac0 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,6 +1,12 @@ -# AimiliVPN V2.1.3 正式版 +# AimiliVPN V2.1.4 正式版 -V2.1.3 是一次完整的稳定性、安全性和节点识别修复版本。重点解决节点切换期间状态显示过早、未知网络误判住宅、部分 VPS 节点源回退不合理,以及安装卸载残留等问题。 +V2.1.4 包含 V2.1.3 的全部稳定性、安全性和节点识别改进,并修复正式版重新安装验收中发现的手动断开状态遗漏。 + +## V2.1.4 热修复 + +- 修复点击“断开连接”后 OpenVPN、活动节点和 table 100 已清理,但 Web API 的 `tunnel_ready` / `proxy_ready` 仍短暂保留为 `true` 的问题。 +- 手动断开现在统一复用完整连接状态清理流程;活动节点、连接中状态、隧道、代理出口、出口 IP 与路由规则会同步归零。 +- 新增手动断开状态回归测试,并在真实 VPS 上完成断开与重新连接复验。 ## IP 类型识别 @@ -31,7 +37,7 @@ V2.1.3 是一次完整的稳定性、安全性和节点识别修复版本。重 ## 验证与兼容性 -- 本地 Python 单元测试 51/51 通过,Python 编译、Dashboard JavaScript 语法、安装脚本语法和补丁格式检查通过。 +- 本地 Python 单元测试 52/52 通过,Python 编译、Dashboard JavaScript 语法、安装脚本语法和补丁格式检查通过。 - Ubuntu 22.04 x86_64 VPS 已完成真实卸载、重新安装、节点源、连接切换、代理出口、Web API、权限和路由残留验证。 - 发布流水线会在 Python 3.9、3.11、3.13 上运行完整测试。 - Docker 会分别构建验证 `linux/amd64`、`linux/386`、`linux/arm64`、`linux/arm/v7`,并发布统一多架构镜像清单。 @@ -44,8 +50,8 @@ V2.1.3 是一次完整的稳定性、安全性和节点识别修复版本。重 ## 下载与更新 -- GitHub Release:`aimilivpn-v2.1.3-linux-source.tar.gz` 和 `sha256sums.txt`。 -- GHCR:`2.1.3`、`2.1`、`latest` 多架构镜像标签。 +- GitHub Release:`aimilivpn-v2.1.4-linux-source.tar.gz` 和 `sha256sums.txt`。 +- GHCR:`2.1.4`、`2.1`、`latest` 多架构镜像标签。 Python 源码安装更新: diff --git a/VERSION b/VERSION index ac2cdeb..7d2ed7c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.1.3 +2.1.4 diff --git a/install.sh b/install.sh index c27f7dd..f46cd12 100644 --- a/install.sh +++ b/install.sh @@ -204,9 +204,9 @@ def get_app_version(): try: with open(os.path.join(INSTALL_DIR, "VERSION"), "r", encoding="utf-8") as f: version = f.read().strip().lstrip("vV") - return version or "2.1.3" + return version or "2.1.4" except Exception: - return "2.1.3" + return "2.1.4" def load_ui_cfg(): import json diff --git a/tests/test_manager_logic.py b/tests/test_manager_logic.py index 78d57c8..4954770 100644 --- a/tests/test_manager_logic.py +++ b/tests/test_manager_logic.py @@ -828,8 +828,8 @@ class ManagerLogicTests(unittest.TestCase): self.assertEqual(519, entries[-1]["index"]) def test_web_update_controls_only_expose_stable_main_channel(self) -> None: - self.assertEqual("2.1.3", manager.APP_VERSION) - self.assertEqual("V2.1.3 正式版", manager.APP_VERSION_LABEL) + self.assertEqual("2.1.4", manager.APP_VERSION) + self.assertEqual("V2.1.4 正式版", manager.APP_VERSION_LABEL) self.assertIn("检测更新", manager.INDEX_HTML) self.assertIn("/api/check_update", manager.INDEX_HTML) self.assertIn("/tree/main", manager.INDEX_HTML) @@ -874,7 +874,7 @@ class ManagerLogicTests(unittest.TestCase): def test_release_workflow_uses_full_patch_version(self) -> None: workflow_text = (manager.ROOT_DIR / ".github" / "workflows" / "release.yml").read_text(encoding="utf-8") - self.assertIn("default: v2.1.3", workflow_text) + self.assertIn("default: v2.1.4", workflow_text) self.assertIn("AimiliVPN V$(tr -d '\\r\\n' < VERSION) 正式版", workflow_text) self.assertNotIn("cut -d. -f1,2 VERSION", workflow_text) @@ -901,8 +901,8 @@ class ManagerLogicTests(unittest.TestCase): def test_latest_release_check_reports_current_formal_version(self) -> None: release = { - "tag_name": "v2.1.3", - "name": "AimiliVPN V2.1.3 正式版", + "tag_name": "v2.1.4", + "name": "AimiliVPN V2.1.4 正式版", "draft": False, "prerelease": False, } @@ -910,7 +910,7 @@ class ManagerLogicTests(unittest.TestCase): result = manager.check_latest_release() self.assertFalse(result["update_available"]) - self.assertEqual("V2.1.3 正式版", result["current_version_label"]) + self.assertEqual("V2.1.4 正式版", result["current_version_label"]) def test_latest_release_check_reports_source_update_command(self) -> None: release = {"tag_name": "v2.2.0", "draft": False, "prerelease": False} diff --git a/vpngate_manager.py b/vpngate_manager.py index d2d20f0..2c8e225 100644 --- a/vpngate_manager.py +++ b/vpngate_manager.py @@ -141,7 +141,7 @@ UPDATE_COMMAND = ( ) ROOT_DIR = Path(sys.executable).resolve().parent if globals().get("__compiled__") else Path(__file__).resolve().parent -DEFAULT_APP_VERSION = "2.1.3" +DEFAULT_APP_VERSION = "2.1.4" try: _version_text = (ROOT_DIR / "VERSION").read_text(encoding="utf-8").strip() except OSError: @@ -4165,12 +4165,12 @@ INDEX_HTML = r"""