feat: 上架版本号按分支拆分,master / develop 各自独立

原来 master 与 develop 共用一条 release 轨,版本号和构建号绑在一起。
现改为每个上架分支各有一条轨道(轨道名即分支名),自测分支仍共用 feature 轨。

- 轨道记录新增 kind(release/feature),branch_track 存轨道名
- 旧的共用 release 轨及更早的单轨结构,加载时自动按上架分支拆开,
  已用构建号原样复制,拆分后各分支从原来的号继续递增
- 构建号递增时跨上架轨取同一 App_Ver 的最大值 +1:App Store 的构建号
  唯一性按 MARKETING_VERSION 全局判定,避免两分支同版本号时重号被拒
- 分支管理页轨道选择改为「上架(本分支独立版本号)/ 自测(共用)」,
  打包设置页按上架分支分块填写版本号

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJaZ913U5GVdTkYHiRpvDU
This commit is contained in:
shenlei
2026-09-02 10:32:43 +09:00
co-authored by Claude Opus 5
parent dae14a8a10
commit bf7a5a0449
9 changed files with 430 additions and 189 deletions
+12 -12
View File
@@ -610,7 +610,7 @@ async def generate_config(task_id: str, task, build_dir: Path) -> dict:
from ..routers.config import (
load_config, _config_lock, get_track, get_track_name, track_build_ver,
TRACK_RELEASE, _new_track,
is_release_track, next_build_no, _ensure_track,
)
config = load_config()
@@ -621,29 +621,29 @@ async def generate_config(task_id: str, task, build_dir: Path) -> dict:
scheme = schemes.get(task.scheme_id, {})
# 版本号由当前服务配置统一管理,不读取分支源码中的手动打包脚本。
# 按分支所属轨道取版本号:master/develop 走 release 轨(上架用),feature 走 feature 轨(自测用)
# 两条轨道的 App_Ver 各自独立
# 按分支所属轨道取版本号:每个上架分支(masterdevelop 等)一条独立轨道
# 自测分支共用 feature 轨,各轨道的 App_Ver 互不影响
track_name = get_track_name(config, task.branch)
track = get_track(config, track_name)
app_ver = track.get("app_ver") or "2.180.0"
# 构建号按版本号独立记录:build_map[app_ver] 为该版本号已用到的最大第四位。
build_ver = track_build_ver(track)
is_release = is_release_track(track)
await log_streamer.emit(
task_id,
f"版本轨道: {track_name}{'上架,App_Store 打包自增' if track_name == TRACK_RELEASE else '自测,构建号不自增'}",
f"版本轨道: {track_name}{'上架,App_Store 打包自增' if is_release else '自测,构建号不自增'}",
)
# release 轨的 App_Store 打包,在该版本号自己的构建号上 +1
# (回退到旧版本号也从它自己的最大值继续);feature 轨始终使用手动设定的构建号。
if track_name == TRACK_RELEASE and task.build_type == "App_Store":
# 上架轨的 App_Store 打包,在该版本号的构建号上 +1(回退到旧版本号也从它自己的最大值继续);
# feature 轨始终使用手动设定的构建号。
if is_release and task.build_type == "App_Store":
async with _config_lock:
config = load_config()
tracks = config.setdefault("versions", {}).setdefault("tracks", {})
track = tracks.setdefault(track_name, _new_track(app_ver))
build_map = track.setdefault("build_map", {})
n = int(build_map.get(app_ver, 0)) + 1
build_map[app_ver] = n
track = _ensure_track(config, track_name)
track.setdefault("app_ver", app_ver)
n = next_build_no(config["versions"]["tracks"], app_ver)
track.setdefault("build_map", {})[app_ver] = n
build_ver = f"{app_ver}.{n}"
from ..routers.config import save_config