diff --git a/.gitea/workflows/build-windows-cross-linux.yml b/.gitea/workflows/build-windows-cross-linux.yml index 30a9690..88e5b3e 100644 --- a/.gitea/workflows/build-windows-cross-linux.yml +++ b/.gitea/workflows/build-windows-cross-linux.yml @@ -20,14 +20,26 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + run: | + set -euo pipefail + dnf install -y git rsync + REPO_URL="${GITHUB_SERVER_URL:-https://git.luochen570.cn}/${GITHUB_REPOSITORY}.git" + TOKEN="${GITHUB_TOKEN:-${GITEA_TOKEN:-}}" + if [ -n "$TOKEN" ]; then + git -c http.extraHeader="Authorization: token ${TOKEN}" \ + clone --depth 1 --branch "${GITHUB_REF_NAME:-main}" "$REPO_URL" source + else + git clone --depth 1 --branch "${GITHUB_REF_NAME:-main}" "$REPO_URL" source + fi + rsync -a --delete source/ ./ + rm -rf source - name: Install cross build dependencies run: | set -euo pipefail dnf install -y \ - git \ cmake \ + curl \ ninja-build \ p7zip \ p7zip-plugins \ @@ -106,11 +118,20 @@ jobs: 7z l dist-windows-cross/chengnan-windows-x86_64-cross.zip | grep 'chengnan.exe' 7z l dist-windows-cross/chengnan-windows-x86_64-cross.zip | grep 'platforms/' - - name: Upload artifact - uses: actions/upload-artifact@v3 - with: - name: chengnan-windows-x86_64-cross - path: | - dist-windows-cross/chengnan-windows-x86_64-cross.zip - dist-windows-cross/chengnan-windows-x86_64-cross.zip.sha256 - if-no-files-found: error + - name: Upload package to Gitea Packages + run: | + set -euo pipefail + PACKAGE_NAME="chengnan-windows-x86_64-cross" + VERSION="${GITHUB_SHA:-manual}" + VERSION="${VERSION:0:10}" + OWNER="${GITHUB_REPOSITORY%%/*}" + API_BASE="${GITHUB_SERVER_URL:-https://git.luochen570.cn}/api/packages/${OWNER}/generic/chengnan/${VERSION}" + TOKEN="${GITHUB_TOKEN:-${GITEA_TOKEN:-}}" + test -n "$TOKEN" + curl --fail --location --user "${GITHUB_ACTOR:-luochen570}:${TOKEN}" \ + --upload-file "dist-windows-cross/${PACKAGE_NAME}.zip" \ + "${API_BASE}/${PACKAGE_NAME}.zip" + curl --fail --location --user "${GITHUB_ACTOR:-luochen570}:${TOKEN}" \ + --upload-file "dist-windows-cross/${PACKAGE_NAME}.zip.sha256" \ + "${API_BASE}/${PACKAGE_NAME}.zip.sha256" + echo "Package uploaded to: ${API_BASE}/" diff --git a/README.md b/README.md index 6550e47..6dc0515 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,8 @@ chengnan 是一个面向 Windows 的图片查看器 / 简单图像处理应用 ```text chengnan/ ├── .gitea/workflows/ -│ └── build-windows-release.yml # Windows 构建与发布工作流 +│ ├── build-windows-cross-linux.yml # Linux Runner 交叉编译 Windows 发布包 +│ └── build-windows-release.yml # Windows Runner 原生构建备用工作流 ├── app/ │ ├── include/ # 头文件 │ └── src/ # 源文件 @@ -54,18 +55,37 @@ chengnan/ ## 构建与发布 -本项目不在仓库中保存编译工具或第三方二进制依赖。所有构建工作都在 `.gitea/workflows/build-windows-release.yml` 中完成。 +本项目不在仓库中保存编译工具或第三方二进制依赖。所有构建工作都在 Gitea Actions 工作流中完成。 -工作流会在 Windows Runner 中临时完成以下步骤: +当前优先使用 `.gitea/workflows/build-windows-cross-linux.yml`:在自建 `9950x` Linux Runner 的 Fedora 41 容器中,通过 MinGW-w64 交叉编译生成 Windows x86_64 发布包。`.gitea/workflows/build-windows-release.yml` 保留为 Windows Runner 原生构建备用工作流。 + +交叉编译工作流会临时完成以下步骤: 1. 拉取源码 -2. 安装 Windows 构建环境和依赖 +2. 安装 Fedora / MinGW-w64 构建环境和依赖 3. 配置 CMake 4. 编译 Release 版本 -5. 部署 Qt / OpenCV / MinGW 运行时依赖 +5. 收集 Qt / OpenCV / MinGW 运行时依赖 6. 打包 Windows 发布包 7. 生成 SHA256 校验文件 -8. 上传构建产物 +8. 上传发布包到 Gitea Packages + +## 编译工具链版本 + +交叉编译工作流固定使用以下环境和包版本: + +| 组件 | 版本 | +| --- | --- | +| Runner 标签 | `9950x` | +| 容器镜像 | `fedora:41` | +| C++ 语言标准 | `C++17` | +| MinGW-w64 GCC C++ | `mingw64-gcc-c++ 14.2.1-3.fc41` | +| CMake | `cmake 3.28.3-7.fc41` | +| Ninja | `ninja-build 1.12.1-3.fc41` | +| Qt 6 Base | `mingw64-qt6-qtbase 6.7.2-3.fc41` | +| OpenCV | `mingw64-opencv 4.10.0-1.fc41` | + +版本来源为 Fedora 41 `Everything/x86_64` 仓库元数据;构建时由工作流临时安装,不提交到源码仓库。 触发方式: @@ -77,8 +97,8 @@ chengnan/ 构建产物: ```text -chengnan-windows-x86_64.zip -chengnan-windows-x86_64.zip.sha256 +chengnan-windows-x86_64-cross.zip +chengnan-windows-x86_64-cross.zip.sha256 ``` 发布包解压后,双击 `chengnan.exe` 运行。请保留同目录 DLL 和 Qt 插件目录,不要只复制单个 exe。 @@ -100,7 +120,7 @@ chengnan-windows-x86_64.zip.sha256 - 不提交编译器、CMake、Ninja、Qt、OpenCV、MSYS2、vcpkg 等工具或 SDK - 不提交 `build-*`、`dist-*`、`.exe`、`.dll` 等构建产物 - 第三方依赖只在工作流运行期间临时安装 -- 发布包只作为工作流 artifact 产出,不进入源码仓库 +- 发布包只作为工作流产物或 Gitea Packages 文件产出,不进入源码仓库 ## 验收标准