diff --git a/.github/workflows/preview_build.yml b/.github/workflows/preview_build.yml
new file mode 100644
index 00000000000..70cd5ce2aae
--- /dev/null
+++ b/.github/workflows/preview_build.yml
@@ -0,0 +1,52 @@
+# This action builds and deploys egui_demo_app on each pull request created
+# Security notes:
+# The preview deployment is split in two workflows, preview_build and preview_deploy.
+# `preview_build` runs on pull_request, so it won't have any access to the repositories secrets, so it is safe to
+# build / execute untrusted code.
+# `preview_deploy` has access to the repositories secrets (so it can push to the pr preview repo) but won't run
+# any untrusted code (it will just extract the build artifact and push it to the pages branch where it will
+# automatically be deployed).
+
+name: Preview Build
+
+on:
+ - pull_request
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - run: rustup toolchain install stable --profile minimal --target wasm32-unknown-unknown
+ - uses: Swatinem/rust-cache@v2
+ with:
+ prefix-key: "pr-preview-"
+
+ - name: "Install wasmopt / binaryen"
+ run: |
+ sudo apt-get update && sudo apt-get install binaryen
+
+ - run: |
+ scripts/build_demo_web.sh --release
+
+ - name: Remove gitignore file
+ # We need to remove the .gitignore, otherwise the deploy via git will not include the js and wasm files
+ run: |
+ rm -rf web_demo/.gitignore
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: web_demo
+ path: web_demo
+
+ - name: Generate meta.json
+ env:
+ PR_NUMBER: ${{ github.event.number }}
+ PR_BRANCH: ${{ github.head_ref }}
+ run: |
+ echo "{\"pr_number\": \"$PR_NUMBER\", \"pr_branch\": \"$PR_BRANCH\"}" > meta.json
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: meta.json
+ path: meta.json
diff --git a/.github/workflows/preview_cleanup.yml b/.github/workflows/preview_cleanup.yml
new file mode 100644
index 00000000000..3aba668a2b3
--- /dev/null
+++ b/.github/workflows/preview_cleanup.yml
@@ -0,0 +1,31 @@
+name: Preview Cleanup
+
+permissions:
+ contents: write
+
+on:
+ pull_request_target:
+ types:
+ - closed
+
+jobs:
+ cleanup:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ - run: mkdir -p empty_dir
+ - name: Url slug variable
+ run: |
+ echo "URL_SLUG=${{ github.event.pull_request.number }}-${{ github.event.pull_request.head.ref }}" >> $GITHUB_ENV
+ - name: Deploy
+ uses: JamesIves/github-pages-deploy-action@v4
+ with:
+ folder: empty_dir
+ repository-name: egui-pr-preview/pr
+ branch: 'main'
+ clean: true
+ target-folder: ${{ env.URL_SLUG }}
+ ssh-key: ${{ secrets.DEPLOY_KEY }}
+ commit-message: "Remove preview for PR ${{ env.URL_SLUG }}"
+ single-commit: true
diff --git a/.github/workflows/preview_deploy.yml b/.github/workflows/preview_deploy.yml
new file mode 100644
index 00000000000..9fdcfaf755f
--- /dev/null
+++ b/.github/workflows/preview_deploy.yml
@@ -0,0 +1,68 @@
+name: Preview Deploy
+
+permissions:
+ contents: write
+ pull-requests: write
+
+on:
+ workflow_run:
+ workflows:
+ - "Preview Build"
+ types:
+ - completed
+
+# Since we use single_commit and force on the deploy action, only one deploy action can run at a time.
+# Should this create a bottleneck we might have to set single_commit and force to false which should allow
+# for the deployments to run in parallel.
+concurrency:
+ group: preview_deploy
+
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ - name: 'Download build artifact'
+ uses: actions/download-artifact@v4
+ with:
+ name: web_demo
+ path: web_demo_artifact
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ run-id: ${{ github.event.workflow_run.id }}
+ - name: 'Download build meta'
+ uses: actions/download-artifact@v4
+ with:
+ name: meta.json
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ run-id: ${{ github.event.workflow_run.id }}
+
+ - name: Parse meta.json
+ run: |
+ echo "PR_NUMBER=$(jq -r .pr_number meta.json)" >> $GITHUB_ENV
+ echo "PR_BRANCH=$(jq -r .pr_branch meta.json)" >> $GITHUB_ENV
+
+ - name: Url slug variable
+ run: |
+ echo "URL_SLUG=${{ env.PR_NUMBER }}-${{ env.PR_BRANCH }}" >> $GITHUB_ENV
+
+ - name: Deploy
+ uses: JamesIves/github-pages-deploy-action@v4
+ with:
+ folder: web_demo_artifact
+ repository-name: egui-pr-preview/pr
+ branch: 'main'
+ clean: true
+ target-folder: ${{ env.URL_SLUG }}
+ ssh-key: ${{ secrets.DEPLOY_KEY }}
+ commit-message: "Update preview for PR ${{ env.URL_SLUG }}"
+ single-commit: true
+
+ - name: Comment PR
+ uses: thollander/actions-comment-pull-request@v2
+ with:
+ message: |
+ Preview available at https://egui-pr-preview.github.io/pr/${{ env.URL_SLUG }}
+ Note that it might take a couple seconds for the update to show up after the preview_build workflow has completed.
+ pr_number: ${{ env.PR_NUMBER }}
+ comment_tag: 'egui-preview'
diff --git a/web_demo/index.html b/web_demo/index.html
index 901dcff4253..b6047549ea0 100644
--- a/web_demo/index.html
+++ b/web_demo/index.html
@@ -119,7 +119,7 @@
-
+