Files
easy_tdx_max/.github/workflows/release.yml
T
Justin Gu e374a0da28 release: v1.32.6 — 两周改动深度审查全面修复(回测口径三件套/LLM 安全加固/涨停价舍入/时区统一/缓存与竞态等 58 处)
对 v1.21→v1.32.5 的 249 文件 4.2 万行改动做六路专项审查,本轮落地全部发现:

回测正确性:组合收益 fillna(0) 虚增、轮动停牌日过期价成交、单标的 WF 逐窗指标
被预热区稀释(三件套均带先红后绿回归);worst_drawdown 方向、grading 容错、
组合体检品种费率、寻优端点费率透传。

安全:LLM api_url 仅 http/https 且禁 userinfo(封死 file:// 读取与 Key 外送链)、
错误响应不回显原始 body、响应体 2MB 上限、配置原子写、坏配置字段级防御。

数据:涨跌停价整数分币舍入(67/318/90 个价位错 1 分漏判清零)、交易时段/采样/
provisional 统一沪时区、warehouse 增量缺口自动全量重拉、provisional 定点转正、
baostock 真故障抛错 + W/M 去 tradestatus(实测服务端报错,周月兜底此前从未工作)
+ 指数 vol 股→手(实测锚定)、ccpm 结构变更抛错。

Web API:缓存键补 count/vipdoc、NaN 清洗先于缓存、count>800 分页取全量、
submit 透传真实状态、pending 不再被淘汰成幽灵、watchlist/server 入参约束。

公式:FILTER 去副作用、0-1 值域误判收严、递归深度上限、REF 负移位显式禁止。

前端:4 处请求竞态序号守卫、Sparkline viewBox、北交所 market=2 映射、
空数据缓存死角、AI 弹窗卸载中止轮询、量能/资金日历口径修正。

CLI/CI:warehouse sync 失败 exit 1、参数校验干净报错、release 真实发布 SHA256、
CI 超时与缓存、spec 补 baostock 前提。

约 60 条回归测试先红后绿;pytest 1820 全过,ruff/mypy/vue-tsc/node --test 全绿。
2026-09-06 22:16:48 +08:00

149 lines
5.4 KiB
YAML
Raw 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.
name: Release EXE
# 打 tag 时构建 Windows 单 EXE 并发布到 GitHub Release。
# 与 publish.ymlPyPI)并行独立:即使 PyPI 发布失败,EXE 仍可发布,
# 提高发布韧性。Phase 1 产物未签名,老人首次运行会被 SmartScreen 拦截,
# 需手动"更多信息 → 仍要运行"——Phase 2 引入代码签名后解决。
on:
push:
tags:
- "v*"
permissions:
contents: write # softprops/action-gh-release 创建 Release 需要
jobs:
build-windows:
name: Build Windows EXE
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
cache-dependency-path: web-ui/package-lock.json
# 构建前端 → web-ui/dist/。必须在 pip install 前:pyproject.toml 的
# force-include 要求 web-ui/dist 存在,否则 pip install -e . 报错。
- name: Build frontend
run: |
npm ci
npm run build
working-directory: web-ui
# 安装后端(含 [web,packaging,baostock] extrasfastapi/uvicorn +
# pystray/Pillow + baostock 自动兜底数据源——EXE 内置全量灾备链)
- name: Install Python deps
run: |
pip install -e ".[web,packaging,baostock]"
pip install pyinstaller
- name: Build EXE
run: pyinstaller easy_tdx.spec --noconfirm
# 重命名为带版本号的文件名,方便老人下载时识别
- name: Rename EXE with version
shell: bash
run: |
VERSION="${GITHUB_REF_NAME#v}"
mv dist/easy-tdx.exe "dist/easy-tdx-${VERSION}-windows.exe"
ls -lh dist/
# 生成 SHA256 清单并随产物上传——Release 正文引导用户核对该哈希
# (防杀软误报时自行验证完整性),必须真实存在而非只写在文案里。
- name: Compute SHA256
shell: bash
run: |
cd dist
FILE=$(ls easy-tdx-*-windows.exe)
sha256sum "$FILE" > SHA256SUMS.txt
cat SHA256SUMS.txt
- uses: actions/upload-artifact@v4
with:
name: easy-tdx-windows-exe
path: |
dist/easy-tdx-*-windows.exe
dist/SHA256SUMS.txt
if-no-files-found: error
release:
name: Publish GitHub Release
needs: build-windows
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v4
with:
name: easy-tdx-windows-exe
path: dist
# 重算哈希(与构建 job 的 SHA256SUMS.txt 同源同值),嵌入 Release 正文,
# 使「核对 Release 说明中公布的 SHA256」的指引真实可执行。
- name: Compute SHA256 for release notes
run: |
EXE=$(ls dist/easy-tdx-*-windows.exe)
SHA=$(sha256sum "$EXE" | cut -d' ' -f1)
echo "EXE_NAME=$(basename "$EXE")" >> "$GITHUB_ENV"
echo "EXE_SHA256=$SHA" >> "$GITHUB_ENV"
# 引号 heredoc 防止正文里的反引号被 bash 当命令替换,先写占位符再 sed 替换
- name: Generate release body
run: |
cat > release_body.md <<'BODY'
## 下载使用
1. 下载下方 `__EXE_NAME__`(约 40-50MB
2. 双击运行
3. 浏览器会自动打开回测界面(地址 `http://localhost:8000`
## ✅ 完整性核对(SHA256
```
__EXE_SHA256__ __EXE_NAME__
```
PowerShell 核对:`Get-FileHash __EXE_NAME__`,与上方一致即为官方构建。
同份哈希也在附件 `SHA256SUMS.txt` 中。
## ⚠️ SmartScreen 提示
本版本未做代码签名,首次运行 Windows 会弹出"已保护你的电脑":
1. 点击 **更多信息**
2. 点击 **仍要运行**
Phase 2 将引入代码签名消除此提示。
## 🛡️ 杀软误报说明(Windows Defender 报毒?请先读这里)
部分 Windows Defender 用户会看到 `Trojan:Win32/Wacatac.C!ml` 报警。
`.exe` 由 GitHub Actions 在公开的 tag 提交上从源码构建(本文件即构建脚本),
为**未签名的 PyInstaller 单文件**打包——"自解压 + 无签名"特征是杀软
机器学习引擎(`!ml` 后缀即 ML 判定)的经典误报源头,v1.32.1 起各版本
构建方式相同。自行核验:
1. 核对上方公布的 SHA256PowerShell`Get-FileHash __EXE_NAME__`
2. 可上传 [VirusTotal](https://www.virustotal.com/) 交叉验证:典型误报特征是
少数 ML 启发式引擎报警、主流特征码引擎(Kaspersky/ESET/BitDefender 等)不报
3. 哈希一致仍想加速白名单,可向微软提交误报申诉:
[microsoft.com/en-us/wdsi/filesubmission](https://www.microsoft.com/en-us/wdsi/filesubmission)(选"软件开发者"
BODY
sed -i "s/__EXE_NAME__/${EXE_NAME}/g; s/__EXE_SHA256__/${EXE_SHA256}/g" release_body.md
- name: Create release
uses: softprops/action-gh-release@v2
with:
files: |
dist/easy-tdx-*-windows.exe
dist/SHA256SUMS.txt
generate_release_notes: true
body_path: release_body.md