停止/删除改为纯本地操作,页面不再查询 Gitea

停止只在本平台标记已取消、删除只删本地记录,均不再调用 GitHub/Gitea 的查询或取消接口,操作秒响应;构建状态完全以工作流结束回调为准,未收到回调的在途任务由纯本地 6 小时超时兜底。

移除上一版的 Gitea 网页登录取消、网页账密配置项、runs 批量状态查询及两后端 get_run/cancel_run 接口,消除页面加载时的远程等待。
This commit is contained in:
naeeo
2026-09-30 09:20:28 +08:00
parent c8f41a34c0
commit 6e5754fb59
7 changed files with 49 additions and 541 deletions
+20 -46
View File
@@ -32,9 +32,9 @@ def staff_required(view_func):
@login_required
def my_builds(request):
builds = list(GithubRun.objects.filter(created_by=request.user))
# 列表打开时并发同步在途任务的真实状态(带短节流,避免频繁刷页面拖慢)
from .views import refresh_active_runs
refresh_active_runs(builds)
# 仅做纯本地的 6 小时超时兜底,不向构建平台发起任何请求,页面秒开
from .views import mark_stale_builds
mark_stale_builds(builds)
return render(request, 'my_builds.html', {'builds': builds})
@@ -62,48 +62,24 @@ def delete_my_build(request, run_id):
@login_required
@require_POST
def stop_build(request, run_id):
"""停止自己的在途构建:调用构建平台取消运行,并把任务标记为已取消。"""
"""停止构建:仅在本平台把任务标记为已取消,不调用 GitHub/Gitea 的远程取消接口。
构建平台上的流水线可能仍在继续运行,需要真正停止时请到对应平台的运行页手动 Cancel。
"""
run = get_object_or_404(GithubRun, pk=run_id, created_by=request.user)
if run.is_finished():
messages.info(request, "该任务已经结束,无需停止。")
return redirect('my_builds')
if not run.github_run_id:
messages.error(request, "该任务尚未获得构建平台的运行编号,暂时无法停止,请稍后重试。")
return redirect('my_builds')
from . import build_backends
from .build_backends.base import BackendError
backend = build_backends.get_backend(run.backend or 'github')
try:
backend.cancel_run(run.github_run_id)
except BackendError as e:
if e.kind == 'finished':
# 平台侧已结束:立即拉一次真实状态,避免本地仍显示构建中
from .views import refresh_active_run
refresh_active_run(run, force=True)
if run.is_finished():
messages.info(request, f"构建平台上该任务实际已结束({run.status_label()}),列表状态已同步。")
else:
messages.error(request, str(e))
elif e.kind == 'missing':
# 平台上运行已被删除:本地直接标记取消,避免永远卡在构建中
run.status = 'cancelled'
run.save(update_fields=['status', 'updated_at'])
messages.info(request, "Gitea 上该运行已不存在(可能已被删除),已在本平台标记为已取消。")
elif e.kind == 'unsupported':
# 平台版本不支持远程取消(如 Gitea ≤ 1.27):给出运行页,本地状态保持构建中
log_link = backend.log_url(run.github_run_id)
messages.error(
request,
f"无法远程停止:{e.message} 运行页面:{log_link}",
)
else:
run.status = 'cancelled'
run.save(update_fields=['status', 'updated_at'])
tip = "已在本平台停止构建任务"
if run.github_run_id:
from . import build_backends
backend = build_backends.get_backend(run.backend or 'github')
tip += f"(仅本地标记;{run.backend_label}上的流水线若仍在运行,请前往运行页手动 Cancel:{backend.log_url(run.github_run_id)})"
else:
messages.error(request, f"停止失败:{e.message}")
return redirect('my_builds')
run.status = 'cancelled'
run.save(update_fields=['status', 'updated_at'])
messages.success(request, f"已请求{run.backend_label}停止构建任务「{run.filename or run.short_uuid()}」。")
tip += "(仅本地标记)"
messages.success(request, tip)
return redirect('my_builds')
@@ -170,9 +146,9 @@ def delete_token(request, key):
@staff_required
def dashboard(request):
builds = list(GithubRun.objects.select_related('created_by').all()[:100])
# 打开仪表盘时并发同步在途任务的真实状态(带短节流)
from .views import refresh_active_runs
refresh_active_runs(builds)
# 仅做纯本地的 6 小时超时兜底,不向构建平台发起任何请求,页面秒开
from .views import mark_stale_builds
mark_stale_builds(builds)
stats = {
'total': GithubRun.objects.count(),
'in_progress': GithubRun.objects.exclude(
@@ -318,7 +294,6 @@ _PLAIN_FIELDS = [
('GITEA_OWNER', 'gitea_owner'),
('GITEA_REPO', 'gitea_repo'),
('GITEA_BRANCH', 'gitea_branch'),
('GITEA_WEB_USERNAME', 'gitea_web_username'),
('GHUSER', 'ghuser'),
('REPONAME', 'reponame'),
('GHBRANCH', 'ghbranch'),
@@ -328,7 +303,6 @@ _PLAIN_FIELDS = [
# 密钥配置项:设置键 -> (输入字段名, 清除复选框字段名)
_SECRET_FIELDS = [
('GITEA_TOKEN', ('gitea_token', 'clear_gitea_token')),
('GITEA_WEB_PASSWORD', ('gitea_web_password', 'clear_gitea_web_password')),
('GITEA_PROXY', ('gitea_proxy', 'clear_gitea_proxy')),
('GHBEARER', ('ghbearer', 'clear_ghbearer')),
('ZIP_PASSWORD', ('zip_password', 'clear_zip_password')),