From fe354d1db97ebca991fe4f976701d1590efaef17 Mon Sep 17 00:00:00 2001 From: Daniele Favara Date: Fri, 21 Aug 2026 10:57:31 +0200 Subject: [PATCH 1/9] feat: add release please configuration --- release-please-config.json | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 release-please-config.json diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000..5dcb02b --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "release-type": "simple", + "include-v-in-tag": true, + "include-component-in-tag": false, + "pull-request-title-pattern": "chore: release ${version}", + "packages": { + ".": { + "package-name": "rustdesk-web-stack", + "initial-version": "0.1.0", + "changelog-path": "CHANGELOG.md", + "extra-files": [ + { + "type": "yaml", + "path": "charts/rustdesk-web/Chart.yaml", + "jsonpath": "$.version" + }, + { + "type": "yaml", + "path": "charts/rustdesk-web/Chart.yaml", + "jsonpath": "$.appVersion" + } + ] + } + } +} From 5b6d17e5e629eef68d5ce67d160bf09a02f591c1 Mon Sep 17 00:00:00 2001 From: Daniele Favara Date: Fri, 21 Aug 2026 10:57:39 +0200 Subject: [PATCH 2/9] feat: bootstrap release manifest --- .release-please-manifest.json | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .release-please-manifest.json diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 0000000..e18ee07 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.0.0" +} From 819bb9f02dbf9c877ca0edaaa0609fadf0273312 Mon Sep 17 00:00:00 2001 From: Daniele Favara Date: Fri, 21 Aug 2026 10:57:52 +0200 Subject: [PATCH 3/9] feat: publish releases and Helm chart OCI --- .github/workflows/release.yml | 96 +++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..769e87e --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,96 @@ +name: Release + +on: + push: + branches: [main] + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + packages: write + +concurrency: + group: release-${{ github.ref }} + cancel-in-progress: false + +jobs: + release-please: + runs-on: ubuntu-22.04 + outputs: + release_created: ${{ steps.release.outputs.release_created }} + version: ${{ steps.release.outputs.version }} + tag_name: ${{ steps.release.outputs.tag_name }} + steps: + - name: Release Please + id: release + uses: googleapis/release-please-action@v4 + with: + config-file: release-please-config.json + manifest-file: .release-please-manifest.json + + publish: + needs: release-please + if: needs.release-please.outputs.release_created == 'true' + runs-on: ubuntu-22.04 + steps: + - name: Checkout release tag + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + ref: ${{ needs.release-please.outputs.tag_name }} + + - name: Log in to GHCR for Docker + uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build release image + shell: bash + env: + IMAGE_TAG: ghcr.io/nomed/rustdesk-web-stack:${{ needs.release-please.outputs.version }} + run: bash build/build-baseline-image.sh + + - name: Publish release image + shell: bash + run: | + set -euo pipefail + version='${{ needs.release-please.outputs.version }}' + docker push "ghcr.io/nomed/rustdesk-web-stack:${version}" + docker tag "ghcr.io/nomed/rustdesk-web-stack:${version}" "ghcr.io/nomed/rustdesk-web-stack:v${version}" + docker tag "ghcr.io/nomed/rustdesk-web-stack:${version}" ghcr.io/nomed/rustdesk-web-stack:latest + docker push "ghcr.io/nomed/rustdesk-web-stack:v${version}" + docker push ghcr.io/nomed/rustdesk-web-stack:latest + + - name: Set up Helm + uses: azure/setup-helm@v4.3.1 + + - name: Validate Helm chart + shell: bash + run: | + set -euo pipefail + helm lint charts/rustdesk-web + helm template rustdesk-web charts/rustdesk-web >/dev/null + + - name: Package Helm chart + shell: bash + run: | + set -euo pipefail + version='${{ needs.release-please.outputs.version }}' + test "$(awk '/^version:/ {print $2}' charts/rustdesk-web/Chart.yaml)" = "${version}" + test "$(awk -F'"' '/^appVersion:/ {print $2}' charts/rustdesk-web/Chart.yaml)" = "${version}" + mkdir -p dist/chart + helm package charts/rustdesk-web --destination dist/chart + + - name: Log in to GHCR for Helm + shell: bash + run: | + echo "${{ secrets.GITHUB_TOKEN }}" | helm registry login ghcr.io --username "${{ github.actor }}" --password-stdin + + - name: Publish Helm chart as OCI + shell: bash + run: | + set -euo pipefail + version='${{ needs.release-please.outputs.version }}' + helm push "dist/chart/rustdesk-web-${version}.tgz" oci://ghcr.io/nomed/charts From d25ea9b167b196d9ef87a082bc2628d6bebe0fa4 Mon Sep 17 00:00:00 2001 From: Daniele Favara Date: Fri, 21 Aug 2026 10:57:58 +0200 Subject: [PATCH 4/9] fix: align chart metadata with release version --- charts/rustdesk-web/Chart.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/charts/rustdesk-web/Chart.yaml b/charts/rustdesk-web/Chart.yaml index abab78f..20026d2 100644 --- a/charts/rustdesk-web/Chart.yaml +++ b/charts/rustdesk-web/Chart.yaml @@ -1,10 +1,12 @@ apiVersion: v2 name: rustdesk-web version: 0.1.0 -appVersion: "dev" +appVersion: "0.1.0" description: Unofficial Helm chart for the RustDesk Web Client deployment stack type: application home: https://github.com/nomed/rustdesk-web-stack sources: - https://github.com/nomed/rustdesk-web-stack - https://github.com/rustdesk/rustdesk +annotations: + artifacthub.io/license: AGPL-3.0 From cad01c1753052b9b1d2159bf0cb2535f4ee7ff9e Mon Sep 17 00:00:00 2001 From: Daniele Favara Date: Fri, 21 Aug 2026 10:58:04 +0200 Subject: [PATCH 5/9] fix: point chart to released image --- charts/rustdesk-web/values.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/charts/rustdesk-web/values.yaml b/charts/rustdesk-web/values.yaml index e6b0ae7..b46b733 100644 --- a/charts/rustdesk-web/values.yaml +++ b/charts/rustdesk-web/values.yaml @@ -1,14 +1,14 @@ replicaCount: 1 image: - repository: ghcr.io/nomed/rustdesk-web - tag: dev + repository: ghcr.io/nomed/rustdesk-web-stack + tag: "" pullPolicy: IfNotPresent service: type: ClusterIP port: 80 - targetPort: 8080 + targetPort: 80 ingress: enabled: false From 8dbeac414a01426aee8ed1c844294a9636055c00 Mon Sep 17 00:00:00 2001 From: Daniele Favara Date: Fri, 21 Aug 2026 10:58:15 +0200 Subject: [PATCH 6/9] fix: make chart use released image version --- charts/rustdesk-web/templates/deployment.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/charts/rustdesk-web/templates/deployment.yaml b/charts/rustdesk-web/templates/deployment.yaml index 9d168b2..fb8abd7 100644 --- a/charts/rustdesk-web/templates/deployment.yaml +++ b/charts/rustdesk-web/templates/deployment.yaml @@ -21,7 +21,7 @@ spec: spec: containers: - name: web - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + image: "{{ .Values.image.repository }}:{{ default .Chart.AppVersion .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - name: http @@ -29,11 +29,11 @@ spec: protocol: TCP readinessProbe: httpGet: - path: /healthz + path: / port: http livenessProbe: httpGet: - path: /healthz + path: / port: http resources: {{ toYaml .Values.resources | indent 12 }} From e3fedc973d0568b417f7a790d1aca61bc147d63f Mon Sep 17 00:00:00 2001 From: Daniele Favara Date: Fri, 21 Aug 2026 10:58:38 +0200 Subject: [PATCH 7/9] fix: update Helm metadata atomically in releases --- release-please-config.json | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/release-please-config.json b/release-please-config.json index 5dcb02b..91d701f 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -11,14 +11,8 @@ "changelog-path": "CHANGELOG.md", "extra-files": [ { - "type": "yaml", - "path": "charts/rustdesk-web/Chart.yaml", - "jsonpath": "$.version" - }, - { - "type": "yaml", - "path": "charts/rustdesk-web/Chart.yaml", - "jsonpath": "$.appVersion" + "type": "generic", + "path": "charts/rustdesk-web/Chart.yaml" } ] } From d778a92f289e4ba570219313d2d80f501a845873 Mon Sep 17 00:00:00 2001 From: Daniele Favara Date: Fri, 21 Aug 2026 10:58:44 +0200 Subject: [PATCH 8/9] fix: annotate chart versions for release please --- charts/rustdesk-web/Chart.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/charts/rustdesk-web/Chart.yaml b/charts/rustdesk-web/Chart.yaml index 20026d2..5bc178b 100644 --- a/charts/rustdesk-web/Chart.yaml +++ b/charts/rustdesk-web/Chart.yaml @@ -1,7 +1,7 @@ apiVersion: v2 name: rustdesk-web -version: 0.1.0 -appVersion: "0.1.0" +version: 0.1.0 # x-release-please-version +appVersion: "0.1.0" # x-release-please-version description: Unofficial Helm chart for the RustDesk Web Client deployment stack type: application home: https://github.com/nomed/rustdesk-web-stack From ff89d07136158efbcab75ed821bdd61998b9bba5 Mon Sep 17 00:00:00 2001 From: Daniele Favara Date: Fri, 21 Aug 2026 10:59:02 +0200 Subject: [PATCH 9/9] docs: document versioned OCI releases --- README.md | 62 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 6b20385..09f1501 100644 --- a/README.md +++ b/README.md @@ -11,17 +11,36 @@ Unofficial, reproducible packaging and deployment stack for the RustDesk Web Cli RustDesk still actively maintains browser-specific application code, and its main GitHub Actions workflow still contains a `build-rustdesk-web` job. However, that job is currently disabled (`if: False`) and the current OSS tree no longer ships the `flutter/web` scaffold that the disabled job assumes is present. -This repository therefore separates the build into two pinned inputs: +This repository keeps the current-source reconstruction as an experimental track and uses a pinned, known web-capable RustDesk baseline for the deployable OCI artifacts. -1. the current official RustDesk source revision, which remains authoritative for the Dart/Rust application code; -2. a pinned RustDesk-derived historical web scaffold used only to restore `flutter/web` (HTML/bootstrap/JS build sources). +## Release artifacts -The historical scaffold's vendored codec/runtime binaries are discarded. The build downloads RustDesk's official `web_deps.tar.gz`, rebuilds the JavaScript bridge against the pinned current RustDesk source, and then runs the Flutter web build. +Releases are managed by Release Please and use one semantic version across the repository, container image and Helm chart. + +For a release such as `v0.1.0` the workflow publishes: + +```text +ghcr.io/nomed/rustdesk-web-stack:0.1.0 +ghcr.io/nomed/rustdesk-web-stack:v0.1.0 +ghcr.io/nomed/rustdesk-web-stack:latest +oci://ghcr.io/nomed/charts/rustdesk-web --version 0.1.0 +``` + +Install the Helm chart directly from GHCR: + +```bash +helm install rustdesk-web \ + oci://ghcr.io/nomed/charts/rustdesk-web \ + --version 0.1.0 +``` + +By default the chart uses the image version matching `Chart.appVersion`. Override `image.tag` only when intentionally testing a different image. ## Goals -- build the RustDesk Web Client from a pinned upstream revision; +- build the RustDesk Web Client from pinned, reviewable source inputs; - package the generated Flutter Web assets as an OCI image; +- publish the Helm chart as an OCI artifact to GHCR; - expose the web application through a standard HTTP server; - deploy `hbbs` and `hbbr` with the WebSocket endpoints required by browser clients; - provide a Kubernetes/Helm deployment path; @@ -60,33 +79,32 @@ container/ Runtime container for generated web assets charts/rustdesk-web/ Helm chart examples/ Example values/configuration docs/ Architecture and operational notes -.github/workflows/ CI/build automation +.github/workflows/ CI, Release Please and publication automation ``` -## Reproducible web build +## Build tracks + +`build/build-baseline-image.sh` is the release path. Its inputs are pinned in `build/baseline.env` and it produces the web runtime image plus `dist/web`. + +`build/build-web.sh` is the experimental current-RustDesk reconstruction. Its inputs are pinned in `build/upstream.env`; it restores the historical `flutter/web` scaffold and attempts to regenerate it against current official RustDesk code. -Pinned build inputs live in `build/upstream.env`. +## Versioning -The build implemented by `build/build-web.sh`: +Release Please owns the repository version. Conventional commits drive version bumps and the release PR updates: -1. checks out the pinned official RustDesk revision; -2. applies the Flutter patch used by RustDesk upstream when required; -3. restores only `flutter/web` from the pinned historical scaffold; -4. removes vendored historical web runtime binaries; -5. downloads and extracts RustDesk's official `web_deps.tar.gz`; -6. rebuilds the web JavaScript bridge (`ts-proto`, TypeScript, Vite 2.8); -7. runs `flutter pub get` and `flutter build web --release`; -8. writes provenance to `dist/web/BUILD-INFO.txt`. +- `CHANGELOG.md`; +- `.release-please-manifest.json`; +- `charts/rustdesk-web/Chart.yaml` (`version` and `appVersion`). -The GitHub Actions workflow uploads the web artifact and, on `main`, builds/publishes the static runtime image to GHCR. +When the Release Please PR is merged, the same release workflow creates the GitHub release and publishes both the versioned container image and the Helm chart to GHCR. ## Roadmap -1. Get the reconstructed Web Client build green in CI. +1. Validate the pinned Web Client baseline and OCI release pipeline. 2. Validate a real browser-to-agent session against self-hosted `hbbs`/`hbbr`. -3. Publish a minimal static web container with a tested tag/version policy. -4. Complete Helm templates for the web client plus `hbbs`/`hbbr` services. -5. Add HTTPS/WSS ingress examples and an end-to-end browser connection test. +3. Complete Helm templates for the web client plus `hbbs`/`hbbr` services. +4. Add HTTPS/WSS ingress examples and an end-to-end browser connection test. +5. Continue the current-RustDesk reconstruction until it can replace the baseline release source. ## License and upstream components