feat(upstream): 上游更新检查——定期比上游、落后了推企业微信
本仓库在上游 MediaCrawler 之上加了一整层(见 UPSTREAM.md),可合并流程默认 「有人知道上游动了」。而部署是 git pull --ff-only,只从自己的 Gitea 拉——上游的 提交不主动 fetch 就永远看不见。拖着不合并的代价是复利的:越久越难合。 于是把「上游动了没有」变成一条会自己跑、会推企业微信的通知: * api/monitor/upstream.py:git fetch <url> <branch> 到 FETCH_HEAD,用 rev-list --count HEAD..FETCH_HEAD 算落后数、FETCH_HEAD..HEAD 算领先数。 用 git 而非托管商 API,因为只有 git 知道共同祖先在哪——本仓库含有上游没有的 提交,直接比 tip 会得出错误结论。增量 fetch 只传几个新提交,不会遇到 UPSTREAM.md 里说的「大包必断」。 * 只 fetch 到 FETCH_HEAD:不配 remote、不写 refs/remotes、不碰索引与工作区, 所以不打断正在跑的采集,也不和 deploy.sh 的 git pull 抢锁。 * 挂在调度器 tick 上(不是采集,所以不看 is_busy、不受活跃时段限制——定时检查 放在半夜反而最合适),按 checked_at + 间隔 到期才跑;失败也写 checked_at, 于是 GitHub 不通时是每间隔重试一次,而不是每个 tick 撞一次墙。 * 同一个 tip 只推一次(记 tip 而不是「推过没」),上游真又动了会再推。 * 两个接口:GET /monitor/upstream 只读缓存;POST /monitor/upstream/check 手动 查一次且刻意不推通知——点按钮的人正看着结果。 * 默认关闭,间隔默认一天。 Dockerfile 显式装 git(python:slim 不带,而这是唯一的依赖);deploy.sh 顺带补上 一个真 bug 的提示:Dockerfile/requirements.txt 变了只 up -d 用的还是旧镜像。
This commit is contained in:
+30
-1
@@ -24,7 +24,7 @@ from typing import Any, Dict, List, Optional
|
||||
from fastapi import APIRouter, HTTPException, Query, Response
|
||||
from fastapi.responses import FileResponse
|
||||
|
||||
from ..monitor import covers, notify, qrlogin, report, service
|
||||
from ..monitor import covers, notify, qrlogin, report, service, upstream
|
||||
from ..monitor.db import get_session
|
||||
from ..monitor.platforms import PLATFORM_XHS
|
||||
from ..monitor.settings import (
|
||||
@@ -596,3 +596,32 @@ async def test_webhook(payload: WebhookTestPayload):
|
||||
if not ok:
|
||||
raise HTTPException(status_code=400, detail=detail)
|
||||
return {"message": detail}
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 上游更新
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
@router.get("/upstream")
|
||||
async def get_upstream_status():
|
||||
"""最近一次上游检查的结果。
|
||||
|
||||
只读缓存,不触发检查:fetch 要走网络、最长两分钟,不该由一个 GET 顺手发起。
|
||||
没有查过时返回空对象,前端据此显示「尚未检查」。
|
||||
"""
|
||||
async with get_session() as session:
|
||||
return await upstream.load_state(session)
|
||||
|
||||
|
||||
@router.post("/upstream/check")
|
||||
async def run_upstream_check():
|
||||
"""立刻检查一次上游仓库,并把结果写回缓存。
|
||||
|
||||
即使「定期检查」开关是关的也照查 —— 手动点这一次的意义正在于此。这里会一直
|
||||
等到 fetch 结束(前端给这条请求单独放长了超时),因为结果就是要给人看的。
|
||||
|
||||
``notify_when_new=False``:点这个按钮的人正看着结果,没必要再给自己推一条群消息。
|
||||
没有推过的那批提交会留给下一次「定时检查」推 —— 推送状态记的是 tip,不是「推过没」。
|
||||
"""
|
||||
return await upstream.run_check(notify_when_new=False)
|
||||
|
||||
Reference in New Issue
Block a user