diff --git a/.gitea/workflows/upstream-sync.yml b/.gitea/workflows/upstream-sync.yml new file mode 100644 index 0000000000..5ec0f977b2 --- /dev/null +++ b/.gitea/workflows/upstream-sync.yml @@ -0,0 +1,96 @@ +name: Upstream sync + +# Daily check against the upstream mirror. Fast-forwards `main` to +# `upstream/develop` when upstream has advanced, then pings the Infra +# Matrix room so we know the wallet branch is due for a rebase. +# +# See SYNC.md on the wallet branch for the full topology + procedure +# this job implements. + +on: + schedule: + # 12:00 UTC daily — quiet time for all our time zones, avoids the + # morning-meeting window where an unexpected Matrix ping is noise. + - cron: '0 12 * * *' + workflow_dispatch: # manual trigger from the Actions UI too + +jobs: + sync-main: + runs-on: ubuntu-latest + + steps: + - name: Checkout main + uses: actions/checkout@v4 + with: + ref: main + fetch-depth: 0 + # Built-in token Gitea hands us — scoped to this repo, has push. + token: ${{ secrets.GITEA_TOKEN }} + + - name: Wire upstream mirror + fetch wallet + run: | + set -euo pipefail + # Sulkta-Coop/element-x-upstream is a read-only pull-mirror of + # github.com/element-hq/element-x-android. Kept local for + # LAN-speed fetches and offline resilience. + git remote add upstream http://192.168.0.5:3001/Sulkta-Coop/element-x-upstream.git + git fetch upstream develop + git fetch origin wallet:refs/remotes/origin/wallet + + - name: Fast-forward main + id: ff + run: | + set -euo pipefail + git config user.name "sulkta-bot" + git config user.email "bot@sulkta.com" + OLD=$(git rev-parse --short HEAD) + echo "main was at $OLD" + if git merge --ff-only upstream/develop; then + NEW=$(git rev-parse --short HEAD) + if [ "$OLD" = "$NEW" ]; then + echo "main already up to date with upstream/develop" + echo "advanced=false" >> "$GITHUB_OUTPUT" + else + echo "main advanced: $OLD -> $NEW" + git push origin main + echo "advanced=true" >> "$GITHUB_OUTPUT" + echo "old=$OLD" >> "$GITHUB_OUTPUT" + echo "new=$NEW" >> "$GITHUB_OUTPUT" + fi + else + echo "::warning::main could not fast-forward to upstream/develop — someone committed to main directly?" + echo "advanced=false" >> "$GITHUB_OUTPUT" + fi + + - name: Measure wallet drift + if: steps.ff.outputs.advanced == 'true' + id: drift + run: | + set -euo pipefail + MB=$(git merge-base refs/remotes/origin/wallet main) + BEHIND=$(git rev-list --count "$MB..main") + NEW_ADDED=$(git rev-list --count "$MB..upstream/develop") + echo "behind=$BEHIND" >> "$GITHUB_OUTPUT" + echo "new_added=$NEW_ADDED" >> "$GITHUB_OUTPUT" + echo "wallet is $BEHIND commits behind main now; $NEW_ADDED new upstream commits this run" + + - name: Matrix notification (Infra room) + if: steps.ff.outputs.advanced == 'true' + env: + MATRIX_TOKEN: ${{ secrets.MATRIX_HOUSE_BOT_TOKEN }} + run: | + set -euo pipefail + TXN=$(date +%s%N) + ROOM='!rvxiUrWpgvMTAwzjGm:sulkta.com' # Infra + BODY="element-x upstream advanced · main ${{ steps.ff.outputs.old }} → ${{ steps.ff.outputs.new }} (${{ steps.drift.outputs.new_added }} commits). wallet is ${{ steps.drift.outputs.behind }} commits behind — rebase before next build." + + # jq keeps the body properly JSON-escaped; safer than shell interp + # shellcheck disable=SC2086 + PAYLOAD=$(printf '%s' "$BODY" | jq -Rs '{msgtype: "m.text", body: .}') + + curl --fail -s -X PUT \ + -H "Authorization: Bearer $MATRIX_TOKEN" \ + -H "Content-Type: application/json" \ + "https://chat.sulkta.com/_matrix/client/v3/rooms/${ROOM}/send/m.room.message/${TXN}" \ + -d "$PAYLOAD" + echo "notified" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index c60a89e2f6..0000000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,110 +0,0 @@ -name: APK Build - -on: - workflow_dispatch: - pull_request: - merge_group: - push: - branches: [ develop ] - -permissions: {} - -# Enrich gradle.properties for CI/CD -env: - GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g - CI_GRADLE_ARG_PROPERTIES: --stacktrace -Dsonar.gradle.skipCompile=true --no-configuration-cache - -jobs: - build: - name: Build APKs - runs-on: ubuntu-latest - permissions: - # For NejcZdovc/comment-pr - pull-requests: write - strategy: - matrix: - variant: [debug, release, nightly] - fail-fast: false - # Allow all jobs on develop. Just one per PR. - concurrency: - group: ${{ github.ref == 'refs/heads/develop' && format('build-develop-{0}-{1}', matrix.variant, github.sha) || format('build-{0}-{1}', matrix.variant, github.ref) }} - cancel-in-progress: true - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be - with: - # This might remove tools that are actually needed, if set to "true" but frees about 6 GB - tool-cache: true - # All of these default to true, but we should only need the 'android' one (and maybe swap-storage?) - android: false - dotnet: true - haskell: true - # This takes way too long to run (~2 minutes) and it saves only ~5.5GB - large-packages: false - docker-images: true - swap-storage: false - - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - # Ensure we are building the branch and not the branch after being merged on develop - # https://github.com/actions/checkout/issues/881 - ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }} - persist-credentials: false - - name: Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - with: - cache-read-only: ${{ github.ref != 'refs/heads/develop' }} - - name: Assemble debug APKs - if: ${{ matrix.variant == 'debug' }} - env: - ELEMENT_ANDROID_MAPTILER_API_KEY: ${{ secrets.MAPTILER_KEY }} - ELEMENT_ANDROID_MAPTILER_LIGHT_MAP_ID: ${{ secrets.MAPTILER_LIGHT_MAP_ID }} - ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }} - ELEMENT_ANDROID_SENTRY_DSN: ${{ secrets.ELEMENT_ANDROID_SENTRY_DSN }} - ELEMENT_SDK_SENTRY_DSN: ${{ secrets.ELEMENT_SDK_SENTRY_DSN }} - ELEMENT_CALL_SENTRY_DSN: ${{ secrets.ELEMENT_CALL_SENTRY_DSN }} - ELEMENT_CALL_POSTHOG_API_HOST: ${{ secrets.ELEMENT_CALL_POSTHOG_API_HOST }} - ELEMENT_CALL_POSTHOG_API_KEY: ${{ secrets.ELEMENT_CALL_POSTHOG_API_KEY }} - ELEMENT_CALL_RAGESHAKE_URL: ${{ secrets.ELEMENT_CALL_RAGESHAKE_URL }} - run: ./gradlew :app:assembleGplayDebug app:assembleFDroidDebug -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES - - name: Upload debug APKs - if: ${{ matrix.variant == 'debug' }} - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - with: - name: elementx-debug - path: | - app/build/outputs/apk/gplay/debug/*-universal-debug.apk - app/build/outputs/apk/fdroid/debug/*-universal-debug.apk - - uses: rnkdsh/action-upload-diawi@4e1421305be7cfc510d05f47850262eeaf345108 # v1.5.12 - id: diawi - # Do not fail the whole build if Diawi upload fails - continue-on-error: true - env: - token: ${{ secrets.DIAWI_TOKEN }} - if: ${{ matrix.variant == 'debug' && github.event_name == 'pull_request' && env.token != '' }} - with: - token: ${{ env.token }} - file: app/build/outputs/apk/gplay/debug/app-gplay-arm64-v8a-debug.apk - - name: Add or update PR comment with QR Code to download APK. - if: ${{ matrix.variant == 'debug' && github.event_name == 'pull_request' && steps.diawi.conclusion == 'success' }} - uses: NejcZdovc/comment-pr@a423635d183a8259308e80593c96fecf31539c26 # v2.1.0 - with: - message: | - :iphone: Scan the QR code below to install the build (arm64 only) for this PR. - ![QR code](${{ steps.diawi.outputs['qrcode'] }}) - If you can't scan the QR code you can install the build via this link: ${{ steps.diawi.outputs['url'] }} - # Enables to identify and update existing Ad-hoc release message on new commit in the PR - identifier: "GITHUB_COMMENT_QR_CODE" - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Compile release sources - if: ${{ matrix.variant == 'release' }} - run: ./gradlew bundleGplayRelease -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES - - name: Compile nightly sources - if: ${{ matrix.variant == 'nightly' }} - run: ./gradlew compileGplayNightlySources -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES diff --git a/.github/workflows/build_enterprise.yml b/.github/workflows/build_enterprise.yml deleted file mode 100644 index aa00b74c44..0000000000 --- a/.github/workflows/build_enterprise.yml +++ /dev/null @@ -1,92 +0,0 @@ -name: Enterprise APK Build - -on: - workflow_dispatch: - pull_request: - merge_group: - push: - branches: [ develop ] - -permissions: {} - -# Enrich gradle.properties for CI/CD -env: - GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g - CI_GRADLE_ARG_PROPERTIES: --stacktrace -Dsonar.gradle.skipCompile=true --no-configuration-cache - -jobs: - build: - name: Build Enterprise APKs - runs-on: ubuntu-latest - # Skip in forks - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - strategy: - matrix: - variant: [debug, release, nightly] - fail-fast: false - # Allow all jobs on develop. Just one per PR. - concurrency: - group: ${{ github.ref == 'refs/heads/develop' && format('build-develop-enterprise-{0}-{1}', matrix.variant, github.sha) || format('build-enterprise-{0}-{1}', matrix.variant, github.ref) }} - cancel-in-progress: true - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be - with: - # This might remove tools that are actually needed, if set to "true" but frees about 6 GB - tool-cache: true - # All of these default to true, but we should only need the 'android' one (and maybe swap-storage?) - android: false - dotnet: true - haskell: true - # This takes way too long to run (~2 minutes) and it saves only ~5.5GB - large-packages: false - docker-images: true - swap-storage: false - - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - # Ensure we are building the branch and not the branch after being merged on develop - # https://github.com/actions/checkout/issues/881 - ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }} - persist-credentials: false - - name: Add SSH private keys for submodule repositories - uses: webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555 # v0.10.0 - with: - ssh-private-key: ${{ secrets.ELEMENT_ENTERPRISE_DEPLOY_KEY }} - - name: Clone submodules - run: git submodule update --init --recursive - - name: Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - with: - cache-read-only: ${{ github.ref != 'refs/heads/develop' }} - - name: Assemble debug Gplay Enterprise APK - if: ${{ matrix.variant == 'debug' }} - env: - ELEMENT_ANDROID_MAPTILER_API_KEY: ${{ secrets.MAPTILER_KEY }} - ELEMENT_ANDROID_MAPTILER_LIGHT_MAP_ID: ${{ secrets.MAPTILER_LIGHT_MAP_ID }} - ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }} - ELEMENT_ANDROID_SENTRY_DSN: ${{ secrets.ELEMENT_ANDROID_SENTRY_DSN }} - ELEMENT_SDK_SENTRY_DSN: ${{ secrets.ELEMENT_SDK_SENTRY_DSN }} - ELEMENT_CALL_SENTRY_DSN: ${{ secrets.ELEMENT_CALL_SENTRY_DSN }} - ELEMENT_CALL_POSTHOG_API_HOST: ${{ secrets.ELEMENT_CALL_POSTHOG_API_HOST }} - ELEMENT_CALL_POSTHOG_API_KEY: ${{ secrets.ELEMENT_CALL_POSTHOG_API_KEY }} - ELEMENT_CALL_RAGESHAKE_URL: ${{ secrets.ELEMENT_CALL_RAGESHAKE_URL }} - run: ./gradlew :app:assembleGplayDebug -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES - - name: Upload debug Enterprise APKs - if: ${{ matrix.variant == 'debug' }} - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - with: - name: elementx-enterprise-debug - path: | - app/build/outputs/apk/gplay/debug/*-universal-debug.apk - - name: Compile nightly and release sources - if: ${{ matrix.variant == 'release' }} - run: ./gradlew compileReleaseSources -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES - - name: Compile nightly sources - if: ${{ matrix.variant == 'nightly' }} - run: ./gradlew compileGplayNightlySources -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES diff --git a/.github/workflows/danger.yml b/.github/workflows/danger.yml deleted file mode 100644 index 4bb51d05b5..0000000000 --- a/.github/workflows/danger.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Danger CI - -on: [pull_request, merge_group] - -permissions: {} - -jobs: - build: - runs-on: ubuntu-latest - name: Danger main check - # Skip in forks, it doesn't work even with the fallback token - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Add SSH private keys for submodule repositories - uses: webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555 # v0.10.0 - with: - ssh-private-key: ${{ secrets.ELEMENT_ENTERPRISE_DEPLOY_KEY }} - - name: Clone submodules - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - run: git submodule update --init --recursive - - run: | - npm install --save-dev @babel/plugin-transform-flow-strip-types - - name: Danger - uses: danger/danger-js@67ed2c1f42fd2fc198cc3c14b43c8f83351f4fe9 # 13.0.5 - with: - args: "--dangerfile ./tools/danger/dangerfile.js" - env: - DANGER_GITHUB_API_TOKEN: ${{ secrets.DANGER_GITHUB_API_TOKEN }} - # Fallback for forks - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/fork-pr-notice.yml b/.github/workflows/fork-pr-notice.yml deleted file mode 100644 index af3e4a3006..0000000000 --- a/.github/workflows/fork-pr-notice.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: Community PR notice - -on: - workflow_dispatch: - pull_request_target: # zizmor: ignore[dangerous-triggers] - types: - - opened - - reopened - -permissions: {} - -jobs: - welcome: - runs-on: ubuntu-latest - permissions: - # Require to comment the PR. - pull-requests: write - name: Welcome comment - # Only display it if base repo (upstream) is different from HEAD repo (possibly a fork) - if: github.event.pull_request.base.repo.full_name != github.event.pull_request.head.repo.full_name - steps: - - name: Add auto-generated commit warning - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 - with: - script: | - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: `Thank you for your contribution! Here are a few things to check in the PR to ensure it's reviewed as quickly as possible: - - - If your pull request adds a feature or modifies the UI, this should have an equivalent pull request in the [Element X iOS repo](https://github.com/element-hq/element-x-ios) unless it only affects an Android-only behaviour or is behind a disabled feature flag, since we need parity in both clients to consider a feature done. It will also need to be approved by our product and design teams before being merged, so it's usually a good idea to discuss the changes in a Github issue first and then start working on them once the approach has been validated. - - Your branch should be based on \`origin/develop\`, at least when it was created. - - The title of the PR will be used for release notes, so it needs to describe the change visible to the user. - - The test pass locally running \`./gradlew test\`. - - The code quality check suite pass locally running \`./gradlew runQualityChecks\`. - - If you modified anything related to the UI, including previews, you'll have to run the \`Record screenshots\` GH action in your forked repo: that will generate compatible new screenshots. However, given Github Actions limitations, **it will prevent the CI from running temporarily**, until you upload a new commit after that one. To do so, just pull the latest changes and push [an empty commit](https://coderwall.com/p/vkdekq/git-commit-allow-empty).` - }) diff --git a/.github/workflows/generate_github_pages.yml b/.github/workflows/generate_github_pages.yml deleted file mode 100644 index 55a300dd88..0000000000 --- a/.github/workflows/generate_github_pages.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Generate GitHub Pages -on: - workflow_dispatch: - schedule: - # At 00:00 on every Tuesday UTC - - cron: '0 0 * * 2' - -permissions: {} - -jobs: - generate-github-pages: - runs-on: ubuntu-latest - # Skip in forks - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - permissions: - contents: write - steps: - - name: ⏬ Checkout with LFS - uses: nschloe/action-cached-lfs-checkout@385a8ecc719e50b8c71af6ab01a624b486b7c3bc # v1.2.5 - - name: Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - with: - cache-read-only: ${{ github.ref != 'refs/heads/develop' }} - - name: Set up Python 3.12 - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 - with: - python-version: 3.14 - - name: Run World screenshots generation script - run: | - ./tools/test/generateWorldScreenshots.py - mkdir -p screenshots/en - cp tests/uitests/src/test/snapshots/images/* screenshots/en - - name: Deploy GitHub Pages - uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./screenshots diff --git a/.github/workflows/gradle-wrapper-update.yml b/.github/workflows/gradle-wrapper-update.yml deleted file mode 100644 index 66078b7b4b..0000000000 --- a/.github/workflows/gradle-wrapper-update.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Update Gradle Wrapper - -on: - workflow_dispatch: - schedule: - - cron: "0 0 * * *" - -permissions: {} - -jobs: - update-gradle-wrapper: - runs-on: ubuntu-latest - # Skip in forks - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - name: Use JDK 21 - if: (github.event_name == 'pull_request' && github.event.pull_request.fork == null) || github.event_name == 'workflow_dispatch' - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Update Gradle Wrapper - uses: gradle-update/update-gradle-wrapper-action@512b1875f3b6270828abfe77b247d5895a2da1e5 # v2.1.0 - with: - repo-token: ${{ secrets.DANGER_GITHUB_API_TOKEN }} - target-branch: develop - labels: PR-Build diff --git a/.github/workflows/maestro-local.yml b/.github/workflows/maestro-local.yml deleted file mode 100644 index 8903ed0e57..0000000000 --- a/.github/workflows/maestro-local.yml +++ /dev/null @@ -1,149 +0,0 @@ -name: Maestro (local) - -# Run this flow only when APK Build workflow completes -on: - workflow_dispatch: - pull_request: - -permissions: {} - -# Enrich gradle.properties for CI/CD -env: - GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g - CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache - ARCH: x86_64 - DEVICE: pixel_7_pro - API_LEVEL: 33 - TARGET: google_apis - -jobs: - build-apk: - name: Build APK - runs-on: ubuntu-latest - concurrency: - group: ${{ format('maestro-build-{0}', github.ref) }} - cancel-in-progress: true - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be - with: - # This might remove tools that are actually needed, if set to "true" but frees about 6 GB - tool-cache: true - # All of these default to true, but we should only need the 'android' one (and maybe swap-storage?) - android: false - dotnet: true - haskell: true - # This takes way too long to run (~2 minutes) and it saves only ~5.5GB - large-packages: false - docker-images: true - swap-storage: false - - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - # Ensure we are building the branch and not the branch after being merged on develop - # https://github.com/actions/checkout/issues/881 - ref: ${{ github.ref }} - persist-credentials: false - - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - name: Use JDK 21 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - with: - cache-read-only: ${{ github.ref != 'refs/heads/develop' }} - - name: Assemble debug APK - run: ./gradlew :app:assembleGplayDebug $CI_GRADLE_ARG_PROPERTIES - env: - ELEMENT_ANDROID_MAPTILER_API_KEY: ${{ secrets.MAPTILER_KEY }} - ELEMENT_ANDROID_MAPTILER_LIGHT_MAP_ID: ${{ secrets.MAPTILER_LIGHT_MAP_ID }} - ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }} - - name: Upload APK as artifact - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - with: - name: elementx-apk-maestro - path: | - app/build/outputs/apk/gplay/debug/app-gplay-x86_64-debug.apk - retention-days: 5 - overwrite: true - if-no-files-found: error - - maestro-cloud: - name: Maestro test suite - runs-on: ubuntu-latest - needs: [ build-apk ] - # Allow only one to run at a time, since they use the same environment. - # Otherwise, tests running in parallel can break each other. - concurrency: - group: maestro-test - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - if: (github.event_name == 'pull_request' && github.event.pull_request.fork == null) || github.event_name == 'workflow_dispatch' - with: - # Ensure we are building the branch and not the branch after being merged on develop - # https://github.com/actions/checkout/issues/881 - ref: ${{ github.ref }} - persist-credentials: false - - name: Download APK artifact from previous job - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 - with: - name: elementx-apk-maestro - - name: Enable KVM group perms - run: | - echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - sudo udevadm control --reload-rules - sudo udevadm trigger --name-match=kvm - - name: Install maestro - run: curl -fsSL "https://get.maestro.mobile.dev" | bash - - name: Run Maestro tests in emulator - id: maestro_test - uses: reactivecircus/android-emulator-runner@e89f39f1abbbd05b1113a29cf4db69e7540cae5a # v2.37.0 - continue-on-error: true - env: - MAESTRO_USERNAME: maestroelement - MAESTRO_PASSWORD: ${{ secrets.MATRIX_MAESTRO_ACCOUNT_PASSWORD }} - MAESTRO_RECOVERY_KEY: ${{ secrets.MATRIX_MAESTRO_ACCOUNT_RECOVERY_KEY }} - MAESTRO_ROOM_NAME: MyRoom - MAESTRO_INVITEE1_MXID: "@maestroelement2:matrix.org" - MAESTRO_INVITEE2_MXID: "@maestroelement3:matrix.org" - MAESTRO_APP_ID: io.element.android.x.debug - with: - api-level: ${{ env.API_LEVEL }} - arch: ${{ env.ARCH }} - profile: ${{ env.DEVICE }} - target: ${{ env.TARGET }} - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - disable-animations: true - disk-size: 3G - script: | - .github/workflows/scripts/maestro/maestro-local-with-screen-recording.sh app-gplay-x86_64-debug.apk - - name: Upload test results - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - with: - name: test-results - path: | - ~/.maestro/tests/** - retention-days: 5 - overwrite: true - if-no-files-found: error - - name: Update summary (success) - if: steps.maestro_test.outcome == 'success' - run: | - echo "### Maestro tests worked :rocket:!" >> $GITHUB_STEP_SUMMARY - - name: Update summary (failure) - if: steps.maestro_test.outcome != 'success' - run: | - LOG_FILE=$(find ~/.maestro/tests/ -name maestro.log) - echo "Log file: $LOG_FILE" - LOG_LINES="$(tail -n 30 $LOG_FILE)" - echo "### :x: Maestro tests failed... - - \`\`\` - $LOG_LINES - \`\`\`" >> $GITHUB_STEP_SUMMARY - - name: Fail the workflow in case of error in test - if: steps.maestro_test.outcome != 'success' - run: | - echo "Maestro tests failed. Please check the logs." - exit 1 diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml deleted file mode 100644 index 31a8806a85..0000000000 --- a/.github/workflows/nightly.yml +++ /dev/null @@ -1,66 +0,0 @@ -name: Build and release nightly application - -on: - workflow_dispatch: - schedule: - # Every nights at 4 - - cron: "0 4 * * *" - -permissions: {} - -env: - GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g - CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache - -jobs: - nightly: - name: Build and publish nightly bundle to Firebase - runs-on: ubuntu-latest - if: ${{ github.repository == 'element-hq/element-x-android' }} - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be - with: - # This might remove tools that are actually needed, if set to "true" but frees about 6 GB - tool-cache: true - # All of these default to true, but we should only need the 'android' one (and maybe swap-storage?) - android: false - dotnet: true - haskell: true - # This takes way too long to run (~2 minutes) and it saves only ~5.5GB - large-packages: false - docker-images: true - swap-storage: false - - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Build and upload Nightly application - run: | - ./gradlew assembleGplayNightly appDistributionUploadGplayNightly $CI_GRADLE_ARG_PROPERTIES - env: - ELEMENT_ANDROID_MAPTILER_API_KEY: ${{ secrets.MAPTILER_KEY }} - ELEMENT_ANDROID_MAPTILER_LIGHT_MAP_ID: ${{ secrets.MAPTILER_LIGHT_MAP_ID }} - ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }} - ELEMENT_ANDROID_SENTRY_DSN: ${{ secrets.ELEMENT_ANDROID_SENTRY_DSN }} - ELEMENT_SDK_SENTRY_DSN: ${{ secrets.ELEMENT_SDK_SENTRY_DSN }} - ELEMENT_CALL_SENTRY_DSN: ${{ secrets.ELEMENT_CALL_SENTRY_DSN }} - ELEMENT_CALL_POSTHOG_API_HOST: ${{ secrets.ELEMENT_CALL_POSTHOG_API_HOST }} - ELEMENT_CALL_POSTHOG_API_KEY: ${{ secrets.ELEMENT_CALL_POSTHOG_API_KEY }} - ELEMENT_CALL_RAGESHAKE_URL: ${{ secrets.ELEMENT_CALL_RAGESHAKE_URL }} - ELEMENT_ANDROID_NIGHTLY_KEYID: ${{ secrets.ELEMENT_ANDROID_NIGHTLY_KEYID }} - ELEMENT_ANDROID_NIGHTLY_KEYPASSWORD: ${{ secrets.ELEMENT_ANDROID_NIGHTLY_KEYPASSWORD }} - ELEMENT_ANDROID_NIGHTLY_STOREPASSWORD: ${{ secrets.ELEMENT_ANDROID_NIGHTLY_STOREPASSWORD }} - FIREBASE_TOKEN: ${{ secrets.ELEMENT_ANDROID_NIGHTLY_FIREBASE_TOKEN }} - - name: Additionally upload Nightly APK to browserstack for testing - continue-on-error: true # don't block anything by this upload failing (for now) - run: | - curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_PASSWORD" -X POST "https://api-cloud.browserstack.com/app-automate/upload" -F "file=@app/build/outputs/apk/gplay/nightly/app-gplay-universal-nightly.apk" -F "custom_id=element-x-android-nightly" - env: - BROWSERSTACK_USERNAME: ${{ secrets.ELEMENT_ANDROID_BROWSERSTACK_USERNAME }} - BROWSERSTACK_PASSWORD: ${{ secrets.ELEMENT_ANDROID_BROWSERSTACK_ACCESS_KEY }} diff --git a/.github/workflows/nightlyReports.yml b/.github/workflows/nightlyReports.yml deleted file mode 100644 index 314929d801..0000000000 --- a/.github/workflows/nightlyReports.yml +++ /dev/null @@ -1,98 +0,0 @@ -name: Nightly reports - -on: - workflow_dispatch: - schedule: - # Every nights at 5 - - cron: "0 5 * * *" - -permissions: {} - -# Enrich gradle.properties for CI/CD -env: - GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g - CI_GRADLE_ARG_PROPERTIES: --stacktrace -Dsonar.gradle.skipCompile=true --no-configuration-cache - -jobs: - nightlyReports: - name: Create kover report artifact and upload sonar result. - runs-on: ubuntu-latest - if: ${{ github.repository == 'element-hq/element-x-android' }} - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be - with: - # This might remove tools that are actually needed, if set to "true" but frees about 6 GB - tool-cache: true - # All of these default to true, but we should only need the 'android' one (and maybe swap-storage?) - android: false - dotnet: true - haskell: true - # This takes way too long to run (~2 minutes) and it saves only ~5.5GB - large-packages: false - docker-images: true - swap-storage: false - - - name: ⏬ Checkout with LFS - uses: nschloe/action-cached-lfs-checkout@385a8ecc719e50b8c71af6ab01a624b486b7c3bc # v1.2.5 - - - name: Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - with: - cache-read-only: false - - - name: ⚙️ Run unit tests, debug and release - run: ./gradlew test $CI_GRADLE_ARG_PROPERTIES - - - name: 📸 Run screenshot tests - run: ./gradlew verifyPaparazziDebug $CI_GRADLE_ARG_PROPERTIES - - - name: 📈 Generate kover report and verify coverage - run: ./gradlew :app:koverXmlReportGplayDebug :app:koverHtmlReportGplayDebug :app:koverVerifyAll $CI_GRADLE_ARG_PROPERTIES - - - name: ✅ Upload kover report - if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - with: - name: kover-results - path: | - **/build/reports/kover - - - name: 🔊 Publish results to Sonar - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - ORG_GRADLE_PROJECT_SONAR_LOGIN: ${{ secrets.SONAR_TOKEN }} - if: ${{ always() && env.SONAR_TOKEN != '' && env.ORG_GRADLE_PROJECT_SONAR_LOGIN != '' }} - run: ./gradlew assembleDebug createFullJarDebugTestFixtures :app:createFullJarGplayDebugTestFixtures $CI_GRADLE_ARG_PROPERTIES - - # Gradle dependency analysis using https://github.com/autonomousapps/dependency-analysis-android-gradle-plugin - dependency-analysis: - name: Dependency analysis - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - with: - cache-read-only: ${{ github.ref != 'refs/heads/develop' }} - - name: Dependency analysis - run: ./gradlew dependencyCheckAnalyze $CI_GRADLE_ARG_PROPERTIES - - name: Upload dependency analysis - if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - with: - name: dependency-analysis - path: build/reports/dependency-check-report.html diff --git a/.github/workflows/post-release.yml b/.github/workflows/post-release.yml deleted file mode 100644 index 5349a678bc..0000000000 --- a/.github/workflows/post-release.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Post-release - -on: - push: - tags: - - 'v*' - -permissions: {} - -jobs: - post-release: - runs-on: ubuntu-latest - # Skip in forks - if: github.repository == 'element-hq/element-x-android' - - steps: - - name: Trigger pipeline - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 - with: - github-token: ${{ secrets.ENTERPRISE_ACTIONS_TOKEN }} - script: | - const tag = context.ref.replace('refs/tags/', ''); - const inputs = { git_tag: tag }; - await github.rest.actions.createWorkflowDispatch({ - owner: 'element-hq', - repo: 'element-enterprise', - workflow_id: 'pipeline-android.yml', - ref: 'main', - inputs: inputs - }); diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml deleted file mode 100644 index d90cf07e50..0000000000 --- a/.github/workflows/pull_request.yml +++ /dev/null @@ -1,82 +0,0 @@ -name: Pull Request -on: - pull_request_target: - types: [ opened, edited, labeled, unlabeled, synchronize ] - workflow_call: # zizmor: ignore[dangerous-triggers] - secrets: - ELEMENT_BOT_TOKEN: - required: true - -permissions: {} - -jobs: - prevent-blocked: - name: Prevent blocked - runs-on: ubuntu-latest - permissions: - pull-requests: read - steps: - - name: Add notice - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 - if: contains(github.event.pull_request.labels.*.name, 'X-Blocked') - with: - script: | - core.setFailed("PR has been labeled with X-Blocked; it cannot be merged."); - - community-prs: - name: Label Community PRs - runs-on: ubuntu-latest - if: github.event.action == 'opened' - permissions: - pull-requests: write - steps: - - name: Check membership - if: github.event.pull_request.user.login != 'renovate[bot]' - uses: tspascoal/get-user-teams-membership@57e9f42acd78f4d0f496b3be4368fc5f62696662 # v3 - id: teams - with: - username: ${{ github.event.pull_request.user.login }} - organization: element-hq - team: Vector Core - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN_READ_ORG }} - - name: Add label - if: steps.teams.outputs.isTeamMember == 'false' - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 - with: - script: | - github.rest.issues.addLabels({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - labels: ['Z-Community-PR'] - }); - - close-if-fork-develop: - name: Forbid develop branch fork contributions - runs-on: ubuntu-latest - permissions: - # Require to comment and close the PR. - pull-requests: write - if: > - github.event.action == 'opened' && - github.event.pull_request.head.ref == 'develop' && - github.event.pull_request.head.repo.full_name != github.repository - steps: - - name: Close pull request - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 - with: - script: | - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: "Thanks for opening this pull request, unfortunately we do not accept contributions from the main" + - " branch of your fork, please re-open once you switch to an alternative branch for everyone's sanity.", - }); - - github.rest.pulls.update({ - pull_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - state: 'closed' - }); diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml deleted file mode 100644 index 9a191ba15b..0000000000 --- a/.github/workflows/quality.yml +++ /dev/null @@ -1,369 +0,0 @@ -name: Code Quality Checks - -on: - workflow_dispatch: - pull_request: - merge_group: - push: - branches: [ main, develop ] - -permissions: {} - -# Enrich gradle.properties for CI/CD -env: - GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g - CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache - -jobs: - checkScript: - name: Search for forbidden patterns - runs-on: ubuntu-latest - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be - with: - # This might remove tools that are actually needed, if set to "true" but frees about 6 GB - tool-cache: true - # All of these default to true, but we should only need the 'android' one (and maybe swap-storage?) - android: false - dotnet: true - haskell: true - # This takes way too long to run (~2 minutes) and it saves only ~5.5GB - large-packages: false - docker-images: true - swap-storage: false - - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Add SSH private keys for submodule repositories - uses: webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555 # v0.10.0 - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - with: - ssh-private-key: ${{ secrets.ELEMENT_ENTERPRISE_DEPLOY_KEY }} - - name: Clone submodules - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - run: git submodule update --init --recursive - - name: Run code quality check suite - run: ./tools/check/check_code_quality.sh - - checkScreenshot: - name: Search for invalid screenshot files - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Set up Python 3.12 - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 - with: - python-version: 3.14 - - name: Search for invalid screenshot files - run: ./tools/test/checkInvalidScreenshots.py - - checkDependencies: - name: Search for invalid dependencies - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - with: - cache-read-only: ${{ github.ref != 'refs/heads/develop' }} - - name: Set up Python 3.12 - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 - with: - python-version: 3.14 - - name: Search for invalid dependencies - run: ./tools/dependencies/checkDependencies.py - - # Code checks - konsist: - name: Konsist tests - runs-on: ubuntu-latest - # Allow all jobs on main and develop. Just one per PR. - concurrency: - group: ${{ github.ref == 'refs/heads/main' && format('check-konsist-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('check-konsist-develop-{0}', github.sha) || format('check-konsist-{0}', github.ref) }} - cancel-in-progress: true - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - # Ensure we are building the branch and not the branch after being merged on develop - # https://github.com/actions/checkout/issues/881 - ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }} - persist-credentials: false - - name: Add SSH private keys for submodule repositories - uses: webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555 # v0.10.0 - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - with: - ssh-private-key: ${{ secrets.ELEMENT_ENTERPRISE_DEPLOY_KEY }} - - name: Clone submodules - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - run: git submodule update --init --recursive - - name: Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - with: - cache-read-only: ${{ github.ref != 'refs/heads/develop' }} - - name: Run Konsist tests - run: ./gradlew :tests:konsist:testDebugUnitTest $CI_GRADLE_ARG_PROPERTIES --no-daemon - - name: Upload reports - if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - with: - name: konsist-report - path: | - **/build/reports/**/*.* - - compose: - name: Compose tests - runs-on: ubuntu-latest - # Allow all jobs on main and develop. Just one per PR. - concurrency: - group: ${{ github.ref == 'refs/heads/main' && format('check-compose-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('check-compose-develop-{0}', github.sha) || format('check-compose-{0}', github.ref) }} - cancel-in-progress: true - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - # Ensure we are building the branch and not the branch after being merged on develop - # https://github.com/actions/checkout/issues/881 - ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }} - persist-credentials: false - - name: Add SSH private keys for submodule repositories - uses: webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555 # v0.10.0 - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - with: - ssh-private-key: ${{ secrets.ELEMENT_ENTERPRISE_DEPLOY_KEY }} - - name: Clone submodules - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - run: git submodule update --init --recursive - - name: Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - with: - cache-read-only: ${{ github.ref != 'refs/heads/develop' }} - - name: Run compose tests - run: ./tools/compose/check_stability.sh - - lint: - name: Android lint check - runs-on: ubuntu-latest - # Allow all jobs on main and develop. Just one per PR. - concurrency: - group: ${{ github.ref == 'refs/heads/main' && format('check-lint-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('check-lint-develop-{0}', github.sha) || format('check-lint-{0}', github.ref) }} - cancel-in-progress: true - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - # Ensure we are building the branch and not the branch after being merged on develop - # https://github.com/actions/checkout/issues/881 - ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }} - persist-credentials: false - - name: Add SSH private keys for submodule repositories - uses: webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555 # v0.10.0 - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - with: - ssh-private-key: ${{ secrets.ELEMENT_ENTERPRISE_DEPLOY_KEY }} - - name: Clone submodules - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - run: git submodule update --init --recursive - - name: Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - with: - cache-read-only: ${{ github.ref != 'refs/heads/develop' }} - - name: Build Gplay Debug - run: ./gradlew :app:compileGplayDebugKotlin $CI_GRADLE_ARG_PROPERTIES - - name: Build Fdroid Debug - run: ./gradlew :app:compileFdroidDebugKotlin $CI_GRADLE_ARG_PROPERTIES - - name: Run lint - run: ./gradlew :app:lintGplayDebug :app:lintFdroidDebug lintDebug $CI_GRADLE_ARG_PROPERTIES --continue - - name: Upload reports - if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - with: - name: linting-report - path: | - **/build/reports/**/*.* - - detekt: - name: Detekt checks - runs-on: ubuntu-latest - # Allow all jobs on main and develop. Just one per PR. - concurrency: - group: ${{ github.ref == 'refs/heads/main' && format('check-detekt-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('check-detekt-develop-{0}', github.sha) || format('check-detekt-{0}', github.ref) }} - cancel-in-progress: true - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - # Ensure we are building the branch and not the branch after being merged on develop - # https://github.com/actions/checkout/issues/881 - ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }} - persist-credentials: false - - name: Add SSH private keys for submodule repositories - uses: webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555 # v0.10.0 - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - with: - ssh-private-key: ${{ secrets.ELEMENT_ENTERPRISE_DEPLOY_KEY }} - - name: Clone submodules - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - run: git submodule update --init --recursive - - name: Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - with: - cache-read-only: ${{ github.ref != 'refs/heads/develop' }} - - name: Run Detekt - run: ./gradlew detekt $CI_GRADLE_ARG_PROPERTIES --no-daemon - - name: Upload reports - if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - with: - name: detekt-report - path: | - **/build/reports/**/*.* - - ktlint: - name: Ktlint checks - runs-on: ubuntu-latest - # Allow all jobs on main and develop. Just one per PR. - concurrency: - group: ${{ github.ref == 'refs/heads/main' && format('check-ktlint-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('check-ktlint-develop-{0}', github.sha) || format('check-ktlint-{0}', github.ref) }} - cancel-in-progress: true - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - # Ensure we are building the branch and not the branch after being merged on develop - # https://github.com/actions/checkout/issues/881 - ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }} - persist-credentials: false - - name: Add SSH private keys for submodule repositories - uses: webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555 # v0.10.0 - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - with: - ssh-private-key: ${{ secrets.ELEMENT_ENTERPRISE_DEPLOY_KEY }} - - name: Clone submodules - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - run: git submodule update --init --recursive - - name: Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - with: - cache-read-only: ${{ github.ref != 'refs/heads/develop' }} - - name: Run Ktlint check - run: ./gradlew ktlintCheck $CI_GRADLE_ARG_PROPERTIES - - name: Upload reports - if: always() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - with: - name: ktlint-report - path: | - **/build/reports/**/*.* - - docs: - name: Doc checks - runs-on: ubuntu-latest - # Allow all jobs on main and develop. Just one per PR. - concurrency: - group: ${{ github.ref == 'refs/heads/main' && format('check-docs-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('check-docs-develop-{0}', github.sha) || format('check-docs-{0}', github.ref) }} - cancel-in-progress: true - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - # Ensure we are building the branch and not the branch after being merged on develop - # https://github.com/actions/checkout/issues/881 - ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }} - persist-credentials: false - - name: Add SSH private keys for submodule repositories - uses: webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555 # v0.10.0 - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - with: - ssh-private-key: ${{ secrets.ELEMENT_ENTERPRISE_DEPLOY_KEY }} - - name: Clone submodules - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - run: git submodule update --init --recursive - - name: Run docs check - # This is equivalent to `./gradlew checkDocs`, but we avoid having to install java and gradle - run: python3 ./tools/docs/generate_toc.py --verify ./*.md docs/**/*.md - - # Note: to auto fix issues you can use the following command: - # shellcheck -f diff | git apply - shellcheck: - name: Check shell scripts - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Run shellcheck - uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # v2.0.0 - with: - severity: warning - - zizmor: - name: Run zizmor - runs-on: ubuntu-latest - permissions: - security-events: write # Required for upload-sarif (used by zizmor-action) to upload SARIF files. - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - uses: zizmorcore/zizmor-action@71321a20a9ded102f6e9ce5718a2fcec2c4f70d8 # v0.5.2 - - upload_reports: - name: Project Check Suite - runs-on: ubuntu-latest - needs: [konsist, lint, ktlint, detekt] - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - # Ensure we are building the branch and not the branch after being merged on develop - # https://github.com/actions/checkout/issues/881 - ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }} - persist-credentials: false - - name: Download reports from previous jobs - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 - - name: Prepare Danger - if: always() - run: | - npm install --save-dev @babel/core - npm install --save-dev @babel/plugin-transform-flow-strip-types - yarn add danger-plugin-lint-report --dev - - name: Danger lint - if: always() - uses: danger/danger-js@67ed2c1f42fd2fc198cc3c14b43c8f83351f4fe9 # 13.0.5 - with: - args: "--dangerfile ./tools/danger/dangerfile-lint.js" - env: - DANGER_GITHUB_API_TOKEN: ${{ secrets.DANGER_GITHUB_API_TOKEN }} - # Fallback for forks - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/recordScreenshots.yml b/.github/workflows/recordScreenshots.yml deleted file mode 100644 index 0f4c8ee581..0000000000 --- a/.github/workflows/recordScreenshots.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: Record screenshots - -on: - workflow_dispatch: - pull_request: - types: [ labeled ] - -permissions: {} - -# Enrich gradle.properties for CI/CD -env: - GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g -Dsonar.gradle.skipCompile=true - CI_GRADLE_ARG_PROPERTIES: --no-configuration-cache - -jobs: - record: - permissions: - # Need write permissions on PRs to remove the label "Record-Screenshots" - pull-requests: write - name: Record screenshots on branch ${{ github.event.pull_request.head.ref || github.ref_name }} - runs-on: ubuntu-latest - if: github.event_name == 'workflow_dispatch' || github.event.label.name == 'Record-Screenshots' - - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be - with: - # This might remove tools that are actually needed, if set to "true" but frees about 6 GB - tool-cache: true - # All of these default to true, but we should only need the 'android' one (and maybe swap-storage?) - android: false - dotnet: true - haskell: true - # This takes way too long to run (~2 minutes) and it saves only ~5.5GB - large-packages: false - docker-images: true - swap-storage: false - - - name: Remove Record-Screenshots label - if: github.event.label.name == 'Record-Screenshots' - uses: actions-ecosystem/action-remove-labels@2ce5d41b4b6aa8503e285553f75ed56e0a40bae0 # v1.3.0 - with: - labels: Record-Screenshots - - name: ⏬ Checkout with LFS (PR) - if: github.event.label.name == 'Record-Screenshots' - uses: nschloe/action-cached-lfs-checkout@385a8ecc719e50b8c71af6ab01a624b486b7c3bc # v1.2.5 - with: - persist-credentials: false - ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || github.ref }} - - name: ⏬ Checkout with LFS (Branch) - if: github.event_name == 'workflow_dispatch' - uses: nschloe/action-cached-lfs-checkout@385a8ecc719e50b8c71af6ab01a624b486b7c3bc # v1.2.5 - with: - persist-credentials: false - - name: ☕️ Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - # Add gradle cache, this should speed up the process - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - with: - cache-read-only: ${{ github.ref != 'refs/heads/develop' }} - - name: Record screenshots - id: record - run: ./.github/workflows/scripts/recordScreenshots.sh - env: - GITHUB_TOKEN: ${{ secrets.DANGER_GITHUB_API_TOKEN || secrets.GITHUB_TOKEN }} - GITHUB_REPOSITORY: ${{ secrets.GITHUB_REPOSITORY }} - GRADLE_ARGS: ${{ env.CI_GRADLE_ARG_PROPERTIES }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 73cba6c8f7..0000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,146 +0,0 @@ -name: Create release App Bundle and APKs - -on: - workflow_dispatch: - push: - branches: [ main ] - -permissions: {} - -# Enrich gradle.properties for CI/CD -env: - GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g - CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache - -jobs: - gplay: - name: Create App Bundle (Gplay) - runs-on: ubuntu-latest - concurrency: - group: ${{ format('build-release-main-gplay-{0}', github.sha) }} - cancel-in-progress: true - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be - with: - # This might remove tools that are actually needed, if set to "true" but frees about 6 GB - tool-cache: true - # All of these default to true, but we should only need the 'android' one (and maybe swap-storage?) - android: false - dotnet: true - haskell: true - # This takes way too long to run (~2 minutes) and it saves only ~5.5GB - large-packages: false - docker-images: true - swap-storage: false - - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - - name: Create app bundle - env: - ELEMENT_ANDROID_MAPTILER_API_KEY: ${{ secrets.MAPTILER_KEY }} - ELEMENT_ANDROID_MAPTILER_LIGHT_MAP_ID: ${{ secrets.MAPTILER_LIGHT_MAP_ID }} - ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }} - ELEMENT_ANDROID_SENTRY_DSN: ${{ secrets.ELEMENT_ANDROID_SENTRY_DSN }} - ELEMENT_SDK_SENTRY_DSN: ${{ secrets.ELEMENT_SDK_SENTRY_DSN }} - ELEMENT_CALL_SENTRY_DSN: ${{ secrets.ELEMENT_CALL_SENTRY_DSN }} - ELEMENT_CALL_POSTHOG_API_HOST: ${{ secrets.ELEMENT_CALL_POSTHOG_API_HOST }} - ELEMENT_CALL_POSTHOG_API_KEY: ${{ secrets.ELEMENT_CALL_POSTHOG_API_KEY }} - ELEMENT_CALL_RAGESHAKE_URL: ${{ secrets.ELEMENT_CALL_RAGESHAKE_URL }} - run: ./gradlew bundleGplayRelease $CI_GRADLE_ARG_PROPERTIES - - name: Upload bundle as artifact - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - with: - name: elementx-app-gplay-bundle-unsigned - path: | - app/build/outputs/bundle/gplayRelease/app-gplay-release.aab - - enterprise: - name: Create App Bundle Enterprise - runs-on: ubuntu-latest - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - concurrency: - group: ${{ format('build-release-main-enterprise-{0}', github.sha) }} - cancel-in-progress: true - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Add SSH private keys for submodule repositories - uses: webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555 # v0.10.0 - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - with: - ssh-private-key: ${{ secrets.ELEMENT_ENTERPRISE_DEPLOY_KEY }} - - name: Clone submodules - run: git submodule update --init --recursive - - name: Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - - name: Create Enterprise app bundle - env: - ELEMENT_ANDROID_MAPTILER_API_KEY: ${{ secrets.MAPTILER_KEY }} - ELEMENT_ANDROID_MAPTILER_LIGHT_MAP_ID: ${{ secrets.MAPTILER_LIGHT_MAP_ID }} - ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }} - run: ./gradlew bundleGplayRelease $CI_GRADLE_ARG_PROPERTIES - - name: Upload bundle as artifact - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - with: - name: elementx-enterprise-app-gplay-bundle-unsigned - path: | - app/build/outputs/bundle/gplayRelease/app-gplay-release.aab - - fdroid: - name: Create APKs (FDroid) - runs-on: ubuntu-latest - concurrency: - group: ${{ format('build-release-main-fdroid-{0}', github.sha) }} - cancel-in-progress: true - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be - with: - # This might remove tools that are actually needed, if set to "true" but frees about 6 GB - tool-cache: true - # All of these default to true, but we should only need the 'android' one (and maybe swap-storage?) - android: false - dotnet: true - haskell: true - # This takes way too long to run (~2 minutes) and it saves only ~5.5GB - large-packages: false - docker-images: true - swap-storage: false - - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - - name: Create APKs - env: - ELEMENT_ANDROID_MAPTILER_API_KEY: ${{ secrets.MAPTILER_KEY }} - ELEMENT_ANDROID_MAPTILER_LIGHT_MAP_ID: ${{ secrets.MAPTILER_LIGHT_MAP_ID }} - ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }} - run: ./gradlew assembleFdroidRelease $CI_GRADLE_ARG_PROPERTIES - - name: Upload apks as artifact - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - with: - name: elementx-app-fdroid-apks-unsigned - path: | - app/build/outputs/apk/fdroid/release/*.apk diff --git a/.github/workflows/scripts/maestro/local-recording.sh b/.github/workflows/scripts/maestro/local-recording.sh deleted file mode 100755 index adc83f4876..0000000000 --- a/.github/workflows/scripts/maestro/local-recording.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -# -# Copyright (c) 2025 Element Creations Ltd. -# Copyright 2024 New Vector Ltd. -# -# SPDX-License-Identifier: AGPL-3.0-only. -# Please see LICENSE in the repository root for full details. -# - -COUNT=0 -mkdir -p /data/local/tmp/recordings; -FILENAME=/data/local/tmp/recordings/testRecording$COUNT.mp4 -while true - do - COUNT=$((COUNT+1)) - FILENAME=/data/local/tmp/recordings/testRecording$COUNT.mp4 - printf "\nRecording video file #%d\n" $COUNT - screenrecord --bugreport --bit-rate=16m --size 720x1280 $FILENAME - done diff --git a/.github/workflows/scripts/maestro/maestro-local-with-screen-recording.sh b/.github/workflows/scripts/maestro/maestro-local-with-screen-recording.sh deleted file mode 100755 index 4ee021c316..0000000000 --- a/.github/workflows/scripts/maestro/maestro-local-with-screen-recording.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh - -# -# Copyright (c) 2025 Element Creations Ltd. -# Copyright 2024 New Vector Ltd. -# -# SPDX-License-Identifier: AGPL-3.0-only. -# Please see LICENSE in the repository root for full details. -# - -# First we disable the onboarding flow on Chrome, which is a source of issues -# (see https://stackoverflow.com/a/64629745) -echo "Disabling Chrome onboarding flow" -adb shell am set-debug-app --persistent com.android.chrome -adb shell 'echo "chrome --disable-fre --no-default-browser-check --no-first-run" > /data/local/tmp/chrome-command-line' -adb shell am start -n com.android.chrome/com.google.android.apps.chrome.Main - -adb install -r $1 -echo "Starting the screen recording..." -adb push .github/workflows/scripts/maestro/local-recording.sh /data/local/tmp/ -adb shell "chmod +x /data/local/tmp/local-recording.sh" -mkdir -p ~/.maestro/tests -# Start logcat in the background and save the output to a file, use `org.matrix.rust.sdk` tag since the SDK handles the logging -adb logcat 'org.matrix.rust.sdk:D *:S' > ~/.maestro/tests/logcat.txt & -adb shell "/data/local/tmp/local-recording.sh & echo \$! > /data/local/tmp/screenrecord_pid.txt" & -set +e -~/.maestro/bin/maestro test .maestro/allTests.yaml -TEST_STATUS=$? -echo "Test run completed with status $TEST_STATUS" - -# Stop the screen recording loop -SCRIPT_PID=$(adb shell "cat /data/local/tmp/screenrecord_pid.txt") -adb shell "kill -2 $SCRIPT_PID" - -# Get the PID of the screen recording process -SCREENRECORD_PID=$(adb shell ps | grep screenrecord | awk '{print $2}') -# Wait for the screen recording process to exit -while [ ! -z $SCREENRECORD_PID ]; do - echo "Waiting for screen recording ($SCREENRECORD_PID) to finish..." - adb shell "kill -2 $SCREENRECORD_PID" - sleep 1 - SCREENRECORD_PID=$(adb shell ps | grep screenrecord | awk '{print $2}') -done - -adb pull /data/local/tmp/recordings/ ~/.maestro/tests/ -exit $TEST_STATUS diff --git a/.github/workflows/scripts/parse_test_failures.py b/.github/workflows/scripts/parse_test_failures.py deleted file mode 100644 index eb0a0ecafa..0000000000 --- a/.github/workflows/scripts/parse_test_failures.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python3 -import xml.etree.ElementTree as ET -import sys -import glob - -screenshot_test_failures = [] -output = [] - -def parse_test_failures(xml_file): - """Parse XML test results and print failures.""" - tree = ET.parse(xml_file) - root = tree.getroot() - - # Find all testcase elements with failure children - if root.get("failures", "0") == "0": - return - - name = root.get('name', 'Test Suite') - is_screenshot_test = name.startswith('ui.Preview') - - if not is_screenshot_test: - output.append(f"## {name}") - - for testcase in root.findall('.//testcase'): - failure = testcase.find('failure') - if failure is not None: - # Get testcase attributes - classname = testcase.get('classname', '') - name = testcase.get('name', '') - - if is_screenshot_test: - # For screenshot tests, we want to display the classname as well - screenshot_test_failures.append(f"{classname}.{name}") - else: - # Get failure content (text inside the failure element) - failure_message = failure.get('message', '') - failure_content = failure.text if failure.text else '' - - # Print in the requested format - output.append(f"### {name}") - output.append("```") - output.append(failure_message) - output.append("```") - output.append("
Stacktrace") - output.append(f"
{failure_content}
") - output.append("
") - output.append("\n") - -if __name__ == "__main__": - if len(sys.argv) < 2: - output.append("Usage: parse_test_failures.py ", file=sys.stderr) - sys.exit(1) - - file = sys.argv[1] - - if file.endswith('xml'): - parse_test_failures(file) - else: - files = glob.glob("**/build/test-results/*UnitTest/*.xml", root_dir = file, recursive = True) - for file in files: - parse_test_failures(file) - - if screenshot_test_failures: - output.append("## Screenshot Test Failures") - output.append("```") - for failure in screenshot_test_failures: - output.append(failure) - output.append("```") - - text_output = '\n'.join(output) - # Trim output larger than 1MB to avoid GitHub Action log limits - while len(text_output.encode('utf-8')) > 1_040_000: - output.pop(-2) - output.append("## !!! Truncated output due to size limits. !!!") - text_output = '\n'.join(output) - - print(text_output) diff --git a/.github/workflows/scripts/recordScreenshots.sh b/.github/workflows/scripts/recordScreenshots.sh deleted file mode 100755 index d29353a2c2..0000000000 --- a/.github/workflows/scripts/recordScreenshots.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2025 Element Creations Ltd. -# Copyright 2023-2024 New Vector Ltd. -# -# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. -# Please see LICENSE files in the repository root for full details. - -set -e - -TOKEN=$GITHUB_TOKEN -REPO=$GITHUB_REPOSITORY - -SHORT=t:,r: -LONG=token:,repo: -OPTS=$(getopt -a -n recordScreenshots --options $SHORT --longoptions $LONG -- "$@") - -eval set -- "$OPTS" -while : -do - case "$1" in - -t | --token ) - TOKEN="$2" - shift 2 - ;; - -r | --repo ) - REPO="$2" - shift 2 - ;; - --) - shift; - break - ;; - *) - echo "Unexpected option: $1" - help - ;; - esac -done - -BRANCH=$(git rev-parse --abbrev-ref HEAD) -echo Branch used: $BRANCH - -if [[ -z ${TOKEN} ]]; then - echo "No token specified, either set the env var GITHUB_TOKEN or use the --token option" - exit 1 -fi - -if [[ -z ${REPO} ]]; then - echo "No repo specified, either set the env var GITHUB_REPOSITORY or use the --repo option" - exit 1 -fi - -echo "Deleting previous screenshots" -./gradlew removeOldSnapshots --stacktrace --warn $GRADLE_ARGS - -echo "Record screenshots" -./gradlew recordPaparazziDebug --stacktrace $GRADLE_ARGS - -echo "Deleting previous screenshots" -./gradlew removeOldScreenshots --stacktrace --warn $GRADLE_ARGS - -echo "Record screenshots (Compound)" -./gradlew :libraries:compound:recordRoborazziDebug --stacktrace -PpreDexEnable=false --max-workers 4 --warn $GRADLE_ARGS - -echo "Committing changes" -git config http.sslVerify false - -if [[ -z ${INPUT_AUTHOR_NAME} ]]; then - git config user.name "ElementBot" -else - git config --local user.name "${INPUT_AUTHOR_NAME}" -fi - -if [[ -z ${INPUT_AUTHOR_EMAIL} ]]; then - git config user.email "android@element.io" -else - git config --local user.name "${INPUT_AUTHOR_EMAIL}" -fi -git add -A -git commit -m "Update screenshots" - -GITHUB_REPO="https://$GITHUB_ACTOR:$TOKEN@github.com/$REPO.git" -echo "Pushing changes" -if [[ -z ${GITHUB_ACTOR} ]]; then - echo "No GITHUB_ACTOR env var" - GITHUB_REPO="https://$TOKEN@github.com/$REPO.git" -fi -git push $GITHUB_REPO "$BRANCH" -echo "Done!" diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml deleted file mode 100644 index 40cf9d0058..0000000000 --- a/.github/workflows/sonar.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: Sonar - -on: - workflow_dispatch: - pull_request: - merge_group: - push: - branches: [ main, develop ] - -permissions: {} - -# Enrich gradle.properties for CI/CD -env: - GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g - CI_GRADLE_ARG_PROPERTIES: --stacktrace --warn -Dsonar.gradle.skipCompile=true --no-configuration-cache - GROUP: ${{ format('sonar-{0}', github.ref) }} - -jobs: - sonar: - name: Sonar Quality Checks - runs-on: ubuntu-latest - # Allow all jobs on main and develop. Just one per PR. - concurrency: - group: ${{ format('sonar-{0}', github.ref) }} - cancel-in-progress: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/develop' }} - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be - with: - # This might remove tools that are actually needed, if set to "true" but frees about 6 GB - tool-cache: true - # All of these default to true, but we should only need the 'android' one (and maybe swap-storage?) - android: false - dotnet: true - haskell: true - # This takes way too long to run (~2 minutes) and it saves only ~5.5GB - large-packages: false - docker-images: true - swap-storage: false - - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - # Ensure we are building the branch and not the branch after being merged on develop - # https://github.com/actions/checkout/issues/881 - ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }} - persist-credentials: false - - name: Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - with: - cache-read-only: ${{ github.ref != 'refs/heads/develop' }} - - name: Build debug code and test fixtures - run: ./gradlew assembleGplayDebug createFullJarDebugTestFixtures :app:createFullJarGplayDebugTestFixtures $CI_GRADLE_ARG_PROPERTIES - - name: 🔊 Publish results to Sonar - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - ORG_GRADLE_PROJECT_SONAR_LOGIN: ${{ secrets.SONAR_TOKEN }} - if: ${{ always() && env.SONAR_TOKEN != '' && env.ORG_GRADLE_PROJECT_SONAR_LOGIN != '' }} - run: ./gradlew sonar $CI_GRADLE_ARG_PROPERTIES diff --git a/.github/workflows/stale-issues.yml b/.github/workflows/stale-issues.yml deleted file mode 100644 index 1958e80083..0000000000 --- a/.github/workflows/stale-issues.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Close stale issues that are missing info. - -on: - schedule: - - cron: "30 1 * * *" - -permissions: {} - -jobs: - stale: - runs-on: ubuntu-latest - permissions: - issues: write - steps: - - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0 - with: - only-labels: "X-Needs-Info" - days-before-issue-stale: 30 - days-before-issue-close: 7 - days-before-pr-stale: -1 - stale-issue-label: "stale" - labels-to-remove-when-unstale: "X-Needs-Info" - stale-issue-message: "This issue has been awaiting further information for the past 30 days so will now be marked as stale. Please provide the requested information within the next 7 days to keep it open." - close-issue-message: "This issue is being closed due to inactivity after further information was requested." diff --git a/.github/workflows/sync-localazy.yml b/.github/workflows/sync-localazy.yml deleted file mode 100644 index f45a926814..0000000000 --- a/.github/workflows/sync-localazy.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: Sync Localazy -on: - workflow_dispatch: - schedule: - # At 00:00 on every Monday UTC - - cron: '0 0 * * 1' - -permissions: {} - -jobs: - sync-localazy: - runs-on: ubuntu-latest - # Skip in forks - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - with: - cache-read-only: ${{ github.ref != 'refs/heads/develop' }} - - name: Set up Python 3.12 - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 - with: - python-version: 3.14 - - name: Setup Localazy - run: | - curl -sS https://dist.localazy.com/debian/pubkey.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/localazy.gpg - echo "deb [arch=amd64 signed-by=/etc/apt/trusted.gpg.d/localazy.gpg] https://maven.localazy.com/repository/apt/ stable main" | sudo tee /etc/apt/sources.list.d/localazy.list - sudo apt-get update && sudo apt-get install localazy - - name: Run Localazy script - run: | - ./tools/localazy/downloadStrings.sh --all - ./tools/localazy/importSupportedLocalesFromLocalazy.py - ./tools/test/generateAllScreenshots.py - - name: Create Pull Request for Strings - uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0 - with: - token: ${{ secrets.DANGER_GITHUB_API_TOKEN }} - commit-message: Sync Strings from Localazy - title: Sync Strings - body: | - - Update Strings from Localazy - branch: sync-localazy - base: develop - labels: PR-i18n diff --git a/.github/workflows/sync-sas-strings.yml b/.github/workflows/sync-sas-strings.yml deleted file mode 100644 index 7f9dbdee0d..0000000000 --- a/.github/workflows/sync-sas-strings.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Sync SAS strings -on: - workflow_dispatch: - schedule: - # At 00:00 on every Monday UTC - - cron: '0 0 * * 1' - -permissions: {} - -jobs: - sync-sas-strings: - runs-on: ubuntu-latest - # Skip in forks - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - # No concurrency required, runs every time on a schedule. - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - name: Set up Python 3.12 - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 - with: - python-version: 3.14 - - name: Install Prerequisite dependencies - run: | - pip install requests - - name: Run SAS String script - run: ./tools/sas/import_sas_strings.py - - name: Create Pull Request for SAS Strings - uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0 - with: - commit-message: Sync SAS Strings - title: Sync SAS Strings - body: | - - Update SAS Strings from matrix-doc. - branch: sync-sas-strings - base: develop - labels: PR-Misc - - diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml deleted file mode 100644 index 0ce66df478..0000000000 --- a/.github/workflows/tests.yml +++ /dev/null @@ -1,116 +0,0 @@ -name: Test - -on: - workflow_dispatch: - pull_request: - merge_group: - push: - branches: [ main, develop ] - -permissions: {} - -# Enrich gradle.properties for CI/CD -env: - GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx7g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.daemon.jvm.options=-Xmx2g -XX:+UseG1GC - CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache - -jobs: - tests: - name: Runs unit tests - runs-on: ubuntu-latest - - # Allow all jobs on main and develop. Just one per PR. - concurrency: - group: ${{ github.ref == 'refs/heads/main' && format('unit-tests-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('unit-tests-develop-{0}', github.sha) || format('unit-tests-{0}', github.ref) }} - cancel-in-progress: true - steps: - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be - with: - # This might remove tools that are actually needed, if set to "true" but frees about 6 GB - tool-cache: true - # All of these default to true, but we should only need the 'android' one (and maybe swap-storage?) - android: false - dotnet: true - haskell: true - # This takes way too long to run (~2 minutes) and it saves only ~5.5GB - large-packages: false - docker-images: true - swap-storage: false - - # Increase swapfile size to prevent screenshot tests getting terminated - # https://github.com/actions/runner-images/discussions/7188#discussioncomment-6750749 - - name: 💽 Increase swapfile size - run: | - sudo swapoff -a - sudo fallocate -l 8G /mnt/swapfile - sudo chmod 600 /mnt/swapfile - sudo mkswap /mnt/swapfile - sudo swapon /mnt/swapfile - sudo swapon --show - - name: ⏬ Checkout with LFS - uses: nschloe/action-cached-lfs-checkout@385a8ecc719e50b8c71af6ab01a624b486b7c3bc # v1.2.5 - with: - # Ensure we are building the branch and not the branch after being merged on develop - # https://github.com/actions/checkout/issues/881 - ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }} - - name: Add SSH private keys for submodule repositories - uses: webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555 # v0.10.0 - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - with: - ssh-private-key: ${{ secrets.ELEMENT_ENTERPRISE_DEPLOY_KEY }} - - name: Clone submodules - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'element-hq/element-x-android' }} - run: git submodule update --init --recursive - - name: ☕️ Use JDK 21 - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - with: - distribution: 'temurin' # See 'Supported distributions' for available options - java-version: '21' - - name: Configure gradle - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - with: - cache-read-only: ${{ github.ref != 'refs/heads/develop' }} - - - name: ⚙️ Check coverage for debug variant (includes unit & screenshot tests) - run: ./gradlew testDebugUnitTest :tests:uitests:verifyPaparazziDebug :koverXmlReportMerged :koverHtmlReportMerged :koverVerifyAll $CI_GRADLE_ARG_PROPERTIES - - - name: 🚫 Upload kover failed coverage reports - if: failure() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - with: - name: kover-error-report - path: | - app/build/reports/kover - - - name: ✅ Upload kover report (disabled) - if: always() - run: echo "This is now done only once a day, see nightlyReports.yml" - - - name: 🚫 Upload test results on error - if: failure() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - with: - name: tests-and-screenshot-tests-results - path: | - **/build/paparazzi/failures/ - **/build/roborazzi/failures/ - **/build/reports/tests/*UnitTest/ - - - name: 🚫 Modify summary on error - if: failure() - run: | - echo """## Tests failed! - - """ >> $GITHUB_STEP_SUMMARY - python3 .github/workflows/scripts/parse_test_failures.py . >> $GITHUB_STEP_SUMMARY - echo "---" >> $GITHUB_STEP_SUMMARY - - # https://github.com/codecov/codecov-action - - name: ☂️ Upload coverage reports to codecov - uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0 - with: - fail_ci_if_error: true - token: ${{ secrets.CODECOV_TOKEN }} - files: build/reports/kover/reportMerged.xml - verbose: true diff --git a/.github/workflows/triage-incoming.yml b/.github/workflows/triage-incoming.yml deleted file mode 100644 index 8e8d03c9c4..0000000000 --- a/.github/workflows/triage-incoming.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Move new issues onto issue triage board v2 - -on: - issues: - types: [ opened ] - -permissions: {} - -jobs: - triage-new-issues: - runs-on: ubuntu-latest - steps: - - uses: actions/add-to-project@244f685bbc3b7adfa8466e08b698b5577571133e # v1.0.2 - with: - project-url: https://github.com/orgs/element-hq/projects/91 - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} diff --git a/.github/workflows/triage-labelled.yml b/.github/workflows/triage-labelled.yml deleted file mode 100644 index 3ec20f332b..0000000000 --- a/.github/workflows/triage-labelled.yml +++ /dev/null @@ -1,87 +0,0 @@ -name: Move labelled issues to correct boards and columns - -on: - issues: - types: [labeled] - -permissions: {} - -jobs: - move_element_x_issues: - name: ElementX issues to ElementX project board - runs-on: ubuntu-latest - # Skip in forks - if: > - github.repository == 'element-hq/element-x-android' - steps: - - uses: actions/add-to-project@244f685bbc3b7adfa8466e08b698b5577571133e # v1.0.2 - with: - project-url: https://github.com/orgs/element-hq/projects/43 - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - - move_needs_info: - name: Move triaged needs info issues on board - runs-on: ubuntu-latest - steps: - - uses: actions/add-to-project@244f685bbc3b7adfa8466e08b698b5577571133e # v1.0.2 - id: addItem - with: - project-url: https://github.com/orgs/element-hq/projects/91 - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - labeled: X-Needs-Info - - name: Print itemId - run: echo ${STEPS_ADDITEM_OUTPUTS_ITEMID} - env: - STEPS_ADDITEM_OUTPUTS_ITEMID: ${{ steps.addItem.outputs.itemId }} - - uses: kalgurn/update-project-item-status@31e54df46a2cdaef4f85c31ac839fbcd2fd7c3a2 # 0.0.3 - if: ${{ steps.addItem.outputs.itemId }} - with: - project-url: https://github.com/orgs/element-hq/projects/91 - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - item-id: ${{ steps.addItem.outputs.itemId }} - status: "Needs info" - - ex_plorers: - name: Add labelled issues to X-Plorer project - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'Team: Element X Feature') - steps: - - uses: actions/add-to-project@244f685bbc3b7adfa8466e08b698b5577571133e # v1.0.2 - with: - project-url: https://github.com/orgs/element-hq/projects/73 - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - - verticals_feature: - name: Add labelled issues to Verticals Feature project - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'Team: Verticals Feature') - steps: - - uses: actions/add-to-project@244f685bbc3b7adfa8466e08b698b5577571133e # v1.0.2 - with: - project-url: https://github.com/orgs/element-hq/projects/57 - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - - qa: - name: Add labelled issues to QA project - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'Team: QA') || - contains(github.event.issue.labels.*.name, 'X-Needs-Signoff') - steps: - - uses: actions/add-to-project@244f685bbc3b7adfa8466e08b698b5577571133e # v1.0.2 - with: - project-url: https://github.com/orgs/element-hq/projects/69 - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - - signoff: - name: Add labelled issues to signoff project - runs-on: ubuntu-latest - if: > - contains(github.event.issue.labels.*.name, 'X-Needs-Signoff') - steps: - - uses: actions/add-to-project@244f685bbc3b7adfa8466e08b698b5577571133e # v1.0.2 - with: - project-url: https://github.com/orgs/element-hq/projects/89 - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} diff --git a/.github/workflows/validate-lfs.yml b/.github/workflows/validate-lfs.yml deleted file mode 100644 index 027c7d68e9..0000000000 --- a/.github/workflows/validate-lfs.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: Validate Git LFS - -on: [pull_request, merge_group] - -permissions: {} - -jobs: - build: - runs-on: ubuntu-latest - name: Validate - steps: - - uses: nschloe/action-cached-lfs-checkout@385a8ecc719e50b8c71af6ab01a624b486b7c3bc # v1.2.5 - - - run: | - ./tools/git/validate_lfs.sh