@@ -50,22 +50,21 @@ jobs:
5050 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
5151 with :
5252 version : ${{ env.VERSION }}
53- name : " PulsoidApp ${{ env.VERSION }}"
53+ name : " HRMApp ${{ env.VERSION }}"
5454 tag : ${{ env.VERSION }}
5555 prerelease : true
56- header : " ## Release Notes for PulsoidApp ${{ env.VERSION }}"
56+ header : " ## Release Notes for HRMApp ${{ env.VERSION }}"
5757
5858 - name : Save release notes to file
5959 run : |
6060 echo "${{ steps.release_notes.outputs.body }}" > release_notes.txt
61-
62- - name : Upload release notes artifact (expire in 1 day)
61+
62+ - name : Upload release notes artifact
6363 uses : actions/upload-artifact@v4
6464 with :
65- name : release_notes-v${{ github.run_number }}
65+ name : release_notes
6666 path : release_notes.txt
67- retention-days : 1
68-
67+
6968 build-windows :
7069 name : Build & Upload — Windows
7170 runs-on : windows-latest
@@ -120,12 +119,12 @@ jobs:
120119 shell : pwsh
121120 run : |
122121 $base = "${{ env.PUBLIC_BASE_URL }}/${{ env.VERSION }}${{ env.BUILD_TAG }}"
123- $msi = Test-Path "dist/PulsoidApp -Setup-${{ env.VERSION }}.msi"
124- $exe = Test-Path "dist/PulsoidApp -Setup-${{ env.VERSION }}.exe"
125- if ($msi) { "WIN_MSI_URL=$base/PulsoidApp -Setup-${{ env.VERSION }}.msi" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8 }
126- if ($exe) { "WIN_EXE_URL=$base/PulsoidApp -Setup-${{ env.VERSION }}.exe" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8 }
122+ $msi = Test-Path "dist/HRMApp -Setup-${{ env.VERSION }}.msi"
123+ $exe = Test-Path "dist/HRMApp -Setup-${{ env.VERSION }}.exe"
124+ if ($msi) { "WIN_MSI_URL=$base/HRMApp -Setup-${{ env.VERSION }}.msi" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8 }
125+ if ($exe) { "WIN_EXE_URL=$base/HRMApp -Setup-${{ env.VERSION }}.exe" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8 }
127126
128- linux-x64 :
127+ build-linux :
129128 name : Build & Upload — Linux (x64)
130129 runs-on : ubuntu-latest
131130 needs : prepare
@@ -154,7 +153,7 @@ jobs:
154153 sudo apt-get install -y libfuse2 jq
155154
156155 - name : Build Electron App (Linux x64)
157- run : npm run build:linux:x64
156+ run : npm run build:linux
158157 env :
159158 GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
160159
@@ -193,8 +192,8 @@ jobs:
193192 [ -n "$APPIMG_X64" ] && echo "LINUX_APPIMAGE_URL=$BASE/$APPIMG_X64" >> $GITHUB_OUTPUT
194193 [ -n "$DEB_X64" ] && echo "LINUX_DEB_URL=$BASE/$DEB_X64" >> $GITHUB_OUTPUT
195194
196- raspi-armv7l :
197- name : Build & Upload — Raspberry Pi (armv7)
195+ build-raspi :
196+ name : Build & Upload — Raspberry Pi (armv7/arm64 )
198197 runs-on : ubuntu-latest
199198 needs : prepare
200199 env :
@@ -203,96 +202,37 @@ jobs:
203202 outputs :
204203 ARM7_APPIMG_URL : ${{ steps.links.outputs.ARM7_APPIMG_URL }}
205204 ARM7_DEB_URL : ${{ steps.links.outputs.ARM7_DEB_URL }}
205+ ARM64_APPIMG_URL : ${{ steps.links.outputs.ARM64_APPIMG_URL }}
206+ ARM64_DEB_URL : ${{ steps.links.outputs.ARM64_DEB_URL }}
206207 steps :
207- - uses : actions/checkout@v4
208-
209- - uses : docker/setup-qemu-action@v3
208+ - name : Checkout
209+ uses : actions/checkout@v4
210210
211- # ⬇️ Use true armv7 container (not aarch64)
212- - uses : uraimo/run-on-arch-action@v2
211+ - name : Setup Node.js
212+ uses : actions/setup-node@v4
213213 with :
214- arch : armv7
215- distro : ubuntu22.04
216- githubToken : ${{ github.token }}
217- install : |
218- apt-get update
219- apt-get install -y curl git ca-certificates libfuse2
220- curl -fsSL https://deb.nodesource.com/setup_21.x | bash -
221- apt-get install -y nodejs
222- run : |
223- npm ci
224- npm run build:pi:v7
225- env :
226- GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
227-
228- - name : List dist/
229- run : ls -R dist
214+ node-version : 21
215+ cache : ' npm'
230216
231- # ⬇️ These steps run on the x86_64 host; use linux-amd64 mc
232- - name : Install mc (MinIO Client) on Linux
233- run : |
234- curl -L "https://dl.min.io/client/mc/release/linux-amd64/mc" -o mc
235- chmod +x mc
236- ./mc --version
217+ - name : Install Dependencies
218+ run : npm ci
237219
238- - name : Configure mc alias
220+ - name : Install build deps
239221 run : |
240- ./mc alias set myminio "${{ secrets.MINIO_ENDPOINT }}" "${{ secrets.AWS_ACCESS_KEY }}" "${{ secrets.AWS_SECRET_KEY }}"
222+ sudo apt-get update
223+ sudo apt-get install -y libfuse2 jq
241224
242- - name : Upload Raspberry Pi (armv7) Artifacts
225+ - name : Build Electron App (Raspberry Pi)
226+ run : npm run build:pi
243227 env :
244- TARGET_PREFIX : ${{ env.MINIO_BUCKET_PATH }}/${{ env.VERSION }}${{ env.BUILD_TAG }}/
245- run : |
246- set -e
247- APPIMG_ARMV7L=$(ls dist/*armv7l*.AppImage 2>/dev/null | head -n1 || true)
248- DEB_ARMV7L=$(ls dist/*armv7l*.deb dist/*_armhf.deb 2>/dev/null | head -n1 || true)
249-
250- for f in "$APPIMG_ARMV7L" "$DEB_ARMV7L"; do
251- if [ -n "$f" ] && [ -f "$f" ]; then
252- ./mc cp "$f" "$TARGET_PREFIX"
253- fi
254- done
255-
256- - name : Compose Download Links (Raspberry Pi armv7)
257- id : links
258- run : |
259- BASE="${{ env.PUBLIC_BASE_URL }}/${{ env.VERSION }}${{ env.BUILD_TAG }}"
260- APPIMG_ARMV7L=$(ls dist/*armv7l*.AppImage 2>/dev/null | xargs -n1 -I{} basename "{}" | head -n1 || echo "")
261- [ -n "$APPIMG_ARMV7L" ] && echo "ARM7_APPIMG_URL=$BASE/$APPIMG_ARMV7L" >> $GITHUB_OUTPUT
262-
263- raspi-arm64 :
264- name : Build & Upload — Raspberry Pi (arm64)
265- runs-on : ubuntu-latest
266- needs : prepare
267- env :
268- VERSION : ${{ needs.prepare.outputs.version }}
269- BUILD_TAG : ${{ needs.prepare.outputs.build_tag }}
270- outputs :
271- ARM64_APPIMG_URL : ${{ steps.links.outputs.ARM64_APPIMG_URL }}
272- ARM64_DEB_URL : ${{ steps.links.outputs.ARM64_DEB_URL }}
273- steps :
274- - uses : actions/checkout@v4
275- - uses : docker/setup-qemu-action@v3
276- - uses : uraimo/run-on-arch-action@v2
277- with :
278- arch : aarch64
279- distro : ubuntu22.04
280- githubToken : ${{ github.token }}
281- install : |
282- apt-get update
283- apt-get install -y curl git ca-certificates libfuse2
284- curl -fsSL https://deb.nodesource.com/setup_21.x | bash -
285- apt-get install -y nodejs
286- run : |
287- npm ci
288- npm run build:pi:aarch64
228+ GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
289229
290230 - name : List dist/
291231 run : ls -R dist
292232
293233 - name : Install mc (MinIO Client) on Linux
294234 run : |
295- curl -L "https://dl.min.io/client/mc/release/linux-arm64 /mc" -o mc
235+ curl -L "https://dl.min.io/client/mc/release/linux-amd64 /mc" -o mc
296236 chmod +x mc
297237 ./mc --version
298238
@@ -305,10 +245,12 @@ jobs:
305245 TARGET_PREFIX : ${{ env.MINIO_BUCKET_PATH }}/${{ env.VERSION }}${{ env.BUILD_TAG }}/
306246 run : |
307247 set -e
248+ APPIMG_ARMV7L=$(ls dist/*armv7l*.AppImage 2>/dev/null | head -n1 || true)
249+ DEB_ARMV7L=$(ls dist/*.armv7l.deb dist/*_armhf.deb 2>/dev/null | head -n1 || true)
308250 APPIMG_ARM64=$(ls dist/*arm64*.AppImage 2>/dev/null | head -n1 || true)
309251 DEB_ARM64=$(ls dist/*arm64*.deb 2>/dev/null | head -n1 || true)
310252
311- for f in "$APPIMG_ARM64" "$DEB_ARM64"; do
253+ for f in "$APPIMG_ARMV7L" "$DEB_ARMV7L" "$ APPIMG_ARM64" "$DEB_ARM64"; do
312254 if [ -n "$f" ] && [ -f "$f" ]; then
313255 ./mc cp "$f" "$TARGET_PREFIX"
314256 fi
@@ -318,9 +260,15 @@ jobs:
318260 id : links
319261 run : |
320262 BASE="${{ env.PUBLIC_BASE_URL }}/${{ env.VERSION }}${{ env.BUILD_TAG }}"
263+ APPIMG_ARMV7L=$(ls dist/*armv7l*.AppImage 2>/dev/null | xargs -n1 -I{} basename "{}" | head -n1 || echo "")
264+ DEB_ARMV7L=$(ls dist/*.armv7l.deb dist/*_armhf.deb 2>/dev/null | xargs -n1 -I{} basename "{}" | head -n1 || echo "")
321265 APPIMG_ARM64=$(ls dist/*arm64*.AppImage 2>/dev/null | xargs -n1 -I{} basename "{}" | head -n1 || echo "")
266+ DEB_ARM64=$(ls dist/*arm64*.deb 2>/dev/null | xargs -n1 -I{} basename "{}" | head -n1 || echo "")
267+ [ -n "$APPIMG_ARMV7L" ] && echo "ARM7_APPIMG_URL=$BASE/$APPIMG_ARMV7L" >> $GITHUB_OUTPUT
268+ [ -n "$DEB_ARMV7L" ] && echo "ARM7_DEB_URL=$BASE/$DEB_ARMV7L" >> $GITHUB_OUTPUT
322269 [ -n "$APPIMG_ARM64" ] && echo "ARM64_APPIMG_URL=$BASE/$APPIMG_ARM64" >> $GITHUB_OUTPUT
323-
270+ [ -n "$DEB_ARM64" ] && echo "ARM64_DEB_URL=$BASE/$DEB_ARM64" >> $GITHUB_OUTPUT
271+
324272 build-macos :
325273 name : Build & Upload — macOS
326274 runs-on : macos-latest
@@ -397,30 +345,31 @@ jobs:
397345 needs :
398346 - prepare
399347 - build-windows
400- - linux-x64
401- - raspi-armv7l
402- - raspi-arm64
348+ - build-linux
349+ - build-raspi
403350 - build-macos
404351 env :
405352 VERSION : ${{ needs.prepare.outputs.version }}
406353 BUILD_TAG : ${{ needs.prepare.outputs.build_tag }}
407354 # Windows
408- WIN_EXE_URL : https://uploadminioger1.nekosunevr.co.uk/nekosunetools/pulsoidapp/release/${{ needs.prepare.outputs.version }}${{ needs.prepare.outputs.build_tag }}/PulsoidApp-Setup-${{ needs.prepare.outputs.version }}.exe
409- WIN_MSI_URL : https://uploadminioger1.nekosunevr.co.uk/nekosunetools/pulsoidapp/release/${{ needs.prepare.outputs.version }}${{ needs.prepare.outputs.build_tag }}/PulsoidApp-Setup-${{ needs.prepare.outputs.version }}.msi
410- # Linux x64 ⬅️ use linux-x64 (not build-linux)
411- LINUX_APPIMAGE_URL : https://uploadminioger1.nekosunevr.co.uk/nekosunetools/pulsoidapp/release/${{ needs.prepare.outputs.version }}${{ needs.prepare.outputs.build_tag }}/PulsoidApp-Setup-${{ needs.prepare.outputs.version }}-x86_64.AppImage
412- LINUX_DEB_URL : https://uploadminioger1.nekosunevr.co.uk/nekosunetools/pulsoidapp/release/${{ needs.prepare.outputs.version }}${{ needs.prepare.outputs.build_tag }}/PulsoidApp-Setup-${{ needs.prepare.outputs.version }}-amd64.deb
413- # Raspberry Pi ⬅️ use raspi-* job IDs
414- ARM7_APPIMG_URL : https://uploadminioger1.nekosunevr.co.uk/nekosunetools/pulsoidapp/release/${{ needs.prepare.outputs.version }}${{ needs.prepare.outputs.build_tag }}/PulsoidApp-Setup-${{ needs.prepare.outputs.version }}-armv7l.AppImage
415- ARM64_APPIMG_URL : https://uploadminioger1.nekosunevr.co.uk/nekosunetools/pulsoidapp/release/${{ needs.prepare.outputs.version }}${{ needs.prepare.outputs.build_tag }}/PulsoidApp-Setup-${{ needs.prepare.outputs.version }}-arm64.AppImage
355+ WIN_EXE_URL : ${{ needs.build-windows.outputs.WIN_EXE_URL }}
356+ WIN_MSI_URL : ${{ needs.build-windows.outputs.WIN_MSI_URL }}
357+ # Linux x64
358+ LINUX_APPIMAGE_URL : ${{ needs.build-linux.outputs.LINUX_APPIMAGE_URL }}
359+ LINUX_DEB_URL : ${{ needs.build-linux.outputs.LINUX_DEB_URL }}
360+ # Raspberry Pi
361+ ARM7_APPIMG_URL : ${{ needs.build-raspi.outputs.ARM7_APPIMG_URL }}
362+ ARM7_DEB_URL : ${{ needs.build-raspi.outputs.ARM7_DEB_URL }}
363+ ARM64_APPIMG_URL : ${{ needs.build-raspi.outputs.ARM64_APPIMG_URL }}
364+ ARM64_DEB_URL : ${{ needs.build-raspi.outputs.ARM64_DEB_URL }}
416365 # macOS
417- MAC_DMG_URL : https://uploadminioger1.nekosunevr.co.uk/nekosunetools/pulsoidapp/release/ ${{ needs.prepare.outputs.version }}${{ needs.prepare.outputs.build_tag }}/PulsoidApp-Setup-${{ needs.prepare. outputs.version }}.dmg
418- MAC_ZIP_URL : https://uploadminioger1.nekosunevr.co.uk/nekosunetools/pulsoidapp/release/ ${{ needs.prepare.outputs.version }}${{ needs.prepare.outputs.build_tag }}/PulsoidApp-Setup-${{ needs.prepare. outputs.version }}.zip
366+ MAC_DMG_URL : ${{ needs.build-macos. outputs.MAC_DMG_URL }}
367+ MAC_ZIP_URL : ${{ needs.build-macos. outputs.MAC_ZIP_URL }}
419368 steps :
420369 - name : Download release notes artifact
421370 uses : actions/download-artifact@v4
422371 with :
423- name : release_notes${{ needs.prepare.outputs.build_tag }}
372+ name : release_notes
424373 path : .
425374
426375 - name : Show release notes
@@ -443,75 +392,47 @@ jobs:
443392 run : |
444393 ./mc cp release_notes.txt "${{ env.MINIO_BUCKET_PATH }}/${{ env.VERSION }}${{ env.BUILD_TAG }}/release_notes.txt"
445394
446- - name : Send Release Info to Discord
447- shell : bash
395+ - name : Compose ONE Discord payload and send
448396 env :
449397 DISCORD_WEBHOOK : ${{ secrets.DISCORD_WEBHOOK }}
450- WIN_EXE_URL : ${{ env.WIN_EXE_URL }}
451- WIN_MSI_URL : ${{ env.WIN_MSI_URL }}
452- LINUX_APPIMAGE_URL : ${{ env.LINUX_APPIMAGE_URL }}
453- LINUX_DEB_URL : ${{ env.LINUX_DEB_URL }}
454- ARM7_APPIMG_URL : ${{ env.ARM7_APPIMG_URL }}
455- ARM64_APPIMG_URL : ${{ env.ARM64_APPIMG_URL }}
456- MAC_DMG_URL : ${{ env.MAC_DMG_URL }}
457- MAC_ZIP_URL : ${{ env.MAC_ZIP_URL }}
458398 run : |
459- set -euo pipefail
460-
461- jq -n \
462- --rawfile notes release_notes.txt \
399+ set -e
400+ RELEASE_NOTES=$(cat release_notes.txt)
401+
402+ downloads=""
403+ # Windows
404+ [ -n "${WIN_EXE_URL}" ] && downloads="${downloads}\n• Windows (EXE): ${WIN_EXE_URL}"
405+ [ -n "${WIN_MSI_URL}" ] && downloads="${downloads}\n• Windows (MSI): ${WIN_MSI_URL}"
406+ # Linux x64
407+ [ -n "${LINUX_APPIMAGE_URL}" ] && downloads="${downloads}\n• Linux x64 AppImage: ${LINUX_APPIMAGE_URL}"
408+ [ -n "${LINUX_DEB_URL}" ] && downloads="${downloads}\n• Linux x64 .deb: ${LINUX_DEB_URL}"
409+ # Raspberry Pi
410+ [ -n "${ARM7_APPIMG_URL}" ] && downloads="${downloads}\n• Raspberry Pi ARMv7 AppImage: ${ARM7_APPIMG_URL}"
411+ [ -n "${ARM7_DEB_URL}" ] && downloads="${downloads}\n• Raspberry Pi ARMv7 .deb: ${ARM7_DEB_URL}"
412+ [ -n "${ARM64_APPIMG_URL}" ] && downloads="${downloads}\n• Raspberry Pi ARM64 AppImage: ${ARM64_APPIMG_URL}"
413+ [ -n "${ARM64_DEB_URL}" ] && downloads="${downloads}\n• Raspberry Pi ARM64 .deb: ${ARM64_DEB_URL}"
414+ # macOS
415+ [ -n "${MAC_DMG_URL}" ] && downloads="${downloads}\n• macOS DMG: ${MAC_DMG_URL}"
416+ [ -n "${MAC_ZIP_URL}" ] && downloads="${downloads}\n• macOS ZIP: ${MAC_ZIP_URL}"
417+
418+ [ -z "$downloads" ] && downloads="\n(No build artifacts were detected.)"
419+
420+ payload=$(jq -n \
463421 --arg content "<@&1384262560395559122> **UPDATE (ALL PLATFORMS)**" \
464- --arg title "New Release: v${{ needs.prepare.outputs.version }}" \
465- --arg WIN_EXE_URL "$WIN_EXE_URL" \
466- --arg WIN_MSI_URL "$WIN_MSI_URL" \
467- --arg LINUX_APPIMAGE_URL "$LINUX_APPIMAGE_URL" \
468- --arg LINUX_DEB_URL "$LINUX_DEB_URL" \
469- --arg ARM7_APPIMG_URL "$ARM7_APPIMG_URL" \
470- --arg ARM64_APPIMG_URL "$ARM64_APPIMG_URL" \
471- --arg MAC_DMG_URL "$MAC_DMG_URL" \
472- --arg MAC_ZIP_URL "$MAC_ZIP_URL" \
473- --argjson color 65280 \
474- --arg footer "Released by GitHub Actions" \
475- --arg timestamp "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
476- '
477- def trunc(s; n): if (s|length) > n then (s[0:(n-1)] + "…") else s end;
478-
479- # Build the artifacts list with real newlines via join("\n")
480- def artifacts_block:
481- "**Available Artifacts:**\n" +
482- ([
483- "• [Windows (EXE)](" + $WIN_EXE_URL + ")",
484- "• [Windows (MSI)](" + $WIN_MSI_URL + ")",
485- "• [Linux x64 AppImage](" + $LINUX_APPIMAGE_URL + ")",
486- "• [Linux x64 .deb](" + $LINUX_DEB_URL + ")",
487- "• [Raspberry Pi ARMv7 AppImage](" + $ARM7_APPIMG_URL + ")",
488- "• [Raspberry Pi ARM64 AppImage](" + $ARM64_APPIMG_URL + ")",
489- "• [macOS DMG](" + $MAC_DMG_URL + ")",
490- "• [macOS ZIP](" + $MAC_ZIP_URL + ")"
491- ] | join("\n"));
492-
493- {
494- username: "Pulsoid APP Bot",
495- avatar_url: "https://cdn.discordapp.com/icons/1310653602951594024/cb8a2781368442a92b33dd2cb93b3afd.webp?size=512",
496- content: $content,
497- allowed_mentions: { parse: ["roles"] },
498- embeds: [
499- {
422+ --arg title "New Release: v${VERSION}${BUILD_TAG}" \
423+ --arg desc "${RELEASE_NOTES}\n\n**Downloads**:${downloads}" \
424+ --arg avatar "https://cdn.discordapp.com/icons/1274732053337870417/8f0b3c1852bbd3cc11a237c2d326dcb1.webp?size=1024" \
425+ '{
426+ username: "HRMApp Bot",
427+ avatar_url: $avatar,
428+ content: $content,
429+ embeds: [{
500430 title: $title,
501- description: trunc(($notes + "\n\n" + artifacts_block); 4096),
502- color: $color,
503- footer: { text: $footer },
504- timestamp: $timestamp
505- }
506- ]
507- }' > payload.json
508-
509- http_code=$(curl -sS -o response.txt -w "%{http_code}" \
510- -H "Content-Type: application/json" \
511- -d @payload.json \
512- "$DISCORD_WEBHOOK")
513-
514- echo "Discord HTTP $http_code"
515- if [[ "$http_code" != "204" && "$http_code" != "200" ]]; then
516- echo "Error from Discord:"; cat response.txt; exit 1
517- fi
431+ description: $desc,
432+ color: 16776960,
433+ footer: { text: "Released by GitHub Actions" },
434+ timestamp: (now | todate)
435+ }]
436+ }')
437+
438+ curl -sS -X POST -H "Content-Type: application/json" -d "$payload" "$DISCORD_WEBHOOK"
0 commit comments