From 7653385838983c506474e463353690b60940ad9f Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Tue, 5 May 2026 01:27:38 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=8A=A0=E5=9B=BA=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E6=B5=81=E6=B0=B4=E7=BA=BF=E8=BF=90=E8=A1=8C=E7=8E=AF=E5=A2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复 Windows 发布作业在 MSYS2 环境下无法访问 Go 工具链的问题。 为三平台发布增加工具链预检并升级 release workflow 运行时兼容性,减少版本检查噪音和 CI 告警。 --- .github/workflows/release.yml | 67 ++++++++++++++++++++++--- Makefile | 27 +++++----- README.md | 2 + openspec/specs/release-pipeline/spec.md | 51 +++++++++++++++++-- 4 files changed, 124 insertions(+), 23 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 84a4682..617fea4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,12 +18,13 @@ jobs: version: ${{ steps.version.outputs.version }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version-file: go.work + cache-dependency-path: backend/go.sum - name: Verify tag and VERSION id: version @@ -40,12 +41,13 @@ jobs: contents: read steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version-file: go.work + cache-dependency-path: backend/go.sum - name: Setup Bun uses: oven-sh/setup-bun@v2 @@ -55,6 +57,19 @@ jobs: sudo apt-get update sudo apt-get install -y libayatana-appindicator3-dev libgtk-3-dev + - name: Preflight Linux release toolchain + run: | + set -euo pipefail + command -v go + go version + command -v bun + bun --version + command -v gcc + gcc --version + command -v pkg-config + pkg-config --modversion ayatana-appindicator3-0.1 + pkg-config --modversion gtk+-3.0 + - name: Build Linux release assets run: make release-assets-linux @@ -72,12 +87,13 @@ jobs: contents: read steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version-file: go.work + cache-dependency-path: backend/go.sum - name: Setup Bun uses: oven-sh/setup-bun@v2 @@ -85,11 +101,34 @@ jobs: - name: Setup MSYS2 toolchain uses: msys2/setup-msys2@v2 with: + msystem: MINGW64 + path-type: inherit update: true install: >- make mingw-w64-x86_64-gcc + - name: Preflight Windows release toolchain + shell: msys2 {0} + run: | + set -euo pipefail + command -v go + go version + command -v bun + bun --version + command -v make + make --version + command -v gcc + gcc --version + command -v windres + windres --version + if command -v powershell.exe >/dev/null 2>&1; then + powershell.exe -NoProfile -Command '$PSVersionTable.PSVersion.ToString()' + else + command -v powershell + powershell -NoProfile -Command '$PSVersionTable.PSVersion.ToString()' + fi + - name: Build Windows release assets shell: msys2 {0} run: make release-assets-windows @@ -108,16 +147,28 @@ jobs: contents: read steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version-file: go.work + cache-dependency-path: backend/go.sum - name: Setup Bun uses: oven-sh/setup-bun@v2 + - name: Preflight macOS release toolchain + run: | + set -euo pipefail + command -v go + go version + command -v bun + bun --version + command -v ditto + xcrun --find lipo + xcrun --find vtool + - name: Build macOS release assets run: make release-assets-macos diff --git a/Makefile b/Makefile index cdc3b95..1bbeac0 100644 --- a/Makefile +++ b/Makefile @@ -10,19 +10,22 @@ _desktop-test _desktop-clean _desktop-prepare-frontend _desktop-prepare-embedfs _desktop-prepare-windows-resource \ _server-run-backend _server-run-frontend -VERSION := $(shell go run ./backend/cmd/versionctl print) -GIT_COMMIT ?= $(shell git rev-parse --short HEAD 2>/dev/null || printf 'unknown') -BUILD_TIME ?= $(shell date -u +"%Y-%m-%dT%H:%M:%SZ") -GO_LDFLAGS := -X nex/backend/pkg/buildinfo.version=$(VERSION) -X nex/backend/pkg/buildinfo.commit=$(GIT_COMMIT) -X nex/backend/pkg/buildinfo.buildTime=$(BUILD_TIME) -GO_LDFLAGS_WIN := $(GO_LDFLAGS) -H=windowsgui +# Delay shell lookups until a target needs them, then cache the result for this make run. +lazy_shell = $(or $($(1)),$(eval $(1) := $(shell $(2)))$($(1))) + +VERSION = $(call lazy_shell,_VERSION,go run ./backend/cmd/versionctl print) +GIT_COMMIT ?= $(call lazy_shell,_GIT_COMMIT,git rev-parse --short HEAD 2>/dev/null || printf 'unknown') +BUILD_TIME ?= $(call lazy_shell,_BUILD_TIME,date -u +"%Y-%m-%dT%H:%M:%SZ") +GO_LDFLAGS = -X nex/backend/pkg/buildinfo.version=$(VERSION) -X nex/backend/pkg/buildinfo.commit=$(GIT_COMMIT) -X nex/backend/pkg/buildinfo.buildTime=$(BUILD_TIME) +GO_LDFLAGS_WIN = $(GO_LDFLAGS) -H=windowsgui RELEASE_DIR := build/release -SERVER_LINUX_ASSET := $(shell go run ./backend/cmd/versionctl asset-name server linux amd64) -SERVER_WINDOWS_ASSET := $(shell go run ./backend/cmd/versionctl asset-name server windows amd64) -SERVER_DARWIN_AMD64_ASSET := $(shell go run ./backend/cmd/versionctl asset-name server darwin amd64) -SERVER_DARWIN_ARM64_ASSET := $(shell go run ./backend/cmd/versionctl asset-name server darwin arm64) -DESKTOP_LINUX_ASSET := $(shell go run ./backend/cmd/versionctl asset-name desktop linux) -DESKTOP_WINDOWS_ASSET := $(shell go run ./backend/cmd/versionctl asset-name desktop windows) -DESKTOP_MACOS_ASSET := $(shell go run ./backend/cmd/versionctl asset-name desktop macos) +SERVER_LINUX_ASSET = $(call lazy_shell,_SERVER_LINUX_ASSET,go run ./backend/cmd/versionctl asset-name server linux amd64) +SERVER_WINDOWS_ASSET = $(call lazy_shell,_SERVER_WINDOWS_ASSET,go run ./backend/cmd/versionctl asset-name server windows amd64) +SERVER_DARWIN_AMD64_ASSET = $(call lazy_shell,_SERVER_DARWIN_AMD64_ASSET,go run ./backend/cmd/versionctl asset-name server darwin amd64) +SERVER_DARWIN_ARM64_ASSET = $(call lazy_shell,_SERVER_DARWIN_ARM64_ASSET,go run ./backend/cmd/versionctl asset-name server darwin arm64) +DESKTOP_LINUX_ASSET = $(call lazy_shell,_DESKTOP_LINUX_ASSET,go run ./backend/cmd/versionctl asset-name desktop linux) +DESKTOP_WINDOWS_ASSET = $(call lazy_shell,_DESKTOP_WINDOWS_ASSET,go run ./backend/cmd/versionctl asset-name desktop windows) +DESKTOP_MACOS_ASSET = $(call lazy_shell,_DESKTOP_MACOS_ASSET,go run ./backend/cmd/versionctl asset-name desktop macos) # ============================================ # 全局命令 diff --git a/README.md b/README.md index ddaf52c..f5375fa 100644 --- a/README.md +++ b/README.md @@ -357,6 +357,8 @@ make release-assets-macos ### GitHub Draft Release - 推送 `vX.Y.Z` tag 后,`.github/workflows/release.yml` 会自动执行发布流水线 +- 三个平台 job 会在正式构建前先检查 `go`、`bun` 和各自的平台打包工具链,缺失时快速失败并在日志中输出诊断信息 +- Windows 发布 job 在 `MSYS2 / MINGW64` shell 中执行,并继承 `setup-go` / `setup-bun` 准备好的工具链路径 - 流水线会先校验 tag 与 `VERSION` 一致,再构建以下资产并上传到 GitHub Draft Release: - Linux server - Windows server diff --git a/openspec/specs/release-pipeline/spec.md b/openspec/specs/release-pipeline/spec.md index a3a50a8..e931406 100644 --- a/openspec/specs/release-pipeline/spec.md +++ b/openspec/specs/release-pipeline/spec.md @@ -27,22 +27,67 @@ #### Scenario: Linux 发布构建 - **WHEN** 发布流水线执行 Linux 构建 job -- **THEN** 系统 SHALL 生成 Linux server 发布资产 +- **THEN** 系统 SHALL 在可访问 Go、Bun 和 Linux 桌面构建依赖的 shell 环境中执行 Linux 发布构建 +- **AND** 系统 SHALL 生成 Linux server 发布资产 - **AND** 系统 SHALL 生成 Linux desktop 发布资产 #### Scenario: Windows 发布构建 - **WHEN** 发布流水线执行 Windows 构建 job -- **THEN** 系统 SHALL 生成 Windows server 发布资产 +- **THEN** 系统 SHALL 在包含 MSYS2 / MINGW64 构建工具且可访问 Go 与 Bun 工具链的 shell 环境中执行 Windows 发布构建 +- **AND** 系统 SHALL 生成 Windows server 发布资产 - **AND** 系统 SHALL 生成 Windows desktop 发布资产 #### Scenario: macOS 发布构建 - **WHEN** 发布流水线执行 macOS 构建 job -- **THEN** 系统 SHALL 生成 darwin-amd64 server 发布资产 +- **THEN** 系统 SHALL 在可访问 Go、Bun 和 macOS 打包工具链的 shell 环境中执行 macOS 发布构建 +- **AND** 系统 SHALL 生成 darwin-amd64 server 发布资产 - **AND** 系统 SHALL 生成 darwin-arm64 server 发布资产 - **AND** 系统 SHALL 生成 macOS desktop universal 发布资产 +### Requirement: 三平台发布构建预检 + +系统 SHALL 在正式执行各平台 `make release-assets-*` 前验证对应发布 job 的关键工具链可用性,并在环境不完整时快速失败且输出明确诊断。 + +#### Scenario: Linux 预检通过后开始构建 + +- **WHEN** Linux 发布 job 中的 `go`、`bun` 与 Linux 桌面构建依赖均可用 +- **THEN** 系统 SHALL 输出关键工具的版本信息或解析路径 +- **AND** 系统 SHALL 继续执行 `make release-assets-linux` + +#### Scenario: Windows 预检通过后开始构建 + +- **WHEN** Windows 发布 job 中的 `go`、`bun` 与 MSYS2 构建工具均可用 +- **THEN** 系统 SHALL 输出关键工具的版本信息或解析路径 +- **AND** 系统 SHALL 继续执行 `make release-assets-windows` + +#### Scenario: macOS 预检通过后开始构建 + +- **WHEN** macOS 发布 job 中的 `go`、`bun` 与 macOS 打包工具均可用 +- **THEN** 系统 SHALL 输出关键工具的版本信息或解析路径 +- **AND** 系统 SHALL 继续执行 `make release-assets-macos` + +#### Scenario: 任一平台预检发现工具缺失 + +- **WHEN** 任一平台发布 job 中存在关键工具不可用 +- **THEN** 发布流水线 SHALL 在正式构建前失败 +- **AND** 系统 SHALL 在日志中标识缺失的工具链名称 + +### Requirement: 发布流水线运行时兼容性 + +系统 SHALL 保持与 GitHub-hosted runner 当前受支持的 workflow runtime 约束兼容,避免发布流程依赖已声明弃用的 runtime 或执行约束。 + +#### Scenario: runner runtime 升级前完成兼容更新 + +- **WHEN** GitHub-hosted runner 宣布 workflow runtime 或关键执行约束将从旧版本迁移到新版本 +- **THEN** 发布流水线 SHALL 在旧约束移除前完成兼容性更新 + +#### Scenario: 发布流水线执行时不依赖已弃用 runtime + +- **WHEN** 发布流水线运行 release workflow +- **THEN** 关键发布步骤 SHALL NOT 依赖已被 GitHub-hosted runner 标记为待移除的 runtime 或执行约束 + ### Requirement: 版本化发布资产命名 系统 SHALL 为 server 与 desktop 的发布资产使用包含统一版本号和目标平台信息的文件名,确保 Release 页面可直接区分产物用途与平台。