停止/删除改为纯本地操作,页面不再查询 Gitea
停止只在本平台标记已取消、删除只删本地记录,均不再调用 GitHub/Gitea 的查询或取消接口,操作秒响应;构建状态完全以工作流结束回调为准,未收到回调的在途任务由纯本地 6 小时超时兜底。 移除上一版的 Gitea 网页登录取消、网页账密配置项、runs 批量状态查询及两后端 get_run/cancel_run 接口,消除页面加载时的远程等待。
This commit is contained in:
+20
-46
@@ -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')),
|
||||
|
||||
Reference in New Issue
Block a user