Files
BetterDesk/docs/PRE_RELEASE_CHECKLIST.md
UNITRONIX fbdf5ba19e fix(ci): retag GHCR latest on stable release (#387)
Stable Release/tag builds were skipped for [version-bump] commits and never moved latest, so Docker installs on :latest stayed on 3.5.4 without the #382 signal fix. Dispatch now publishes latest + VERSION.

Refs #387

Thanks: INSOLVE (Honorary); Marco Jakobs (@jacotec); MyNameisStitch (@MyNameisStitch); Redspin (@playerumpknow)
2026-08-29 02:03:25 +02:00

9.1 KiB

Pre-Release Validation Checklist

Use this checklist before every tagged release to ensure quality and stability.


1. Go Server

  • Build: cd betterdesk-server && go build -o betterdesk-server . — exits 0
  • Vet: go vet ./... — no warnings
  • Tests: go test ./... — all pass
  • Cross-compile: GOOS=linux GOARCH=amd64, GOOS=linux GOARCH=arm64, GOOS=windows GOARCH=amd64
  • Binary starts: runs with --help, prints version
  • SQLite migration: fresh DB created and migrated automatically
  • PostgreSQL migration: (if available) fresh DB created and migrated

2. Node.js Console

  • Install: cd web-nodejs && npm ci — exits 0
  • Audit: npm audit --omit=dev --audit-level=moderate — 0 moderate+ vulnerabilities (or documented exceptions)
  • Unit tests: npm run test:ci — all pass (same command as Web Console CI)
  • Secret scan: gitleaks detect --source . --config .gitleaks.toml and bash scripts/check-no-sensitive-paths.sh — no operator fingerprints
  • i18n coverage: npm run i18n:check — 0 missing keys across all languages
  • Startup: node server.js starts without errors, serves on port 5000
  • Login: Admin login works, session created
  • Critical pages: Dashboard, Devices, Users, Settings render correctly

3. RdClient Desktop (Tauri)

  • Install deps: cd rdclient-desktop && npm ci
  • Rust check: cd rdclient-desktop/src-tauri && cargo check && cargo test discovery
  • Tauri build: npm run build — deb/AppImage/MSI as configured
  • Setup: LAN discovery or manual URL; probe_server_url rejects non-panel hosts
  • Settings: sign out, reset client clears cookies + vault
  • Linux session: VP9/H.264 stable on WebKitGTK (no AV1 decode loop)
  • Windows: WebView2 runtime present; session connects
  • Generator RdClient: new bundle → 6 platform builds queue on build host with Rust/Tauri toolchain

4. BetterDesk Desktop (native Rust + Flutter)

  • Core tests: cd betterdesk-desktop && cargo test
  • Flutter tests: cd betterdesk-desktop/flutter && flutter test
  • Toolchain check: python betterdesk-desktop/build.py check
  • Windows artifacts: EXE, portable ZIP and MSI are attached to the release
  • Linux artifacts: .deb, .rpm, AppImage and .tar.gz are attached
  • Checksums: DESKTOP_CHECKSUMS.sha256 matches every desktop artifact
  • Setup: manual HTTPS URL, scheme-less auto-probe, explicit HTTP, deploy string and loopback URL work
  • Security: explicit HTTP is visibly reported as plaintext; invalid server key and URL credentials are rejected
  • Tray: closing the window hides it; tray menu restores or explicitly quits
  • Elevation: machine/security settings fail closed without UAC/polkit confirmation
  • Identity: durable device ID, secure Ed25519 key and rotating session password survive restart
  • Remote desktop: Windows capture, input, clipboard, bounded files, audio negotiation and monitor enumeration are exercised in both directions
  • Interop: BetterDesk Desktop ↔ BetterDesk server ↔ RustDesk peer and CDAP agent
  • Performance: UI remains responsive during connection, reconnect and transfers

5. Desktop Client (Tauri — legacy betterdesk-mgmt)

  • Install deps: cd betterdesk-mgmt && pnpm install
  • Frontend build: pnpm build — no errors
  • Tauri build: cargo tauri build — NSIS + MSI produced
  • Installer runs: installs and launches without crash
  • Single-instance: second launch brings first to foreground

5. Agent Client (Tauri)

  • Install deps: cd betterdesk-agent-client && pnpm install
  • Build: cargo tauri build — NSIS produced
  • Setup wizard: 5-step onboarding completes successfully
  • Registration: device appears in server peer list

6. Native Agent (Go)

  • Build: cd betterdesk-agent && go build -o betterdesk-agent .
  • Connection: connects to CDAP gateway, manifests registers
  • Heartbeat: metrics flow (CPU / Memory / Disk)

7. Docker

  • Build all images: docker compose build — no errors
  • Start stack: docker compose up -d — all containers healthy
  • API reachable: curl http://localhost:21114/api/health returns OK
  • Console reachable: curl http://localhost:5000 returns HTML
  • Single-container (local build): docker compose -f docker-compose.single.yml up -d works
  • Official quick-start (GHCR pull): docker compose -f docker-compose.quick.single.yml pull && up -d works

8. Installer Scripts

  • Linux fresh: sudo ./betterdesk.sh --auto on clean Ubuntu/Debian
  • Linux update: sudo ./betterdesk.sh option 2 preserves DB + config
  • Linux privilege migration: run sudo node web-nodejs/scripts/linux-ensure-console-user.js; verify the sudoers file contains only the fixed /usr/local/libexec/betterdesk/betterdesk-privileged-update.js broker and no ExecStartPre=+...linux-ensure-console-user.js remains in the console unit.
  • Linux protected binary: if the Go server is root-owned, deploy the reviewed binary with the documented root-only helper; confirm the panel reports a manual step instead of using sudo on repository scripts.
  • Windows fresh: .\betterdesk.ps1 -Auto on clean Windows Server
  • Windows update: .\betterdesk.ps1 option 2 preserves DB + config
  • Docker script: ./betterdesk-docker.sh option 1 installs successfully
  • Static CI: Installer CI passes Bash syntax, PowerShell AST and Compose validation; install.sh is included in version verification.
  • Installer unit gate: Installer CI runs the protocol, safe-path, disk-space preflight and binary-rollback tests; the non-mutating --help checks pass.
  • Protocol matrix: run node scripts/installer-protocol-check.js against the selected API, console/reverse-proxy URL and signal/relay ports; for HTTPS confirm the certificate SAN and redirect behaviour.
  • Agent fallback: Linux agent service and Windows NSSM service start; on a disposable Windows host with NSSM unavailable, the scheduled-task fallback starts and -Uninstall / -u removes both service/task variants while preserving data; use -Purge / --purge only for explicit cleanup.
  • Support Agent lifecycle: betterdesk-support-agent -install is idempotent; -uninstall removes autostart and binaries while preserving enrollment state, and -uninstall -purge removes state only when requested.
  • Native uninstall: betterdesk.sh --auto --uninstall and betterdesk.ps1 -Auto -Uninstall remove services while preserving data; repeat with --purge / -Purge only when data removal is intended.
  • Docker uninstall: default install.sh --uninstall preserves volumes; --purge removes them only after an explicit data-loss decision.
  • Rollback: force a failed update in a disposable environment and confirm the previous console/source/binary remains usable and update SHA is not advanced.
  • Runtime smoke: run the manual Installer CI Docker runtime smoke workflow for the exact GHCR tag intended for release.
  • Lifecycle E2E: on isolated Linux and Windows hosts, execute fresh install → update → repair → backup/restore → uninstall → reinstall; record elapsed time and confirm no duplicate services, rules or data.

See docs/important/installer-contract.md for the lifecycle guarantees and platform endpoint matrix.

9. Documentation & Release

Applies only to merges into main (stable). Version bump, tag, and GitHub Release are automated by .github/workflows/version-bump-main.yml — see branching-and-versioning.md.

  • PR source: changes merged from devmain (not direct commits to main)
  • CHANGELOG.md: [Unreleased] section reflects this release (CI moves it into the version section on merge)
  • README.md: reflects current features
  • Version parity: node scripts/bump-version.js --verify passes locally (CI enforces on version file changes)
  • After merge: verify CI created tag v<version> and GitHub Release
  • GHCR image tags: verify ghcr.io/unitronix/betterdesk (official), betterdesk-server, and betterdesk-console show semver tag (e.g. 3.1.0) and git ref (v3.1.0) after workflow completes
  • Sync dev: merge maindev so development continues from the new minor version
  • Manual fallback: Actions → “Build & Publish Docker Images” → Run workflow → leave tag latest (publishes latest + current VERSION) or set tag input v<version> if you only need a custom tag. Confirm package tags include both semver and latest after a stable release.
  • No secrets in diff: git diff --cached has no API keys / passwords
  • No debug code: no console.log debug statements, no TODO in shipped code