1+ name : Release
2+
3+ on :
4+ # 新发布触发
5+ release :
6+ types : [published]
7+
8+ # 手动触发
9+ workflow_dispatch :
10+ inputs :
11+ tag :
12+ description : ' Release tag (e.g., v1.0.0)'
13+ required : true
14+ type : string
15+
16+ env :
17+ CARGO_TERM_COLOR : always
18+ NODE_VERSION : ' 18'
19+ RUST_VERSION : ' 1.85.0'
20+ PNPM_VERSION : ' 8'
21+
22+ jobs :
23+ # 构建发布版本
24+ build-release :
25+ name : Build Release
26+ runs-on : ${{ matrix.platform }}
27+
28+ strategy :
29+ fail-fast : false
30+ matrix :
31+ platform : [macos-latest, windows-latest]
32+ include :
33+ - platform : macos-latest
34+ os : macos
35+ target : universal-apple-darwin
36+ - platform : windows-latest
37+ os : windows
38+ target : x86_64-pc-windows-msvc
39+
40+ steps :
41+ - name : Checkout repository
42+ uses : actions/checkout@v4
43+
44+ - name : Setup Node.js
45+ uses : actions/setup-node@v4
46+ with :
47+ node-version : ${{ env.NODE_VERSION }}
48+
49+ - name : Setup pnpm
50+ uses : pnpm/action-setup@v2
51+ with :
52+ version : ${{ env.PNPM_VERSION }}
53+
54+ - name : Setup Rust
55+ uses : dtolnay/rust-toolchain@stable
56+ with :
57+ toolchain : ${{ env.RUST_VERSION }}
58+
59+ - name : Add Rust targets (macOS)
60+ if : matrix.platform == 'macos-latest'
61+ run : |
62+ rustup target add aarch64-apple-darwin
63+ rustup target add x86_64-apple-darwin
64+
65+ - name : Rust Cache
66+ uses : Swatinem/rust-cache@v2
67+ with :
68+ workspaces : src-tauri
69+
70+ - name : Install frontend dependencies
71+ run : |
72+ if [ -f "pnpm-lock.yaml" ]; then
73+ pnpm install --frozen-lockfile
74+ else
75+ pnpm install
76+ fi
77+ shell : bash
78+
79+ - name : Build application
80+ run : pnpm tauri build --target ${{ matrix.target }}
81+
82+ - name : Upload build artifacts
83+ uses : actions/upload-artifact@v4
84+ with :
85+ name : release-${{ matrix.os }}
86+ path : src-tauri/target/release/bundle/
87+ retention-days : 30
88+
89+ # 创建或更新 GitHub Release
90+ create-release :
91+ name : Create Release
92+ needs : build-release
93+ runs-on : ubuntu-latest
94+ if : github.event_name == 'workflow_dispatch'
95+
96+ steps :
97+ - name : Download all artifacts
98+ uses : actions/download-artifact@v4
99+ with :
100+ path : artifacts
101+
102+ - name : Prepare release assets
103+ run : |
104+ mkdir -p release-assets
105+ find artifacts -name "*.dmg" -exec cp {} release-assets/ \;
106+ find artifacts -name "*.msi" -exec cp {} release-assets/ \;
107+ find artifacts -name "*.exe" -exec cp {} release-assets/ \;
108+
109+ - name : Create Release
110+ uses : softprops/action-gh-release@v1
111+ with :
112+ tag_name : ${{ github.event.inputs.tag }}
113+ name : Release ${{ github.event.inputs.tag }}
114+ files : release-assets/*
115+ env :
116+ GH_TOKEN : ${{ secrets.GH_TOKEN }}
117+
118+ # 更新现有 Release
119+ update-release :
120+ name : Update Release
121+ needs : build-release
122+ runs-on : ubuntu-latest
123+ if : github.event_name == 'release'
124+
125+ steps :
126+ - name : Download all artifacts
127+ uses : actions/download-artifact@v4
128+ with :
129+ path : artifacts
130+
131+ - name : Prepare release assets
132+ run : |
133+ mkdir -p release-assets
134+ find artifacts -name "*.dmg" -exec cp {} release-assets/ \;
135+ find artifacts -name "*.msi" -exec cp {} release-assets/ \;
136+ find artifacts -name "*.exe" -exec cp {} release-assets/ \;
137+
138+ - name : Upload to existing release
139+ uses : softprops/action-gh-release@v1
140+ with :
141+ tag_name : ${{ github.event.release.tag_name }}
142+ files : release-assets/*
143+ env :
144+ GH_TOKEN : ${{ secrets.GH_TOKEN }}
0 commit comments