用户两项要求:开源页 Projects「依旧采取居中即可,不用左对齐」;README 迁移后
「很多图片元素还有一些 svg 基本上都摒弃了,可以在 readme 的基础上进行再创新,
保留那些动效的图,以及创新更多一些显示方式」。
T6 项目墙居中:`.repo` 从 align-items:stretch/text-align:left 改回 center/center,
`.repo-desc` 加 max-width:34em 防居中后长描述散架;语言点保持灰阶(与对齐无关)。
T8 动效回归(零运行时外链):
- 新增 geek/TypingLines.astro:自绘打字机(SSR 先出首行防闪白,JS 逐字打出/删除/
轮播,光标 CSS 闪烁,prefers-reduced-motion 与单条文案时保持静态,min-height
防抖,astro:page-load 重挂兼容软导航)——替代 readme-typing-svg 外链,且跟随主题
- 新增 scripts/build-perf/fetch-readme-assets.mjs:抓 stats/top-langs/streak/snake
到 public/github-assets/(10s 超时 + UA、透明底、亮暗两套站点色),产物入仓保证
离线可构建;单资产失败保留旧文件、无旧文件则该卡不渲染
- GithubProfile 新增「数据板」:灰阶 hairline 卡 + mono 小标题 + 2 列网格(移动单列),
与原生统计四格、语言占比、热力图组合成展示区;贡献蛇在暗色加 grayscale+invert
滤镜(SVG 内部是自带绿阶,直接贴暗底刺眼)
- build.sh 只做存在性守卫 + 缺资产 WARN,**不挂抓取**(发布链不被外网抖动拖累)
- 后台开源页新增 typing 字段(list,zh/en 双语,≤6 条,summary 取 zh)+ schema 声明
验证: 构建 51 页 exit 0;config-check 211 字段/66 hint 全过;E2E 46/46;
产物断言第三方外链零命中、本地引用 streak-light/streak-dark/snake;
Playwright 实测打字机文本 900ms 内变化(动效在跑)、streak naturalWidth=495、
snake=880、暗色自动切 streak-dark、项目墙 center/center、1280 与 390 均零横向溢出
备注: github-readme-stats 今日全局 503,stats/top-langs 两卡按契约跳过(原生四格与
语言条已覆盖同一信息);服务恢复后跑一次 fetch-readme-assets.mjs 即自动补上。
Spec: 2026-11-02_blog-5i-fonts-polish (T6/T8)
Co-authored-by: GLM-5.3
65 lines
3.9 KiB
Bash
Executable File
65 lines
3.9 KiB
Bash
Executable File
#!/bin/sh
|
||
# 构建管线(Phase 5c 裸 clone 改造):构建源 = origin/main 硬跟,非本地工作树。
|
||
#
|
||
# 为什么:此前直接构建 ~/Code/Github/my-blog 工作树——分支/未提交状态会
|
||
# 意外上线(Sveltia 冒烟期实测发生过);且 Sveltia 的 main 提交无法自动
|
||
# 发布。改为独立构建仓 fetch+reset 硬跟 main:线上=远端 main,确定性闭环。
|
||
# blog 仓已公开,匿名 fetch 无需凭据。
|
||
set -e
|
||
# 抓取 URL:默认公网;同机构建可由宿主环境变量覆盖为内网
|
||
# (2026-10-26 事故:ESA 边缘对 git.wait4x.online 522 时公网 fetch 失败,
|
||
# set -e 下静默死、staging 冻结——内网通道必须可用)
|
||
BLOG_GIT_URL="${BLOG_GIT_URL:-https://git.wait4x.online/wait4x/blog.git}"
|
||
BUILD_REPO="$HOME/docker_apps/blog/build-repo"
|
||
STAGING="$HOME/docker_apps/blog/www-staging"
|
||
|
||
if [ ! -d "$BUILD_REPO/.git" ]; then
|
||
echo "[build] 首次克隆构建仓"
|
||
git clone "$BLOG_GIT_URL" "$BUILD_REPO"
|
||
fi
|
||
|
||
cd "$BUILD_REPO"
|
||
# 每次构建把 origin 指向配置的 URL(同机构建走内网通道;公网 522 时仍可发布)
|
||
git remote set-url origin "$BLOG_GIT_URL"
|
||
git fetch origin main
|
||
git reset --hard origin/main
|
||
git clean -fd --exclude node_modules
|
||
SHA=$(git rev-parse --short HEAD)
|
||
echo "[build] 构建源: origin/main @ $SHA"
|
||
|
||
pnpm install --frozen-lockfile >/dev/null
|
||
pnpm astro build
|
||
|
||
# 按页字体 CSS 子集化(车道 A 任务 1):裁 @font-face 声明数,构建仓与本地同链;
|
||
# 存在性守卫:新文件未推送到 main 前构建仓无此脚本,绝不让发布链因车道在途文件断掉
|
||
[ -f scripts/build-perf/subset-font-css.mjs ] && node scripts/build-perf/subset-font-css.mjs dist || echo "[build] subset 脚本未就绪,跳过"
|
||
[ -f scripts/build-perf/config-check.py ] && python3 scripts/build-perf/config-check.py || echo "[build] config-check 未就绪,跳过"
|
||
[ -f scripts/build-perf/contrast-check.mjs ] && node scripts/build-perf/contrast-check.mjs dist || echo "[build] contrast 脚本未就绪,跳过"
|
||
# 首页阻塞 CSS 内联(车道 D):守卫先行同上——脚本未到 main 前绝不炸链
|
||
[ -f scripts/build-perf/gen-sw-precache.mjs ] && node scripts/build-perf/gen-sw-precache.mjs dist || echo "[build] sw-precache 生成器未就绪,跳过"
|
||
[ -f scripts/build-perf/inline-home-css.mjs ] && node scripts/build-perf/inline-home-css.mjs || echo "[build] inline-home 脚本未就绪,跳过"
|
||
|
||
# README 动效资产(5i T8):**不在此跑抓取**(避免发布链被外网抖动拖累),只做存在性守卫 + 缺资产告警
|
||
if [ -f public/github-assets/manifest.json ]; then
|
||
echo "[build] github-assets 就绪:$(find public/github-assets -name '*.svg' | wc -l) 个自托管 SVG"
|
||
else
|
||
echo "[build] WARN public/github-assets/manifest.json 缺失——开源页数据板将只显示原生统计(可手动跑 node scripts/build-perf/fetch-readme-assets.mjs 补齐)"
|
||
fi
|
||
|
||
# 内容 lint(T3):断链/缺图在部署前拦截;CONTENT_LINT=skip|warn 逃生门见脚本头注
|
||
[ -f scripts/build-perf/content-lint.mjs ] && node scripts/build-perf/content-lint.mjs dist || echo "[build] content-lint 未就绪,跳过"
|
||
|
||
echo "[build] rsync -> $STAGING"
|
||
mkdir -p "$STAGING"
|
||
rsync -a --delete "$BUILD_REPO/dist/" "$STAGING/"
|
||
ORIG="$HOME/docker_apps/blog/photos-originals"
|
||
if [ -d "$ORIG" ]; then rsync -a "$ORIG/" "$STAGING/photos-originals/"; fi
|
||
printf 'built %s at %s\n' "$SHA" "$(date -Is)" > "$STAGING/.build-stamp"
|
||
echo "[build] done: $(find "$STAGING" -name '*.html' | wc -l) html files @ $SHA"
|
||
|
||
# 生产冒烟(T3):staging 三断言。首版容忍失败(robots 待 T1 落地,smoke FAIL 属预期),
|
||
# T1 收编后改硬门:去掉 `|| echo` 让断言失败直接炸构建
|
||
if [ -f scripts/build-perf/prod-smoke.sh ] && [ "${SMOKE_BASE:-http://127.0.0.1:18743}" != "off" ]; then
|
||
bash scripts/build-perf/prod-smoke.sh "${SMOKE_BASE:-http://127.0.0.1:18743}" || echo "[build] prod-smoke 未过(见上;T1 robots 落地后转硬门)"
|
||
fi
|