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 @@ - +