-
Notifications
You must be signed in to change notification settings - Fork 1
270 lines (224 loc) · 9.12 KB
/
release.yml
File metadata and controls
270 lines (224 loc) · 9.12 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
name: Build and Release FlashForgeWebUI
on:
workflow_dispatch:
inputs:
version:
description: 'Version Number (e.g., 1.0.0)'
required: true
default: ''
prerelease:
description: 'Is this a Pre-Release?'
type: boolean
default: false
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
# Windows x64 (native)
- os: windows-latest
platform: win
arch: x64
output: flashforge-webui-win-x64.exe
# macOS x64 (Intel)
- os: macos-15-intel
platform: mac
arch: x64
output: flashforge-webui-macos-x64.bin
# macOS ARM64 (Apple Silicon)
- os: macos-latest
platform: mac
arch: arm64
output: flashforge-webui-macos-arm64.bin
# Linux x64
- os: ubuntu-latest
platform: linux
arch: x64
output: flashforge-webui-linux-x64.bin
# Linux ARM64 (native ARM runner - requires public repo)
- os: ubuntu-24.04-arm
platform: linux
arch: arm64
output: flashforge-webui-linux-arm64.bin
# Linux ARMv7 (cross-compile from x64)
- os: ubuntu-latest
platform: linux
arch: armv7
output: flashforge-webui-linux-armv7.bin
steps:
- name: Checkout FlashForgeWebUI
uses: actions/checkout@v4
- name: Setup Node.js 20
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
- name: Configure GitHub Packages Authentication
shell: bash
run: |
echo "Setting up GitHub Packages authentication"
echo "@ghosttypes:registry=https://npm.pkg.github.com" >> .npmrc
echo "@parallel-7:registry=https://npm.pkg.github.com" >> .npmrc
echo "//npm.pkg.github.com/:_authToken=${{ secrets.GITHUB_TOKEN }}" >> .npmrc
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Run npm ci
shell: bash
run: |
npm ci
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Pre-download ARMv7 Node.js Binary (if needed)
if: matrix.arch == 'armv7'
shell: bash
run: |
echo "Pre-caching ARMv7 Node.js binary to avoid cross-compilation..."
# Create pkg cache directory (v3.5 is the pkg-fetch cache version)
mkdir -p ~/.pkg-cache/v3.5
# Download pre-built ARMv7 binary from yao-pkg/pkg-binaries
# Using node 20.18.0 linuxstatic build (highest Node 20 recognized by pkg)
curl -L -o ~/.pkg-cache/v3.5/fetched-v20.18.0-linuxstatic-armv7 \
https://github.com/yao-pkg/pkg-binaries/releases/download/node20/node-v20.18.0-linuxstatic-armv7
# Make executable
chmod +x ~/.pkg-cache/v3.5/fetched-v20.18.0-linuxstatic-armv7
# Verify download (should be ~47MB)
ls -lh ~/.pkg-cache/v3.5/
echo "ARMv7 binary cached successfully"
- name: Set Application Version
shell: bash
run: |
VERSION="${{ github.event.inputs.version }}"
if [[ "$VERSION" == *.* && "$VERSION" != *.*.* ]]; then
VERSION="${VERSION}.0"
elif [[ "$VERSION" != *.* ]]; then
VERSION="${VERSION}.0.0"
fi
echo "Setting version to: $VERSION"
npm version "$VERSION" --no-git-tag-version --allow-same-version
- name: Build application
shell: bash
run: |
# Build the TypeScript source
npm run build
# Package with yao-pkg based on platform/arch
if [[ "${{ matrix.platform }}" == "win" ]]; then
npx @yao-pkg/pkg . --targets node20-win-${{ matrix.arch }} --output dist/${{ matrix.output }}
elif [[ "${{ matrix.platform }}" == "mac" ]]; then
npx @yao-pkg/pkg . --targets node20-macos-${{ matrix.arch }} --output dist/${{ matrix.output }}
elif [[ "${{ matrix.platform }}" == "linux" ]]; then
# Special case: ARMv7 needs the linuxstatic target to pick the supported Node 20 build
if [[ "${{ matrix.arch }}" == "armv7" ]]; then
npx @yao-pkg/pkg . --targets node20-linuxstatic-armv7 --output dist/${{ matrix.output }}
else
npx @yao-pkg/pkg . --targets node20-linux-${{ matrix.arch }} --output dist/${{ matrix.output }}
fi
fi
- name: Upload Build Artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.output }}
path: dist/${{ matrix.output }}
if-no-files-found: error
create_github_release:
needs: build
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download all build artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
- name: Display downloaded artifacts structure
shell: bash
run: |
echo "Downloaded artifacts layout:"
ls -R artifacts
- name: Prepare Release Assets
id: prep_assets
shell: bash
run: |
mkdir release_assets
# Copy all executables from artifact directories (including Windows .exe files)
find artifacts/ -type f \( -executable -o -name "*.exe" \) | while IFS= read -r file; do
filename=$(basename "$file")
cp "$file" "release_assets/$filename"
echo "Copied $file to release_assets/$filename"
done
# Also copy any non-executable files (in case executables lose +x during artifact download)
find artifacts/ -type f ! -name "*.exe" | while IFS= read -r file; do
filename=$(basename "$file")
if [[ ! -f "release_assets/$filename" ]]; then
cp "$file" "release_assets/$filename"
echo "Copied $file to release_assets/$filename"
fi
done
echo "Prepared assets in release_assets:"
ls -lh release_assets/
- name: Generate Release Notes
id: generate_notes
shell: bash
run: |
VERSION="${{ github.event.inputs.version }}"
if [[ "$VERSION" == *.* && "$VERSION" != *.*.* ]]; then
VERSION="${VERSION}.0"
elif [[ "$VERSION" != *.* ]]; then
VERSION="${VERSION}.0.0"
fi
IS_PRERELEASE="${{ github.event.inputs.prerelease }}"
RELEASE_TYPE_BADGE=""
if [[ "$IS_PRERELEASE" == "true" ]]; then
RELEASE_TYPE_BADGE=" (Pre-release)"
fi
cat > RELEASE_NOTES.md << EOF
# FlashForgeWebUI v${VERSION}${RELEASE_TYPE_BADGE}
Standalone web-based interface for FlashForge 3D printers.
## Downloads
Choose the appropriate binary for your platform:
- **Windows (x64)**: \`flashforge-webui-win-x64.exe\`
- **macOS (Intel)**: \`flashforge-webui-macos-x64.bin\`
- **macOS (Apple Silicon)**: \`flashforge-webui-macos-arm64.bin\`
- **Linux (x64)**: \`flashforge-webui-linux-x64.bin\`
- **Linux (ARM64)**: \`flashforge-webui-linux-arm64.bin\` (Raspberry Pi 4/5, ARM servers)
- **Linux (ARMv7)**: \`flashforge-webui-linux-armv7.bin\` (Raspberry Pi 3, older ARM devices)
## Installation
1. Download the appropriate binary for your platform
2. Make it executable (Linux/macOS): \`chmod +x flashforge-webui-*.bin\`
3. Run it: \`./flashforge-webui-*.bin\` (or \`flashforge-webui-*.exe\` on Windows)
## Usage
Run with no arguments to start the WebUI server only:
\`\`\`bash
./flashforge-webui-linux-x64.bin
\`\`\`
Or use CLI options to auto-connect to printers:
\`\`\`bash
# Connect to last used printer
./flashforge-webui-linux-x64.bin --last-used
# Connect to all saved printers
./flashforge-webui-linux-x64.bin --all-saved-printers
# Connect to specific printer(s)
./flashforge-webui-linux-x64.bin --printers="192.168.1.100:new:12345678"
# Customize WebUI port and password
./flashforge-webui-linux-x64.bin --webui-port=3001 --webui-password=mypassword
\`\`\`
See the [README](https://github.com/Parallel-7/FlashForgeWebUI) for full documentation.
EOF
echo "VERSION_TAG=v${VERSION}" >> $GITHUB_ENV
echo "RELEASE_NAME=FlashForgeWebUI v${VERSION}${RELEASE_TYPE_BADGE}" >> $GITHUB_ENV
echo "RELEASE_NOTES_PATH=RELEASE_NOTES.md" >> $GITHUB_ENV
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ env.VERSION_TAG }}
name: ${{ env.RELEASE_NAME }}
body_path: ${{ env.RELEASE_NOTES_PATH }}
draft: false
prerelease: ${{ github.event.inputs.prerelease }}
files: |
release_assets/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}