forked from LizardByte/Sunshine
-
-
Notifications
You must be signed in to change notification settings - Fork 107
330 lines (286 loc) · 12.5 KB
/
main.yml
File metadata and controls
330 lines (286 loc) · 12.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
name: Build and Release
on:
pull_request:
branches:
- master
types:
- opened
- synchronize
- reopened
push:
branches:
- master
release:
types: [published]
workflow_dispatch:
concurrency:
group: '${{ github.workflow }}-${{ github.ref }}'
cancel-in-progress: true
jobs:
github_env:
name: GitHub Env Debug
runs-on: ubuntu-latest
steps:
- name: Dump github context
run: echo "$GITHUB_CONTEXT"
shell: bash
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
setup_release:
name: Setup Release
outputs:
publish_release: ${{ steps.setup_release_auto.outputs.publish_release || steps.setup_release_release.outputs.publish_release || steps.setup_release_manual.outputs.publish_release }}
release_body: ${{ steps.setup_release_auto.outputs.release_body || steps.setup_release_release.outputs.release_body || steps.setup_release_manual.outputs.release_body }}
release_commit: ${{ steps.setup_release_auto.outputs.release_commit || steps.setup_release_release.outputs.release_commit || steps.setup_release_manual.outputs.release_commit }}
release_generate_release_notes: ${{ steps.setup_release_auto.outputs.release_generate_release_notes || steps.setup_release_release.outputs.release_generate_release_notes || steps.setup_release_manual.outputs.release_generate_release_notes }}
release_tag: ${{ steps.setup_release_auto.outputs.release_tag || steps.setup_release_release.outputs.release_tag || steps.setup_release_manual.outputs.release_tag }}
release_version: ${{ steps.setup_release_auto.outputs.release_version || steps.setup_release_release.outputs.release_version || steps.setup_release_manual.outputs.release_version }}
permissions:
contents: write # read does not work to check squash and merge details
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Debug GitHub Event
run: |
echo "GitHub Event Name: ${{ github.event_name }}"
echo "Has commits field: ${{ contains(toJson(github.event), 'commits') }}"
- name: Setup Release (Auto)
id: setup_release_auto
if: github.event_name != 'workflow_dispatch' && github.event_name != 'release'
uses: LizardByte/setup-release-action@v2025.426.225
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Release (Release event)
id: setup_release_release
if: github.event_name == 'release'
env:
RELEASE_BODY: ${{ github.event.release.body }}
run: |
TAG="${{ github.event.release.tag_name }}"
SUFFIX=$([ "${{ github.event.release.target_commitish }}" = "master" ] && echo "" || echo "-dev")
echo "publish_release=true" >> $GITHUB_OUTPUT
{
echo "release_body<<RELEASE_BODY_EOF"
echo "$RELEASE_BODY"
echo "RELEASE_BODY_EOF"
} >> $GITHUB_OUTPUT
echo "release_commit=${{ github.event.release.target_commitish }}" >> $GITHUB_OUTPUT
echo "release_generate_release_notes=false" >> $GITHUB_OUTPUT
echo "release_tag=${TAG}${SUFFIX}" >> $GITHUB_OUTPUT
echo "release_version=${TAG}${SUFFIX}" >> $GITHUB_OUTPUT
- name: Setup Release (Manual)
id: setup_release_manual
if: github.event_name == 'workflow_dispatch'
run: |
SUFFIX=$([ "${{ github.ref_name }}" = "master" ] && echo "" || echo "-dev")
echo "publish_release=false" >> $GITHUB_OUTPUT
echo "release_body=Manual build (${{ github.ref_name }})" >> $GITHUB_OUTPUT
echo "release_commit=${{ github.sha }}" >> $GITHUB_OUTPUT
echo "release_generate_release_notes=false" >> $GITHUB_OUTPUT
echo "release_tag=manual-$(date +%Y%m%d-%H%M%S)${SUFFIX}" >> $GITHUB_OUTPUT
echo "release_version=manual-$(date +%Y%m%d-%H%M%S)${SUFFIX}" >> $GITHUB_OUTPUT
build_win:
name: Windows
needs: setup_release
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ github.event_name == 'release' && github.event.release.tag_name || github.sha }}
submodules: recursive
- name: Setup Dependencies Windows
uses: msys2/setup-msys2@v2
with:
msystem: ucrt64
update: true
install: >-
wget
- name: Update Windows dependencies
env:
gcc_version: '15.1.0-5'
shell: msys2 {0}
run: |
broken_deps=(
"mingw-w64-ucrt-x86_64-gcc"
"mingw-w64-ucrt-x86_64-gcc-libs"
)
tarballs=""
for dep in "${broken_deps[@]}"; do
tarball="${dep}-${gcc_version}-any.pkg.tar.zst"
# download and install working version
wget https://repo.msys2.org/mingw/ucrt64/${tarball}
tarballs="${tarballs} ${tarball}"
done
# install broken dependencies
if [ -n "$tarballs" ]; then
pacman -U --noconfirm ${tarballs}
fi
# install dependencies
dependencies=(
"git"
"mingw-w64-ucrt-x86_64-cmake"
"mingw-w64-ucrt-x86_64-ninja"
"mingw-w64-ucrt-x86_64-cppwinrt"
"mingw-w64-ucrt-x86_64-curl-winssl"
"mingw-w64-ucrt-x86_64-graphviz"
"mingw-w64-ucrt-x86_64-MinHook"
"mingw-w64-ucrt-x86_64-miniupnpc"
"mingw-w64-ucrt-x86_64-nlohmann-json"
"mingw-w64-ucrt-x86_64-nodejs"
"mingw-w64-ucrt-x86_64-nsis"
"mingw-w64-ucrt-x86_64-onevpl"
"mingw-w64-ucrt-x86_64-openssl"
"mingw-w64-ucrt-x86_64-toolchain"
"mingw-w64-ucrt-x86_64-autotools"
)
# Note: mingw-w64-ucrt-x86_64-rust conflicts with fixed gcc-15.1.0-5
# We install Rust via rustup in a separate step
pacman -Syu --noconfirm --ignore="$(IFS=,; echo "${broken_deps[*]}")" "${dependencies[@]}"
- name: Build Opus 1.6.1 from source
shell: msys2 {0}
run: |
echo "Downloading Opus 1.6.1..."
wget -q https://downloads.xiph.org/releases/opus/opus-1.6.1.tar.gz
tar xzf opus-1.6.1.tar.gz
cd opus-1.6.1
# Touch generated files to prevent automake/autoconf regeneration
touch aclocal.m4 configure Makefile.in config.h.in */Makefile.in
./configure --prefix=/ucrt64 --enable-shared --enable-static --disable-doc --disable-extra-programs
make -j$(nproc)
make install
# Verify installation
echo "Opus version installed:"
pkg-config --modversion opus
echo "Opus libs:"
ls -la /ucrt64/lib/libopus*
- name: Install Rust (for Tauri GUI)
shell: msys2 {0}
run: |
echo "Installing Rust via rustup..."
# Rust installs to Windows user directory
WINDOWS_USER=$(cmd //c "echo %USERNAME%" | tr -d '\r')
CARGO_BIN="/c/Users/${WINDOWS_USER}/.cargo/bin"
export PATH="$CARGO_BIN:$PATH"
# Check if cargo already exists
if command -v cargo &> /dev/null; then
echo "Rust already installed: $(cargo --version)"
else
# Download and install rustup
curl --proto '=https' --tlsv1.2 -sSf https://win.rustup.rs/x86_64 -o /tmp/rustup-init.exe
/tmp/rustup-init.exe -y --default-toolchain stable --profile minimal
# Refresh PATH
sleep 3
export PATH="$CARGO_BIN:$PATH"
# Verify installation
if [ -f "$CARGO_BIN/cargo.exe" ]; then
echo "Rust installed successfully: $(cargo --version)"
else
echo "Warning: Rust installed but cargo not found at $CARGO_BIN"
exit 1
fi
fi
- name: Verify Build Tools
shell: msys2 {0}
run: |
echo "Verifying build tools are installed..."
which cmake || (echo "cmake not found" && exit 1)
which ninja || (echo "ninja not found" && exit 1)
which gcc || (echo "gcc not found" && exit 1)
# verify Rust is in PATH
WINDOWS_USER=$(cmd //c "echo %USERNAME%" | tr -d '\r')
CARGO_BIN="/c/Users/${WINDOWS_USER}/.cargo/bin"
export PATH="$CARGO_BIN:$PATH"
which cargo || (echo "cargo not found" && exit 1)
echo "All build tools verified successfully"
echo " CMake: $(cmake --version | head -1)"
echo " Ninja: $(ninja --version)"
echo " GCC: $(gcc --version | head -1)"
echo " Cargo: $(cargo --version)"
- name: Build Windows
shell: msys2 {0}
env:
BRANCH: ${{ github.head_ref || github.ref_name }}
BUILD_VERSION: ${{ needs.setup_release.outputs.release_tag }}.杂鱼
COMMIT: ${{ needs.setup_release.outputs.release_commit }}
run: |
# add Rust to PATH for Tauri GUI build
WINDOWS_USER=$(cmd //c "echo %USERNAME%" | tr -d '\r')
CARGO_BIN="/c/Users/${WINDOWS_USER}/.cargo/bin"
export PATH="$CARGO_BIN:$PATH"
mkdir -p build
cmake \
-B build \
-G Ninja \
-S . \
-DBUILD_DOCS=OFF \
-DSUNSHINE_ASSETS_DIR=assets \
-DSUNSHINE_PUBLISHER_NAME='${{ github.repository_owner }}' \
-DSUNSHINE_PUBLISHER_WEBSITE='https://github.com/qiin2333/Sunshine-Foundation' \
-DSUNSHINE_PUBLISHER_ISSUE_URL='https://github.com/qiin2333/Sunshine-Foundation/issues'
ninja -C build
ninja -C build sunshine-control-panel
- name: Package Windows
shell: msys2 {0}
run: |
mkdir -p artifacts
cd build
# package - 生成 NSIS 安装包和 ZIP 便携版
cpack -G NSIS --config ./CPackConfig.cmake --verbose
cpack -G ZIP --config ./CPackConfig.cmake --verbose
# move
mv ./cpack_artifacts/Sunshine.exe ../artifacts/sunshine-windows-installer.exe
mv ./cpack_artifacts/Sunshine.zip ../artifacts/sunshine-windows-portable.zip
- name: Generate Checksums
shell: pwsh
run: |
# 生成 SHA256 校验和
.\scripts\generate-checksums.ps1 -Path .\artifacts -Output "SHA256SUMS.txt"
- name: Package Windows Debug Info
working-directory: build
run: |
# use .dbg file extension for binaries to avoid confusion with real packages
Get-ChildItem -File -Recurse | `
% { Rename-Item -Path $_.PSPath -NewName $_.Name.Replace(".exe",".dbg") }
# save the binaries with debug info
7z -r `
"-xr!CMakeFiles" `
"-xr!cpack_artifacts" `
a "../artifacts/sunshine-win32-debuginfo.7z" "*.dbg"
- name: Rename release assets
shell: msys2 {0}
run: |
# Format tag to vYEAR.DATE where DATE is zero-padded to 4 digits
TAG="${{ needs.setup_release.outputs.release_tag }}"
NEWTAG="$TAG"
if [[ "$TAG" =~ ^v([0-9]{4})\.([0-9]+) ]]; then
YEAR="${BASH_REMATCH[1]}"
DATE_PART="${BASH_REMATCH[2]}"
DATE_PADDED=$(printf "%04d" "$DATE_PART")
NEWTAG="v${YEAR}.${DATE_PADDED}"
fi
# 重命名安装包和便携版
mv artifacts/sunshine-windows-installer.exe "artifacts/Sunshine.${NEWTAG}.WindowsInstaller.exe"
mv artifacts/sunshine-windows-portable.zip "artifacts/Sunshine.${NEWTAG}.WindowsPortable.zip"
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: sunshine-windows-r${{ github.run_number }}
path: |
artifacts/Sunshine.*.WindowsInstaller.exe
artifacts/Sunshine.*.WindowsPortable.zip
artifacts/SHA256SUMS.txt
artifacts/checksums.json
if-no-files-found: error
- name: Create/Update GitHub Release
if: needs.setup_release.outputs.publish_release == 'true'
uses: LizardByte/create-release-action@v2025.426.1549
with:
allowUpdates: true
body: ${{ needs.setup_release.outputs.release_body }}
generateReleaseNotes: ${{ needs.setup_release.outputs.release_generate_release_notes }}
name: ${{ needs.setup_release.outputs.release_tag }}.杂鱼
prerelease: true
tag: ${{ needs.setup_release.outputs.release_tag }}.杂鱼
token: ${{ secrets.GH_BOT_TOKEN }}