feat: 版本号管理、构建日志持久化、App_Store 构建号自动递增

- 新增版本号配置 API(GET/PUT /api/config/versions)和前端管理界面
- 构建日志收集与保存:任务完成/取消/失败时写入 build.log
- 新增任务日志查询接口 GET /api/tasks/{task_id}/log
- App_Store 打包时自动递增 Build_Ver 第四位版本号
- 从 Provisioning Profile 自动提取 TEAM_ID 和 PROVISIONING_NAME
- 前端完成后支持查看完整构建日志
This commit is contained in:
shen
2026-06-08 11:23:15 +08:00
parent 898ec01560
commit 75363ee276
6 changed files with 243 additions and 15 deletions
+31 -1
View File
@@ -173,6 +173,27 @@ const fetchTaskDetail = async (taskId) => {
}
}
const fetchBuildLog = async (taskId) => {
try {
const res = await fetch(`/api/tasks/${taskId}/log`)
if (res.ok) {
const data = await res.json()
if (data.log) {
const lines = data.log.split('\n').filter(Boolean)
logs.value = lines.map(line => {
const m = line.match(/^\[(.+?)\]\s+\[(.+?)\]\s+(.*)$/)
if (m) {
return { timestamp: m[1], level: m[2].toLowerCase(), message: m[3] }
}
return { timestamp: '', level: 'info', message: line }
})
}
}
} catch (e) {
// ignore
}
}
const connectWs = (taskId) => {
if (activeWs) {
activeWs.close()
@@ -215,6 +236,12 @@ const connectWs = (taskId) => {
}
}
}
ws.onclose = () => {
// WebSocket 关闭后,尝试从服务器获取完整日志
if (logs.value.length === 0) {
fetchBuildLog(taskId)
}
}
}
watch(() => currentTaskId.value, (newId) => {
@@ -248,7 +275,10 @@ onMounted(async () => {
// 已完成/失败的任务,直接显示结果
if (task.status === 'completed' || task.status === 'failed' || task.status === 'cancelled') {
completedTask.value = task
logs.value = [{ timestamp: task.completed_at || task.created_at, level: task.status === 'failed' ? 'error' : 'step', message: task.status === 'failed' ? `打包失败: ${task.error_message || ''}` : '打包完成' }]
await fetchBuildLog(queryTaskId)
if (!logs.value.length) {
logs.value = [{ timestamp: task.completed_at || task.created_at, level: task.status === 'failed' ? 'error' : 'step', message: task.status === 'failed' ? `打包失败: ${task.error_message || ''}` : '打包完成' }]
}
}
// 设置 currentTaskId(触发 watch → connectWs,用 flag 跳过)
skipNextConnect = true