Files
BeacherZ 967d82685f fix(ci): 镜像内的自检改成真的 Python 断言,别 grep 算出来的字符串
NOTICE_TITLE 是 f"{PROJECT_NAME} 每日签到",文件里根本没有
'dailycheckin-plus 每日签到' 这个字面量,grep 必然失败 —— 和上一轮
'main.py 里的字面量其实在 message.py' 是同一类坑。这次直接 assert 常量值,
顺带把 main.py 的元信息检查也换成断言,本地已按 Dockerfile 里的原样命令跑通。
2026-10-15 20:56:17 -07:00

63 lines
3.4 KiB
Docker
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 自定义镜像:dailycheckin-plus —— 签到引擎 + 网页管理面板
# 引擎来自 https://github.com/Sitoi/dailycheckin(MIT),本项目在其之上加了管理后台
FROM python:3.9-slim
ENV LANG=C.UTF-8 \
PYTHONUNBUFFERED=1 \
PYTHONIOENCODING=utf-8 \
TZ=Asia/Shanghai \
DC_HOME=/dailycheckin \
PANEL_HOST=0.0.0.0 \
PANEL_PORT=8080
# cron 负责定时签到,tini 负责正确回收子进程
RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends cron tzdata tini; \
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime; \
echo "$TZ" > /etc/timezone; \
rm -rf /var/lib/apt/lists/*
# ---------- 1) 安装签到引擎(含 B 站接口修复)----------
# 构建期做一次自检:装不上、站点加载不出来就直接让构建失败,不要等运行时才发现。
# 顺序上必须先把 cwd 切走再删 /build —— 删掉当前工作目录会让 Python 的
# sys.path[0](空串 = cwd)指向不存在的路径,pkgutil.extend_path 会直接抛 FileNotFoundError。
WORKDIR /build
COPY pyproject.toml setup.py requirements.txt ./
COPY dailycheckin ./dailycheckin
RUN set -eux; \
pip install --no-cache-dir --upgrade pip setuptools wheel; \
pip install --no-cache-dir -r requirements.txt; \
pip install --no-cache-dir --no-deps .; \
python -c "import dailycheckin, dailycheckin.configs as c; print('引擎自检通过,已加载', len(c.checkin_map), '个站点模块')"; \
grep -q 'web-interface/newlist' "$(python -c 'import dailycheckin.bilibili.main as m; print(m.__file__)')"; \
echo 'B 站接口修复已生效'; \
python -c "import pathlib as p; s = p.Path('dailycheckin/main.py').read_text(encoding='utf-8'); assert 'PROJECT_URL' in s and 'PROJECT_NAME' in s, 'main.py 的引擎元信息没跟上'; print('引擎元信息自检通过')"; \
python -c "import dailycheckin.utils.message as m; assert m.PROJECT_NAME == 'dailycheckin-plus', m.PROJECT_NAME; assert m.NOTICE_TITLE.endswith('每日签到') and m.PROJECT_NAME in m.NOTICE_TITLE, m.NOTICE_TITLE; assert m.PROJECT_URL.endswith('/dailycheckin-plus'), m.PROJECT_URL; print('通知模块自检通过:', m.NOTICE_TITLE, m.PROJECT_URL)"; \
echo '通知模块修复已生效(恒定一条 + 标题带项目名 + 本项目地址)'; \
cd / && rm -rf /build
# ---------- 2) 放入网页管理面板(纯标准库实现,不需要安装)----------
WORKDIR ${DC_HOME}
COPY panel ./panel
# 网页里的品牌字样也断言一次:装进镜像的必须是改名后的版本,
# 别出现「源码改了名字、镜像里还是老页面」这种事。
RUN set -eux; \
grep -q 'dailycheckin-plus' panel/static/index.html; \
grep -q 'dailycheckin-plus' panel/paths.py; \
echo '面板品牌自检通过'
# 溯源信息:面板「设置 → 环境信息」里显示的引擎版本/上游提交就来自这里,
# 由 tools/sync_upstream.py 在同步上游时生成。
COPY UPSTREAM.json ./UPSTREAM.json
COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
EXPOSE 8080
VOLUME ["/dailycheckin/config", "/dailycheckin/cron", "/dailycheckin/logs", "/dailycheckin/data"]
HEALTHCHECK --interval=30s --timeout=6s --start-period=15s --retries=3 \
CMD python -c "import os,urllib.request;urllib.request.urlopen('http://127.0.0.1:'+os.environ.get('PANEL_PORT','8080')+'/api/health',timeout=5)" || exit 1
ENTRYPOINT ["/usr/bin/tini", "--", "/usr/local/bin/entrypoint.sh"]