# Separate to the main build workflow for access to develop # environment secrets, largely similar to build.yaml. name: Build and Deploy develop on: push: branches: [develop] repository_dispatch: types: [element-web-notify] concurrency: group: ${{ github.repository_owner }}-${{ github.workflow }}-${{ github.ref_name }} cancel-in-progress: true jobs: build: name: "Build & Deploy develop.element.io" # Only respect triggers from our develop branch, ignore that of forks if: github.repository == 'element-hq/element-web' runs-on: ubuntu-24.04 environment: develop env: R2_BUCKET: "element-web-develop" R2_URL: ${{ vars.CF_R2_S3_API }} R2_PUBLIC_URL: "https://element-web-develop.element.io" steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: cache: "yarn" node-version: "lts/*" - name: Install Dependencies run: "./scripts/layered.sh" - name: Build, Package & Upload sourcemaps run: "./scripts/ci_package.sh" env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} SENTRY_DSN: ${{ secrets.SENTRY_DSN }} SENTRY_URL: ${{ secrets.SENTRY_URL }} SENTRY_ORG: element SENTRY_PROJECT: riot-web # We only deploy the latest bundles to Cloudflare Pages and use _redirects to fallback to R2 for # older ones. This redirect means that 'self' is insufficient in the CSP, # and we have to add the R2 URL. # Once Cloudflare redirects support proxying mode we will be able to ditch this. # See Proxying in support table at https://developers.cloudflare.com/pages/platform/redirects CSP_EXTRA_SOURCE: ${{ env.R2_PUBLIC_URL }} - run: mv dist/element-*.tar.gz dist/develop.tar.gz - uses: actions/upload-artifact@v4 with: name: webapp path: dist/develop.tar.gz retention-days: 1 - name: Extract webapp run: | mkdir _deploy tar xf dist/develop.tar.gz -C _deploy --strip-components=1 - name: Copy config run: cp element.io/develop/config.json _deploy/config.json - name: Populate 404.html run: echo "404 Not Found" > _deploy/404.html - name: Populate _headers run: cp .github/cfp_headers _deploy/_headers # Redirect requests for the develop tarball and the historical bundles to R2 # We find the latest 100 bundle.css files and add their bundles to the redirects file # S3 has no sane way to get the age of a directory as they don't really exist - name: Populate _redirects run: | { echo "/develop.tar.gz $R2_PUBLIC_URL/develop.tar.gz 301" aws s3api --region auto --endpoint-url $R2_URL list-objects-v2 --bucket $R2_BUCKET \ --query "sort_by(Contents[?ends_with(Key, '/bundle.css')], &LastModified)[-100:].Key" \ --prefix "bundles/" | jq -r '.[]' | grep -oE '[^\"].*\/\s*' | while read -r path ; do echo "/${path}* $R2_PUBLIC_URL/${path}:splat 301" done } | tee _deploy/_redirects env: AWS_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_TOKEN }} # We may be trying to deploy the same webapp bundles again, we need to ensure that the live bundles # are not present in the _redirects file and instead accessed directly from Cloudflare Pages. - name: Trim _redirects working-directory: _deploy run: | find bundles -type d -mindepth 1 -maxdepth 1 -exec sed -i "\:{}:d" _redirects \; - name: Wait for other steps to succeed uses: t3chguy/wait-on-check-action@18541021811b56544d90e0f073401c2b99e249d6 # fork with: ref: ${{ github.sha }} running-workflow-name: "Build & Deploy develop.element.io" repo-token: ${{ secrets.GITHUB_TOKEN }} wait-interval: 10 check-regexp: ^((?!SonarCloud|SonarQube|issue|board|label|Release|prepare|GitHub Pages).)*$ # We keep the latest develop.tar.gz on R2 instead of relying on the github artifact uploaded earlier # as the expires after 24h and requires auth to download. # Element Desktop's fetch script uses this tarball to fetch latest develop to build Nightlies. - name: Deploy to R2 run: | aws s3 cp dist/develop.tar.gz s3://$R2_BUCKET/develop.tar.gz --endpoint-url $R2_URL --region=auto aws s3 cp _deploy/ s3://$R2_BUCKET/ --recursive --endpoint-url $R2_URL --region=auto env: AWS_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_TOKEN }} - name: Deploy to Cloudflare Pages id: cfp uses: cloudflare/pages-action@f0a1cd58cd66095dee69bfa18fa5efd1dde93bca # v1 with: apiToken: ${{ secrets.CF_PAGES_TOKEN }} accountId: ${{ secrets.CF_PAGES_ACCOUNT_ID }} projectName: element-web-develop directory: _deploy gitHubToken: ${{ secrets.GITHUB_TOKEN }} - run: | echo "Deployed to ${{ steps.cfp.outputs.url }}" >> $GITHUB_STEP_SUMMARY