#!/usr/bin/env bash # 本地复跑 `.github/workflows/ci.yml` 的 `runtime-smoke` job:Linux + Xvfb + 软渲染截图。 # # 为什么要有这条脚本:CI 的 runtime-smoke 在 GitHub 的 ubuntu-latest 上跑, # 但「改动这个 job 的人」需要在没有 Linux 桌面的开发机上先自证一遍——否则改的就是没人验过的 YAML。 # 本脚本在 Docker 里复刻 job 的步骤(同样的 apt 依赖、同样的构建、同样的 xvfb-run 命令), # 并把截图与判定结果留在宿主目录,供人眼与 `check_screenshot.py` 复核。 # # 用法: # bash packaging/linux-smoke-docker.sh [仓库根目录] [输出目录] # ULL_SMOKE_SKIP_BUILD=1 bash packaging/linux-smoke-docker.sh # 复用缓存的二进制 # # 说明(诚实边界): # - 基础镜像 `rust:1-bookworm` 是 **Debian 12(glibc 2.36)**,官方 runner 是 **Ubuntu 24.04(glibc 2.39)**。 # 两者图形栈(X11/xvfb/Mesa 软渲染)来源不同,因此本脚本证明的是「Linux 上这条通道能真跑出图」, # 不能代替官方 runner 的首跑验证。 # - 国内网络慢时可换 TUNA 镜像:脚本默认就用 TUNA 的 Debian 源(`ULL_APT_MIRROR` 可覆盖)。 set -euo pipefail repo_root=$(cd "${1:-.}" && pwd) out_dir=${2:-/tmp/ull-smoke} image=${ULL_SMOKE_IMAGE:-ull-linux-smoke:bookworm} cargo_volume=${ULL_CARGO_VOLUME:-ull-cargo-reg} target_volume=${ULL_CARGO_TARGET_VOLUME:-ull-linux-target} apt_mirror=${ULL_APT_MIRROR:-https://mirrors.tuna.tsinghua.edu.cn} rustup_mirror=${ULL_RUSTUP_MIRROR:-https://mirrors.tuna.tsinghua.edu.cn/rustup} mkdir -p "$out_dir" out_dir=$(cd "$out_dir" && pwd) echo "== 仓库: $repo_root" echo "== 输出: $out_dir" # 1) 构建镜像:rust 工具链 + xvfb + 图形栈编译依赖 + 字体(软渲染器要从系统字体库取字形) if ! docker image inspect "$image" >/dev/null 2>&1 || [ "${ULL_SMOKE_REBUILD_IMAGE:-0}" = "1" ]; then context=$(mktemp -d) trap 'rm -rf "$context"' EXIT cat >"$context/Dockerfile" <