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:
@@ -53,6 +53,7 @@ from .settings import (
|
||||
set_setting,
|
||||
system_key,
|
||||
)
|
||||
from .upstream import DEFAULT_BRANCH, DEFAULT_REMOTE_URL
|
||||
|
||||
SCOPE_PLATFORM = "platform"
|
||||
SCOPE_SYSTEM = "system"
|
||||
@@ -216,6 +217,61 @@ SETTING_SPECS: List[SettingSpec] = [
|
||||
),
|
||||
default=False,
|
||||
),
|
||||
# --- 上游更新检查 -------------------------------------------------------
|
||||
# 这几项不作用于采集,所以都标 affects_new_runs=False:改动它们不需要等下一轮,
|
||||
# 也不影响采集命令的拼装。
|
||||
SettingSpec(
|
||||
name="upstream_check_enabled",
|
||||
scope=SCOPE_SYSTEM,
|
||||
type=TYPE_BOOL,
|
||||
label="检查上游仓库更新",
|
||||
help=(
|
||||
"定期 fetch 上游仓库,看看它有没有新提交,并在有更新时推送通知。"
|
||||
"本仓库在上游之上加了一整层(见 UPSTREAM.md),不定期看一眼就会越拖越难合并。"
|
||||
),
|
||||
default=False,
|
||||
affects_new_runs=False,
|
||||
),
|
||||
SettingSpec(
|
||||
name="upstream_check_interval_minutes",
|
||||
scope=SCOPE_SYSTEM,
|
||||
type=TYPE_INT,
|
||||
label="上游检查间隔(分钟)",
|
||||
help="默认 1440 分钟(每天一次)。检查只是 fetch,不需要太频繁。",
|
||||
default=1440,
|
||||
minimum=30,
|
||||
maximum=10080,
|
||||
affects_new_runs=False,
|
||||
),
|
||||
SettingSpec(
|
||||
name="upstream_remote_url",
|
||||
scope=SCOPE_SYSTEM,
|
||||
type=TYPE_STR,
|
||||
label="上游仓库地址",
|
||||
help=(
|
||||
"默认是 GitHub 上的上游。国内直连 GitHub 不稳时改成 gitcode 镜像"
|
||||
"(见 UPSTREAM.md),或任意能访问到上游的地址。"
|
||||
),
|
||||
default=DEFAULT_REMOTE_URL,
|
||||
affects_new_runs=False,
|
||||
),
|
||||
SettingSpec(
|
||||
name="upstream_branch",
|
||||
scope=SCOPE_SYSTEM,
|
||||
type=TYPE_STR,
|
||||
label="上游分支",
|
||||
default=DEFAULT_BRANCH,
|
||||
affects_new_runs=False,
|
||||
),
|
||||
SettingSpec(
|
||||
name="upstream_notify",
|
||||
scope=SCOPE_SYSTEM,
|
||||
type=TYPE_BOOL,
|
||||
label="上游有更新时推送通知",
|
||||
help="只在出现此前没推过的上游提交时发一条,同一个更新不会反复推。",
|
||||
default=True,
|
||||
affects_new_runs=False,
|
||||
),
|
||||
]
|
||||
|
||||
SPECS_BY_NAME = {spec.name: spec for spec in SETTING_SPECS}
|
||||
|
||||
Reference in New Issue
Block a user