【Bug已解决】[Build] ORT 1.27.0 windows x64 artifact in GitHub release 解决方案

📅 2026/8/13 22:56:15
【Bug已解决】[Build] ORT 1.27.0 windows x64 artifact in GitHub release 解决方案
【Bug已解决】[Build] ORT 1.27.0 windows x64 artifact in GitHub release 解决方案一、现象长什么样ONNX Runtime 发了 1.27.0 的 GitHub Release但下载页里找不到 windows x64 的预编译包或名字对不上、点进去 404在 https://github.com/microsoft/onnxruntime/releases/tag/v1.27.0 - 只有 linux / osx / win-arm64缺 onnxruntime-win-x64-1.27.0.zip或者更隐蔽的变体包在 release 里但文件名是onnxruntime-win-x64-1.27.0.zip而文档/安装脚本里写的是onnxruntime-win-x64-1.27.0.tar.gz或者 CI 上传步骤因为 glob 没匹配到产物而静默跳过导致 release 里少文件但流水线显示绿。最小影响# 用户照文档下 windows x64 Invoke-WebRequest https://github.com/microsoft/onnxruntime/releases/download/v1.27.0/onnxruntime-win-x64-1.27.0.zip -OutFile ort.zip # 404 Not Found —— 该 artifact 根本没上传注意这不是编译失败构建本身绿而是发布流水线没把 windows x64 产物上传到 release属于 release/打包环节的断链。二、背景ONNX Runtime 的发布流程分两步CI 构建在多个 runnerlinux / macos / windows-x64 / windows-arm64上各自构建产出对应平台的 zip/tar 包作为 workflow artifact 暂存。Release 上传一个独立的releasejob 把上一步的 artifact 收集起来按固定 glob如onnxruntime-*-x64-*.zip匹配再用gh release upload或actions/upload-release-asset上传到 GitHub Release。windows x64 的产物最容易在第二步出问题几个常见原因构建产物命名和上传 glob 不匹配构建脚本输出的文件名带了 commit hash 或不同后缀globonnxruntime-win-x64-*.zip匹配不到。windows runner 超时/被排队windows 构建慢artifact 还没生成release job 就已经跑完收集自然缺这个包。上传步骤对 windows 路径大小写/反斜杠敏感PowerShell 下路径分隔符或 glob 在upload-release-asset里没处理好。静默失败release job 没有把“某个预期 artifact 缺失”当成错误于是不上传也不报错流水线全绿但 release 缺包。三、根因根因是release 上传步骤对 windows x64 artifact 的“存在性”和“命名匹配”缺乏校验且失败时静默glob 与产物名不一致上传步骤用固定 glob 匹配但 windows x64 构建产物的实际名字由于某个构建参数变化如启用/关闭某个 EP、版本号格式而偏离 glob匹配数为 0。缺少 artifact 存在性断言release job 收集完就直接上传没有先gh api或ls确认“windows x64 包应当存在”于是缺失被悄悄放过。job 依赖/等待不正确release job 用needs:串联但 windows 构建 job 因为矩阵展开或缓存没进needsrelease job 不等它就开始拿到空集合。所以这不是代码编译错而是发布流水线的产物收集与校验环节有缺口导致 windows x64 包没进 release。四、最小可运行复现下面用一段 GitHub Actions 风格的 YAML 思路 一个本地 bash 校验脚本复现“glob 不匹配 缺失被静默放过”#!/usr/bin/env bash # 模拟 release 上传步骤的产物收集 set -u BUILD_DIR./build EXPECTEDonnxruntime-win-x64-1.27.0.zip # 真实情况windows 构建因参数变化产物名变成了带 hash 的 # onnxruntime-win-x64-1.27.0abc123.zip # 上传用的 glob 是固定的 GLOBonnxruntime-win-x64-*.zip matches( $BUILD_DIR/$GLOB ) if [ ! -e ${matches[0]} ]; then # 关键缺陷这里只是 echo没有 exit 1流水线继续“成功” echo WARNING: 未匹配到 windows x64 包但继续上传其他包 # 正确做法应echo ERROR 2; exit 1 fi # 校验期望的精确文件名必须在 if [ ! -f $BUILD_DIR/$EXPECTED ]; then echo ERROR: 发布缺少 $EXPECTED 2 exit 1 fi echo OK: 所有预期 artifact 齐备把构建产物故意命名成onnxruntime-win-x64-1.27.0abc123.zip跑这个脚本修复前不exit 1会“成功”却缺包修复后校验exit 1会立刻失败暴露缺包问题。五、解决方案第一层最小直接修复最小修复让 release 上传步骤先校验 windows x64 包存在缺失就 fail并且 glob 与产物命名对齐。# .github/workflows/release.yml 修复要点 release: needs: [build-linux, build-osx, build-win-x64, build-win-arm64] # 必须等 windows runs-on: ubuntu-latest steps: - name: Download all artifacts uses: actions/download-artifactv4 with: path: ./artifacts - name: Verify windows x64 present shell: bash run: | f$(ls ./artifacts/*/onnxruntime-win-x64-*.zip 2/dev/null | head -n1) if [ -z $f ]; then echo ::error::windows x64 artifact missing 2 exit 1 fi echo found: $f - name: Upload to release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | gh release upload v1.27.0 ./artifacts/*/onnxruntime-*.zip要点(1)needs必须包含 windows 构建 jobrelease 等它(2) 上传前显式校验 windows x64 包存在缺失exit 1(3) 用gh release upload批量上传整目录避免单个 glob 漏配。这一层立刻消除“release 缺 windows x64 但流水线绿”的事故。六、解决方案第二层结构性改进把“每次发布必须包含的 platform/artifact 清单”收口成唯一的配置对象OrtWinX64ReleaseArtifactPolicyCI 读它做断言from dataclasses import dataclass, field from typing import List, Tuple dataclass(frozenTrue) class OrtWinX64ReleaseArtifactPolicy: ORT 发布 artifact 清单的单一事实来源。 version: str 1.27.0 # 每次发布必须存在的平台包windows x64 是硬性要求 required_artifacts: Tuple[str, ...] ( onnxruntime-win-x64-{v}.zip, onnxruntime-win-arm64-{v}.zip, onnxruntime-linux-x64-{v}.tgz, onnxruntime-osx-universal2-{v}.tgz, ) # release job 必须等待的构建 job 名 required_build_jobs: Tuple[str, ...] ( build-win-x64, build-win-arm64, build-linux-x64, build-osx, ) # 缺失时是否失败而非静默 fail_on_missing: bool True # 上传用 glob需与产物命名对齐 upload_glob: str onnxruntime-*.zip def expected_names(self) - List[str]: return [t.format(vself.version) for t in self.required_artifacts] def describe(self) - str: return windows x64 等平台包为硬性发布要求缺失即失败 POLICY OrtWinX64ReleaseArtifactPolicy() def verify_release(present: List[str], policy: OrtWinX64ReleaseArtifactPolicy POLICY) - List[str]: missing [name for name in policy.expected_names() if name not in present] if missing and policy.fail_on_missing: raise RuntimeError(f发布缺失: {missing}) return missing所有发布流水线读同一份POLICYwindows x64 是硬性要求漏了直接 fail。七、解决方案第三层断言 / CI 守护把“release 产物齐备、windows x64 必在”做成断言。下面用 pytest 风格守护import pytest def test_windows_x64_is_required(policy): names policy.expected_names() assert any(win-x64 in n for n in names) def test_missing_windows_x64_fails(policy): present [onnxruntime-linux-x64-1.27.0.tgz] # 故意缺 windows x64 with pytest.raises(RuntimeError): verify_release(present, policy) def test_complete_release_passes(policy): present policy.expected_names() assert verify_release(present, policy) [] def test_release_job_waits_for_windows(policy): assert build-win-x64 in policy.required_build_jobs这四组断言锁住(1) windows x64 是必含(2) 缺失即失败(3) 齐备则通过(4) release job 等待 windows 构建。CI 跑通即代表发布流水线不会再漏 windows x64。八、排查清单遇到某个版本 release 缺平台包先确认是构建失败还是没上传看对应平台构建 job 是否绿绿却缺包 → 上传环节问题。比对产物名与上传 globwindows x64 产物实际名字和onnxruntime-win-x64-*.zip是否一致。查 release job 的needs有没有包含 windows 构建 job是否等它完成。看上传步骤是否静默失败有没有exit 1/::error::在没有匹配时。临时补救手动gh release upload补传缺失的包。统一策略对象用OrtWinX64ReleaseArtifactPolicy固化必含清单。CI 守护断言 windows x64 等必含包存在缺失即失败。九、小结[Build] ORT 1.27.0 windows x64 artifact in GitHub release的根因是发布流水线的上传步骤对 windows x64 产物的命名匹配和存在性缺乏校验且缺失时静默放过导致构建绿、release 却缺包常因 glob 与产物名不一致、release job 未等 windows 构建、或失败不报错。最小修复是让 release jobneedswindows 构建、上传前校验 windows x64 包存在并exit 1缺失结构性改进是用唯一的OrtWinX64ReleaseArtifactPolicy固化必含清单CI 用四组断言守护“windows x64 必在、缺失即失败、release 等 windows 构建”。记住发布的产物齐备性要在流水线里显式断言缺失必须 fail绝不能静默。