Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3393bc84e3 |
286
.github/workflows/build-release.yml
vendored
Normal file
286
.github/workflows/build-release.yml
vendored
Normal file
@@ -0,0 +1,286 @@
|
|||||||
|
name: Build and Release Voidraft
|
||||||
|
|
||||||
|
on:
|
||||||
|
# 推送标签时触发(用于正式发布)
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*' # 触发条件:推送 v 开头的标签,如 v1.0.0
|
||||||
|
branches:
|
||||||
|
- main # 仅当标签在 main 分支时触发
|
||||||
|
|
||||||
|
# 手动触发(用于测试)
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
release:
|
||||||
|
description: '是否创建 Release(测试时选 false)'
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
platforms:
|
||||||
|
description: '要构建的平台(用逗号分隔:windows,linux,macos-intel,macos-arm)'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
default: 'windows,linux'
|
||||||
|
|
||||||
|
env:
|
||||||
|
NODE_OPTIONS: "--max-old-space-size=4096" # 防止 Node.js 内存溢出
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# 准备构建配置
|
||||||
|
prepare:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
||||||
|
should_release: ${{ steps.check-release.outputs.should_release }}
|
||||||
|
steps:
|
||||||
|
- name: 确定构建平台
|
||||||
|
id: set-matrix
|
||||||
|
run: |
|
||||||
|
# 如果是手动触发,根据输入决定平台
|
||||||
|
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
||||||
|
PLATFORMS="${{ github.event.inputs.platforms }}"
|
||||||
|
else
|
||||||
|
# 标签触发,构建所有平台
|
||||||
|
PLATFORMS="windows,linux,macos-intel,macos-arm"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "构建平台: $PLATFORMS"
|
||||||
|
|
||||||
|
# 构建矩阵 JSON
|
||||||
|
MATRIX='{"include":[]}'
|
||||||
|
|
||||||
|
if [[ "$PLATFORMS" == *"windows"* ]]; then
|
||||||
|
MATRIX=$(echo $MATRIX | jq '.include += [{"platform":"windows-latest","os":"windows","arch":"amd64","output_name":"voidraft-windows-amd64.exe","id":"windows"}]')
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$PLATFORMS" == *"linux"* ]]; then
|
||||||
|
MATRIX=$(echo $MATRIX | jq '.include += [{"platform":"ubuntu-22.04","os":"linux","arch":"amd64","output_name":"voidraft-linux-amd64","id":"linux"}]')
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$PLATFORMS" == *"macos-intel"* ]]; then
|
||||||
|
MATRIX=$(echo $MATRIX | jq '.include += [{"platform":"macos-latest","os":"darwin","arch":"amd64","output_name":"voidraft-darwin-amd64","id":"macos-intel"}]')
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$PLATFORMS" == *"macos-arm"* ]]; then
|
||||||
|
MATRIX=$(echo $MATRIX | jq '.include += [{"platform":"macos-latest","os":"darwin","arch":"arm64","output_name":"voidraft-darwin-arm64","id":"macos-arm"}]')
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "matrix=$MATRIX" >> $GITHUB_OUTPUT
|
||||||
|
echo "生成的矩阵:"
|
||||||
|
echo $MATRIX | jq .
|
||||||
|
|
||||||
|
- name: 检查是否创建 Release
|
||||||
|
id: check-release
|
||||||
|
run: |
|
||||||
|
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
||||||
|
# 手动触发,根据输入决定
|
||||||
|
echo "should_release=${{ github.event.inputs.release }}" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
# 标签触发,自动创建 Release
|
||||||
|
echo "should_release=true" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
build:
|
||||||
|
needs: prepare
|
||||||
|
if: ${{ fromJson(needs.prepare.outputs.matrix).include[0] != null }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix: ${{ fromJson(needs.prepare.outputs.matrix) }}
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.platform }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: 检出代码
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: 设置 Go 环境
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: '1.21'
|
||||||
|
cache: true
|
||||||
|
|
||||||
|
- name: 设置 Node.js 环境
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
cache: 'npm'
|
||||||
|
cache-dependency-path: frontend/package-lock.json
|
||||||
|
|
||||||
|
# Linux 平台依赖
|
||||||
|
- name: 安装 Linux 依赖
|
||||||
|
if: matrix.os == 'linux'
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y \
|
||||||
|
build-essential \
|
||||||
|
libgtk-3-dev \
|
||||||
|
libwebkit2gtk-4.0-dev \
|
||||||
|
pkg-config
|
||||||
|
|
||||||
|
# Windows 平台依赖(GitHub Actions 的 Windows runner 已包含 MinGW)
|
||||||
|
- name: 设置 Windows 构建环境
|
||||||
|
if: matrix.os == 'windows'
|
||||||
|
run: |
|
||||||
|
echo "Windows runner 已包含构建工具"
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
# macOS 平台依赖
|
||||||
|
- name: 设置 macOS 构建环境
|
||||||
|
if: matrix.os == 'darwin'
|
||||||
|
run: |
|
||||||
|
# Xcode 命令行工具通常已安装
|
||||||
|
xcode-select --install 2>/dev/null || true
|
||||||
|
|
||||||
|
# 安装 Wails CLI
|
||||||
|
- name: 安装 Wails CLI
|
||||||
|
run: go install github.com/wailsapp/wails/v3/cmd/wails3@latest
|
||||||
|
|
||||||
|
# 安装前端依赖
|
||||||
|
- name: 安装前端依赖
|
||||||
|
working-directory: frontend
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
# 构建前端
|
||||||
|
- name: 构建前端
|
||||||
|
working-directory: frontend
|
||||||
|
run: npm run build
|
||||||
|
|
||||||
|
# 构建 Wails 应用
|
||||||
|
- name: 构建 Wails 应用
|
||||||
|
run: |
|
||||||
|
wails3 build -platform ${{ matrix.os }}/${{ matrix.arch }}
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
# 查找构建产物
|
||||||
|
- name: 查找构建产物
|
||||||
|
id: find_binary
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
if [ "${{ matrix.os }}" = "windows" ]; then
|
||||||
|
BINARY=$(find build/bin -name "*.exe" -type f | head -n 1)
|
||||||
|
elif [ "${{ matrix.os }}" = "darwin" ]; then
|
||||||
|
# macOS 可能生成 .app 包或二进制文件
|
||||||
|
BINARY=$(find build/bin -type f \( -name "*.app" -o ! -name ".*" \) | head -n 1)
|
||||||
|
else
|
||||||
|
BINARY=$(find build/bin -type f ! -name ".*" | head -n 1)
|
||||||
|
fi
|
||||||
|
echo "binary_path=$BINARY" >> $GITHUB_OUTPUT
|
||||||
|
echo "找到的二进制文件: $BINARY"
|
||||||
|
|
||||||
|
# 重命名构建产物
|
||||||
|
- name: 重命名构建产物
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
BINARY_PATH="${{ steps.find_binary.outputs.binary_path }}"
|
||||||
|
if [ -n "$BINARY_PATH" ]; then
|
||||||
|
# 对于 macOS .app 包,打包为 zip
|
||||||
|
if [[ "$BINARY_PATH" == *.app ]]; then
|
||||||
|
cd "$(dirname "$BINARY_PATH")"
|
||||||
|
zip -r "${{ matrix.output_name }}.zip" "$(basename "$BINARY_PATH")"
|
||||||
|
echo "ARTIFACT_PATH=$(pwd)/${{ matrix.output_name }}.zip" >> $GITHUB_ENV
|
||||||
|
else
|
||||||
|
cp "$BINARY_PATH" "${{ matrix.output_name }}"
|
||||||
|
echo "ARTIFACT_PATH=$(pwd)/${{ matrix.output_name }}" >> $GITHUB_ENV
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 上传构建产物到 Artifacts
|
||||||
|
- name: 上传构建产物
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: ${{ matrix.output_name }}
|
||||||
|
path: ${{ env.ARTIFACT_PATH }}
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
|
# 创建 GitHub Release 并上传所有构建产物
|
||||||
|
release:
|
||||||
|
needs: [prepare, build]
|
||||||
|
if: ${{ needs.prepare.outputs.should_release == 'true' }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: 检出代码
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: 下载所有构建产物
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
path: artifacts
|
||||||
|
|
||||||
|
- name: 显示下载的文件
|
||||||
|
run: |
|
||||||
|
echo "下载的构建产物:"
|
||||||
|
ls -R artifacts/
|
||||||
|
|
||||||
|
- name: 准备 Release 文件
|
||||||
|
run: |
|
||||||
|
mkdir -p release
|
||||||
|
find artifacts -type f -exec cp {} release/ \;
|
||||||
|
ls -lh release/
|
||||||
|
|
||||||
|
- name: 生成 Release 说明
|
||||||
|
id: release_notes
|
||||||
|
run: |
|
||||||
|
# 获取版本号
|
||||||
|
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
||||||
|
VERSION="${{ github.sha }}"
|
||||||
|
VERSION_NAME="测试构建 ${VERSION:0:7}"
|
||||||
|
else
|
||||||
|
VERSION="${{ github.ref_name }}"
|
||||||
|
VERSION_NAME="${VERSION}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat > release_notes.md << EOF
|
||||||
|
## Voidraft ${VERSION_NAME}
|
||||||
|
|
||||||
|
### 📦 下载
|
||||||
|
|
||||||
|
根据你的操作系统选择对应的版本:
|
||||||
|
|
||||||
|
- **Windows (64位)**: \`voidraft-windows-amd64.exe\`
|
||||||
|
- **Linux (64位)**: \`voidraft-linux-amd64\`
|
||||||
|
- **macOS (Intel)**: \`voidraft-darwin-amd64.zip\`
|
||||||
|
- **macOS (Apple Silicon)**: \`voidraft-darwin-arm64.zip\`
|
||||||
|
|
||||||
|
### 📝 更新内容
|
||||||
|
|
||||||
|
请查看 [提交历史](../../commits/${{ github.ref_name }}) 了解本次更新的详细内容。
|
||||||
|
|
||||||
|
### 💡 使用说明
|
||||||
|
|
||||||
|
#### Windows
|
||||||
|
1. 下载 `voidraft-windows-amd64.exe`
|
||||||
|
2. 直接运行即可
|
||||||
|
|
||||||
|
#### Linux
|
||||||
|
1. 下载 `voidraft-linux-amd64`
|
||||||
|
2. 添加执行权限:`chmod +x voidraft-linux-amd64`
|
||||||
|
3. 运行:`./voidraft-linux-amd64`
|
||||||
|
|
||||||
|
#### macOS
|
||||||
|
1. 下载对应架构的 zip 文件
|
||||||
|
2. 解压后运行
|
||||||
|
3. 如果提示无法打开,请在 系统偏好设置 > 安全性与隐私 中允许运行
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
构建时间: $(date -u +"%Y-%m-%d %H:%M:%S UTC")
|
||||||
|
EOF
|
||||||
|
|
||||||
|
- name: 创建 GitHub Release
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
with:
|
||||||
|
files: release/*
|
||||||
|
body_path: release_notes.md
|
||||||
|
draft: false
|
||||||
|
prerelease: ${{ github.event_name == 'workflow_dispatch' }}
|
||||||
|
tag_name: ${{ github.event_name == 'workflow_dispatch' && format('test-{0}', github.sha) || github.ref_name }}
|
||||||
|
name: ${{ github.event_name == 'workflow_dispatch' && format('测试构建 {0}', github.sha) || github.ref_name }}
|
||||||
|
generate_release_notes: true
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
@@ -1 +1 @@
|
|||||||
VERSION=1.5.2
|
VERSION=1.5.3
|
||||||
|
|||||||
Reference in New Issue
Block a user