fix: 加固发布流水线运行环境
修复 Windows 发布作业在 MSYS2 环境下无法访问 Go 工具链的问题。 为三平台发布增加工具链预检并升级 release workflow 运行时兼容性,减少版本检查噪音和 CI 告警。
This commit is contained in:
67
.github/workflows/release.yml
vendored
67
.github/workflows/release.yml
vendored
@@ -18,12 +18,13 @@ jobs:
|
|||||||
version: ${{ steps.version.outputs.version }}
|
version: ${{ steps.version.outputs.version }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v6
|
||||||
with:
|
with:
|
||||||
go-version-file: go.work
|
go-version-file: go.work
|
||||||
|
cache-dependency-path: backend/go.sum
|
||||||
|
|
||||||
- name: Verify tag and VERSION
|
- name: Verify tag and VERSION
|
||||||
id: version
|
id: version
|
||||||
@@ -40,12 +41,13 @@ jobs:
|
|||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v6
|
||||||
with:
|
with:
|
||||||
go-version-file: go.work
|
go-version-file: go.work
|
||||||
|
cache-dependency-path: backend/go.sum
|
||||||
|
|
||||||
- name: Setup Bun
|
- name: Setup Bun
|
||||||
uses: oven-sh/setup-bun@v2
|
uses: oven-sh/setup-bun@v2
|
||||||
@@ -55,6 +57,19 @@ jobs:
|
|||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y libayatana-appindicator3-dev libgtk-3-dev
|
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
|
- name: Build Linux release assets
|
||||||
run: make release-assets-linux
|
run: make release-assets-linux
|
||||||
|
|
||||||
@@ -72,12 +87,13 @@ jobs:
|
|||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v6
|
||||||
with:
|
with:
|
||||||
go-version-file: go.work
|
go-version-file: go.work
|
||||||
|
cache-dependency-path: backend/go.sum
|
||||||
|
|
||||||
- name: Setup Bun
|
- name: Setup Bun
|
||||||
uses: oven-sh/setup-bun@v2
|
uses: oven-sh/setup-bun@v2
|
||||||
@@ -85,11 +101,34 @@ jobs:
|
|||||||
- name: Setup MSYS2 toolchain
|
- name: Setup MSYS2 toolchain
|
||||||
uses: msys2/setup-msys2@v2
|
uses: msys2/setup-msys2@v2
|
||||||
with:
|
with:
|
||||||
|
msystem: MINGW64
|
||||||
|
path-type: inherit
|
||||||
update: true
|
update: true
|
||||||
install: >-
|
install: >-
|
||||||
make
|
make
|
||||||
mingw-w64-x86_64-gcc
|
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
|
- name: Build Windows release assets
|
||||||
shell: msys2 {0}
|
shell: msys2 {0}
|
||||||
run: make release-assets-windows
|
run: make release-assets-windows
|
||||||
@@ -108,16 +147,28 @@ jobs:
|
|||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v6
|
||||||
with:
|
with:
|
||||||
go-version-file: go.work
|
go-version-file: go.work
|
||||||
|
cache-dependency-path: backend/go.sum
|
||||||
|
|
||||||
- name: Setup Bun
|
- name: Setup Bun
|
||||||
uses: oven-sh/setup-bun@v2
|
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
|
- name: Build macOS release assets
|
||||||
run: make release-assets-macos
|
run: make release-assets-macos
|
||||||
|
|
||||||
|
|||||||
27
Makefile
27
Makefile
@@ -10,19 +10,22 @@
|
|||||||
_desktop-test _desktop-clean _desktop-prepare-frontend _desktop-prepare-embedfs _desktop-prepare-windows-resource \
|
_desktop-test _desktop-clean _desktop-prepare-frontend _desktop-prepare-embedfs _desktop-prepare-windows-resource \
|
||||||
_server-run-backend _server-run-frontend
|
_server-run-backend _server-run-frontend
|
||||||
|
|
||||||
VERSION := $(shell go run ./backend/cmd/versionctl print)
|
# Delay shell lookups until a target needs them, then cache the result for this make run.
|
||||||
GIT_COMMIT ?= $(shell git rev-parse --short HEAD 2>/dev/null || printf 'unknown')
|
lazy_shell = $(or $($(1)),$(eval $(1) := $(shell $(2)))$($(1)))
|
||||||
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)
|
VERSION = $(call lazy_shell,_VERSION,go run ./backend/cmd/versionctl print)
|
||||||
GO_LDFLAGS_WIN := $(GO_LDFLAGS) -H=windowsgui
|
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
|
RELEASE_DIR := build/release
|
||||||
SERVER_LINUX_ASSET := $(shell go run ./backend/cmd/versionctl asset-name server linux amd64)
|
SERVER_LINUX_ASSET = $(call lazy_shell,_SERVER_LINUX_ASSET,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_WINDOWS_ASSET = $(call lazy_shell,_SERVER_WINDOWS_ASSET,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_AMD64_ASSET = $(call lazy_shell,_SERVER_DARWIN_AMD64_ASSET,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)
|
SERVER_DARWIN_ARM64_ASSET = $(call lazy_shell,_SERVER_DARWIN_ARM64_ASSET,go run ./backend/cmd/versionctl asset-name server darwin arm64)
|
||||||
DESKTOP_LINUX_ASSET := $(shell go run ./backend/cmd/versionctl asset-name desktop linux)
|
DESKTOP_LINUX_ASSET = $(call lazy_shell,_DESKTOP_LINUX_ASSET,go run ./backend/cmd/versionctl asset-name desktop linux)
|
||||||
DESKTOP_WINDOWS_ASSET := $(shell go run ./backend/cmd/versionctl asset-name desktop windows)
|
DESKTOP_WINDOWS_ASSET = $(call lazy_shell,_DESKTOP_WINDOWS_ASSET,go run ./backend/cmd/versionctl asset-name desktop windows)
|
||||||
DESKTOP_MACOS_ASSET := $(shell go run ./backend/cmd/versionctl asset-name desktop macos)
|
DESKTOP_MACOS_ASSET = $(call lazy_shell,_DESKTOP_MACOS_ASSET,go run ./backend/cmd/versionctl asset-name desktop macos)
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# 全局命令
|
# 全局命令
|
||||||
|
|||||||
@@ -357,6 +357,8 @@ make release-assets-macos
|
|||||||
### GitHub Draft Release
|
### GitHub Draft Release
|
||||||
|
|
||||||
- 推送 `vX.Y.Z` tag 后,`.github/workflows/release.yml` 会自动执行发布流水线
|
- 推送 `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:
|
- 流水线会先校验 tag 与 `VERSION` 一致,再构建以下资产并上传到 GitHub Draft Release:
|
||||||
- Linux server
|
- Linux server
|
||||||
- Windows server
|
- Windows server
|
||||||
|
|||||||
@@ -27,22 +27,67 @@
|
|||||||
#### Scenario: Linux 发布构建
|
#### Scenario: Linux 发布构建
|
||||||
|
|
||||||
- **WHEN** 发布流水线执行 Linux 构建 job
|
- **WHEN** 发布流水线执行 Linux 构建 job
|
||||||
- **THEN** 系统 SHALL 生成 Linux server 发布资产
|
- **THEN** 系统 SHALL 在可访问 Go、Bun 和 Linux 桌面构建依赖的 shell 环境中执行 Linux 发布构建
|
||||||
|
- **AND** 系统 SHALL 生成 Linux server 发布资产
|
||||||
- **AND** 系统 SHALL 生成 Linux desktop 发布资产
|
- **AND** 系统 SHALL 生成 Linux desktop 发布资产
|
||||||
|
|
||||||
#### Scenario: Windows 发布构建
|
#### Scenario: Windows 发布构建
|
||||||
|
|
||||||
- **WHEN** 发布流水线执行 Windows 构建 job
|
- **WHEN** 发布流水线执行 Windows 构建 job
|
||||||
- **THEN** 系统 SHALL 生成 Windows server 发布资产
|
- **THEN** 系统 SHALL 在包含 MSYS2 / MINGW64 构建工具且可访问 Go 与 Bun 工具链的 shell 环境中执行 Windows 发布构建
|
||||||
|
- **AND** 系统 SHALL 生成 Windows server 发布资产
|
||||||
- **AND** 系统 SHALL 生成 Windows desktop 发布资产
|
- **AND** 系统 SHALL 生成 Windows desktop 发布资产
|
||||||
|
|
||||||
#### Scenario: macOS 发布构建
|
#### Scenario: macOS 发布构建
|
||||||
|
|
||||||
- **WHEN** 发布流水线执行 macOS 构建 job
|
- **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 生成 darwin-arm64 server 发布资产
|
||||||
- **AND** 系统 SHALL 生成 macOS desktop universal 发布资产
|
- **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: 版本化发布资产命名
|
### Requirement: 版本化发布资产命名
|
||||||
|
|
||||||
系统 SHALL 为 server 与 desktop 的发布资产使用包含统一版本号和目标平台信息的文件名,确保 Release 页面可直接区分产物用途与平台。
|
系统 SHALL 为 server 与 desktop 的发布资产使用包含统一版本号和目标平台信息的文件名,确保 Release 页面可直接区分产物用途与平台。
|
||||||
|
|||||||
Reference in New Issue
Block a user