# Copyright 2020 Signal Messenger, LLC # SPDX-License-Identifier: AGPL-3.0-only name: Benchmark on: push: branches: - development - main - '[0-9]+.[0-9]+.x' pull_request: schedule: - cron: '0 */12 * * *' jobs: linux: runs-on: ubuntu-latest-8-cores if: ${{ github.repository == 'signalapp/Signal-Desktop-Private' && (!github.event.schedule || github.ref == 'refs/heads/main') }} timeout-minutes: 30 steps: - name: Get system specs run: lsb_release -a - name: Get other system specs run: uname -a - name: Clone Desktop repo uses: actions/checkout@v4 - name: Setup node.js uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' - name: Install global dependencies run: npm install -g npm@10.2.5 - name: Install xvfb run: sudo apt-get install xvfb - name: Cache Desktop node_modules id: cache-desktop-modules uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-${{ hashFiles('package.json', 'package-lock.json', 'patches/**') }} - name: Install Desktop node_modules if: steps.cache-desktop-modules.outputs.cache-hit != 'true' run: npm ci env: NPM_CONFIG_LOGLEVEL: verbose - name: Build typescript run: npm run generate - name: Bundle run: npm run build:esbuild:prod - name: Create preload cache run: xvfb-run --auto-servernum npm run build:preload-cache - name: Run startup benchmarks run: | set -o pipefail xvfb-run --auto-servernum node ts/test-mock/benchmarks/startup_bench.js | tee benchmark-startup.log timeout-minutes: 10 env: NODE_ENV: production RUN_COUNT: 10 ELECTRON_ENABLE_STACK_DUMPING: on DEBUG: 'mock:benchmarks' ARTIFACTS_DIR: artifacts/startup - name: Run send benchmarks run: | set -o pipefail rm -rf /tmp/mock xvfb-run --auto-servernum node ts/test-mock/benchmarks/send_bench.js | tee benchmark-send.log timeout-minutes: 10 env: NODE_ENV: production RUN_COUNT: 100 ELECTRON_ENABLE_STACK_DUMPING: on # DEBUG: 'mock:benchmarks' ARTIFACTS_DIR: artifacts/send - name: Run group send benchmarks run: | set -o pipefail rm -rf /tmp/mock xvfb-run --auto-servernum node \ ts/test-mock/benchmarks/group_send_bench.js | \ tee benchmark-group-send.log timeout-minutes: 10 env: NODE_ENV: production RUN_COUNT: 100 CONVERSATION_SIZE: 500 ELECTRON_ENABLE_STACK_DUMPING: on # DEBUG: 'mock:benchmarks' ARTIFACTS_DIR: artifacts/group-send - name: Run large group send benchmarks with blocks run: | set -o pipefail rm -rf /tmp/mock xvfb-run --auto-servernum node \ ts/test-mock/benchmarks/group_send_bench.js | \ tee benchmark-large-group-send-with-blocks.log timeout-minutes: 10 env: NODE_ENV: production GROUP_SIZE: 500 CONTACT_COUNT: 500 BLOCKED_COUNT: 10 DISCARD_COUNT: 2 RUN_COUNT: 50 CONVERSATION_SIZE: 500 ELECTRON_ENABLE_STACK_DUMPING: on # DEBUG: 'mock:benchmarks' ARTIFACTS_DIR: artifacts/group-send - name: Run large group send benchmarks with delivery receipts run: | set -o pipefail rm -rf /tmp/mock xvfb-run --auto-servernum node \ ts/test-mock/benchmarks/group_send_bench.js | \ tee benchmark-large-group-send.log timeout-minutes: 10 env: NODE_ENV: production GROUP_SIZE: 500 CONTACT_COUNT: 500 GROUP_DELIVERY_RECEIPTS: 500 DISCARD_COUNT: 2 RUN_COUNT: 20 CONVERSATION_SIZE: 50 ELECTRON_ENABLE_STACK_DUMPING: on # DEBUG: 'mock:benchmarks' ARTIFACTS_DIR: artifacts/large-group-send - name: Run conversation open benchmarks run: | set -o pipefail rm -rf /tmp/mock xvfb-run --auto-servernum node \ ts/test-mock/benchmarks/convo_open_bench.js | \ tee benchmark-convo-open.log timeout-minutes: 10 env: NODE_ENV: production RUN_COUNT: 100 ELECTRON_ENABLE_STACK_DUMPING: on # DEBUG: 'mock:benchmarks' ARTIFACTS_DIR: artifacts/convo-open - name: Run call history search benchmarks run: | set -o pipefail rm -rf /tmp/mock xvfb-run --auto-servernum node \ ts/test-mock/benchmarks/call_history_search_bench.js | \ tee benchmark-call-history-search.log timeout-minutes: 10 env: NODE_ENV: production RUN_COUNT: 100 ELECTRON_ENABLE_STACK_DUMPING: on # DEBUG: 'mock:benchmarks' ARTIFACTS_DIR: artifacts/call-history-search - name: Run backup benchmarks run: | set -o pipefail rm -rf /tmp/mock xvfb-run --auto-servernum node \ ts/test-mock/benchmarks/backup_bench.js | \ tee benchmark-backup.log timeout-minutes: 10 env: NODE_ENV: production ELECTRON_ENABLE_STACK_DUMPING: on # DEBUG: 'mock:benchmarks' ARTIFACTS_DIR: artifacts/backup-bench - name: Upload benchmark logs on failure if: failure() uses: actions/upload-artifact@v4 with: name: logs path: artifacts - name: Clone benchmark repo uses: actions/checkout@v4 with: repository: 'signalapp/Signal-Desktop-Benchmarks-Private' path: 'benchmark-results' token: ${{ secrets.AUTOMATED_GITHUB_PAT }} - name: Build benchmark repo working-directory: benchmark-results run: | npm ci npm run build - name: Publish to DataDog working-directory: benchmark-results run: | node ./bin/publish.js ../benchmark-startup.log desktop.ci.performance.startup node ./bin/publish.js ../benchmark-send.log desktop.ci.performance.send node ./bin/publish.js ../benchmark-group-send.log desktop.ci.performance.groupSend node ./bin/publish.js ../benchmark-large-group-send-with-blocks.log desktop.ci.performance.largeGroupSendWithBlocks node ./bin/publish.js ../benchmark-large-group-send.log desktop.ci.performance.largeGroupSend node ./bin/publish.js ../benchmark-convo-open.log desktop.ci.performance.convoOpen node ./bin/publish.js ../benchmark-call-history-search.log desktop.ci.performance.callHistorySearch node ./bin/publish.js ../benchmark-backup.log desktop.ci.performance.backup env: DD_API_KEY: ${{ secrets.DATADOG_API_KEY }}