name: CI on: push: branches: [main] pull_request: branches: [main] workflow_dispatch: # Windows runner 的管道默认编码是 cp1252,脚本输出 ✓ 等字符会直接 UnicodeEncodeError。 # 全局强制 UTF-8:ubuntu 上无感,windows 上是生死线。 env: PYTHONUTF8: "1" # 每个分支只关心最新一次运行;被取代的自动取消。 concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: checks: name: ${{ matrix.os }} / py${{ matrix.python }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: # Windows + Git Bash 是主要开发平台,所以和 Linux 一起测, # 而不是被当成事后补的。 os: [ubuntu-latest, windows-latest] python: ["3.9", "3.13"] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: ${{ matrix.python }} - uses: actions/setup-node@v4 with: node-version: "22" # --- 仓库自洽性:版本号漂移、风格目录漂移、残留外链 --- - name: Repository integrity check run: python scripts/check_integrity.py # --- Python 脚本至少在支持的最低版本上要能编译 --- - name: Compile Python scripts run: python -m compileall -q scripts # --- 画面体检工具要能被导入,且命令行要能响应 --- - name: Lint tool smoke test run: python scripts/lint_frames.py --help - name: Integrity checker smoke test run: python scripts/check_integrity.py --root . # --- Shell 入口语法 --- - name: Check setup_env.sh syntax shell: bash run: bash -n setup_env.sh # --- 渲染器 / 封面器 / 单帧速览工具的语法 --- - name: Check Node module syntax shell: bash run: | set -e for f in scripts/*.mjs; do echo "checking $f" node --check "$f" done - name: Check templates are self-contained shell: bash run: | set -e # 画面帧绝不允许引 CDN 或网络字体:离线渲染不会报错,只会静默劣化。 # 只扫 HTML —— markdown 文档里*提到*这些 URL 是合理的 # (比如正是指南在教你要把它们删掉),而 GSAP 自带的 README 也会介绍它的 CDN 用法。 hits=$(grep -rInE --include='*.html' \ 'https?://[^"'"'"' ]*(fonts\.googleapis|fonts\.gstatic|cdn\.)' . \ || true) if [ -n "$hits" ]; then echo "$hits" echo "::error::external font or CDN reference found in an HTML template" exit 1 fi echo "no external font or CDN references in HTML templates"