From 4e9d873fa051a21a08899584a7eac21fdaf008aa Mon Sep 17 00:00:00 2001 From: Tomasz Lesniakiewicz Date: Thu, 19 Feb 2026 14:47:22 +0100 Subject: [PATCH 01/14] set-up-sentry-release-upload --- .github/workflows/deploy.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 49d68522541c0..d5c65851f611f 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -175,6 +175,15 @@ jobs: GITHUB_TOKEN: ${{ github.token }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + - name: Upload Android build to Sentry for size analysis + if: ${{ fromJSON(env.SHOULD_BUILD_APP) }} + continue-on-error: true + timeout-minutes: 5 + # TODO: Remove --log-level debug before merging + run: npx sentry-cli build upload ${{ env.aabPath }} --org expensify --project app --build-configuration Release --log-level debug + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + - name: Upload Android app to Google Play if: ${{ fromJSON(env.SHOULD_BUILD_APP) }} run: bundle exec fastlane android ${{ vars.ANDROID_UPLOAD_COMMAND }} @@ -393,6 +402,15 @@ jobs: APPLE_NOTIFICATION_PROVISIONING_PROFILE_NAME: ${{ vars.APPLE_NOTIFICATION_PROVISIONING_PROFILE_NAME }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + - name: Upload iOS build to Sentry for size analysis + if: ${{ fromJSON(env.SHOULD_BUILD_APP) }} + continue-on-error: true + timeout-minutes: 5 + # TODO: Remove --log-level debug before merging + run: npx sentry-cli build upload ${{ env.ipaPath }} --org expensify --project app --build-configuration Release --log-level debug + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + - name: Upload release build to TestFlight if: ${{ fromJSON(env.SHOULD_BUILD_APP) }} run: bundle exec fastlane ios upload_testflight_hybrid From 5f497e2a45fe58314029bed53d68a54dfd016ace Mon Sep 17 00:00:00 2001 From: Tomasz Lesniakiewicz Date: Thu, 19 Feb 2026 16:33:28 +0100 Subject: [PATCH 02/14] upload adhocsbuilds to Sentry --- .github/workflows/buildAdHoc.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/workflows/buildAdHoc.yml b/.github/workflows/buildAdHoc.yml index 9fd322c10a9ab..cf644e6070049 100644 --- a/.github/workflows/buildAdHoc.yml +++ b/.github/workflows/buildAdHoc.yml @@ -226,6 +226,14 @@ jobs: custom-identifier: ${{ steps.computeIdentifier.outputs.IDENTIFIER }} validate-elf-alignment: false + - name: Upload Android build to Sentry for size analysis + if: ${{ env.ARTIFACT_PATH != '' }} + continue-on-error: true + timeout-minutes: 5 + run: npx sentry-cli build upload "$ARTIFACT_PATH" --org expensify --project app --build-configuration AdHoc --log-level debug + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + - name: Upload Gradle profile report if: always() # v6 @@ -366,6 +374,14 @@ jobs: comment-bot: false custom-identifier: ${{ steps.computeIdentifier.outputs.IDENTIFIER }} + - name: Upload iOS build to Sentry for size analysis + if: ${{ env.ARTIFACT_PATH != '' }} + continue-on-error: true + timeout-minutes: 5 + run: npx sentry-cli build upload "$ARTIFACT_PATH" --org expensify --project app --build-configuration AdHoc --log-level debug + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + - name: Set artifact URL output id: set-artifact-url run: echo "ARTIFACT_URL=$ARTIFACT_URL" >> "$GITHUB_OUTPUT" From b63b0149d5a6f15a76a6793e71a4efc708a0cb82 Mon Sep 17 00:00:00 2001 From: Tomasz Lesniakiewicz Date: Fri, 20 Feb 2026 12:50:08 +0100 Subject: [PATCH 03/14] install sentry-cli newest version --- package-lock.json | 464 ++++++++++++++++++++++++++++++++++++++++------ package.json | 1 + 2 files changed, 407 insertions(+), 58 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7cc57ca771c8b..212d86c7daeae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -188,6 +188,7 @@ "@rock-js/platform-ios": "0.12.10", "@rock-js/plugin-metro": "0.12.10", "@rock-js/provider-s3": "0.12.10", + "@sentry/cli": "3.2.0", "@sentry/webpack-plugin": "4.6.0", "@storybook/addon-a11y": "10.1.10", "@storybook/addon-docs": "10.1.10", @@ -13825,6 +13826,180 @@ "node": ">= 14" } }, + "node_modules/@sentry/bundler-plugin-core/node_modules/@sentry/cli": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.58.4.tgz", + "integrity": "sha512-ArDrpuS8JtDYEvwGleVE+FgR+qHaOp77IgdGSacz6SZy6Lv90uX0Nu4UrHCQJz8/xwIcNxSqnN22lq0dH4IqTg==", + "dev": true, + "hasInstallScript": true, + "license": "FSL-1.1-MIT", + "dependencies": { + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "proxy-from-env": "^1.1.0", + "which": "^2.0.2" + }, + "bin": { + "sentry-cli": "bin/sentry-cli" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@sentry/cli-darwin": "2.58.4", + "@sentry/cli-linux-arm": "2.58.4", + "@sentry/cli-linux-arm64": "2.58.4", + "@sentry/cli-linux-i686": "2.58.4", + "@sentry/cli-linux-x64": "2.58.4", + "@sentry/cli-win32-arm64": "2.58.4", + "@sentry/cli-win32-i686": "2.58.4", + "@sentry/cli-win32-x64": "2.58.4" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/@sentry/cli-darwin": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.58.4.tgz", + "integrity": "sha512-kbTD+P4X8O+nsNwPxCywtj3q22ecyRHWff98rdcmtRrvwz8CKi/T4Jxn/fnn2i4VEchy08OWBuZAqaA5Kh2hRQ==", + "dev": true, + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/@sentry/cli-linux-arm": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.58.4.tgz", + "integrity": "sha512-rdQ8beTwnN48hv7iV7e7ZKucPec5NJkRdrrycMJMZlzGBPi56LqnclgsHySJ6Kfq506A2MNuQnKGaf/sBC9REA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/@sentry/cli-linux-arm64": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.58.4.tgz", + "integrity": "sha512-0g0KwsOozkLtzN8/0+oMZoOuQ0o7W6O+hx+ydVU1bktaMGKEJLMAWxOQNjsh1TcBbNIXVOKM/I8l0ROhaAb8Ig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/@sentry/cli-linux-i686": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.58.4.tgz", + "integrity": "sha512-NseoIQAFtkziHyjZNPTu1Gm1opeQHt7Wm1LbLrGWVIRvUOzlslO9/8i6wETUZ6TjlQxBVRgd3Q0lRBG2A8rFYA==", + "cpu": [ + "x86", + "ia32" + ], + "dev": true, + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/@sentry/cli-linux-x64": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.58.4.tgz", + "integrity": "sha512-d3Arz+OO/wJYTqCYlSN3Ktm+W8rynQ/IMtSZLK8nu0ryh5mJOh+9XlXY6oDXw4YlsM8qCRrNquR8iEI1Y/IH+Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/@sentry/cli-win32-arm64": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.58.4.tgz", + "integrity": "sha512-bqYrF43+jXdDBh0f8HIJU3tbvlOFtGyRjHB8AoRuMQv9TEDUfENZyCelhdjA+KwDKYl48R1Yasb4EHNzsoO83w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/@sentry/cli-win32-i686": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.58.4.tgz", + "integrity": "sha512-3triFD6jyvhVcXOmGyttf+deKZcC1tURdhnmDUIBkiDPJKGT/N5xa4qAtHJlAB/h8L9jgYih9bvJnvvFVM7yug==", + "cpu": [ + "x86", + "ia32" + ], + "dev": true, + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/@sentry/cli-win32-x64": { + "version": "2.58.4", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.58.4.tgz", + "integrity": "sha512-cSzN4PjM1RsCZ4pxMjI0VI7yNCkxiJ5jmWncyiwHXGiXrV1eXYdQ3n1LhUYLZ91CafyprR0OhDcE+RVZ26Qb5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, "node_modules/@sentry/bundler-plugin-core/node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -13914,56 +14089,58 @@ "license": "MIT" }, "node_modules/@sentry/cli": { - "version": "2.58.0", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.58.0.tgz", - "integrity": "sha512-ywfV2uYkNaW5BGFBgIEX+urkxWtY03GYKN08OLYJpfJeOWl5tzxAKKg+AkMZqnqsDqjCf8gLjZh7sF4jY+ZE1Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-3.2.0.tgz", + "integrity": "sha512-YLv/xgttSc8sRhK2xBoxmLS+yQlCW154ey2cXFsFe+yY73lXvQ9nZ7BkHmSc+YUl8y5CKHL+8edQLYV8O8PQMA==", + "dev": true, "hasInstallScript": true, - "license": "BSD-3-Clause", + "license": "FSL-1.1-MIT", "dependencies": { - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.7", "progress": "^2.0.3", "proxy-from-env": "^1.1.0", + "undici": "^6.22.0", "which": "^2.0.2" }, "bin": { "sentry-cli": "bin/sentry-cli" }, "engines": { - "node": ">= 10" + "node": ">= 18" }, "optionalDependencies": { - "@sentry/cli-darwin": "2.58.0", - "@sentry/cli-linux-arm": "2.58.0", - "@sentry/cli-linux-arm64": "2.58.0", - "@sentry/cli-linux-i686": "2.58.0", - "@sentry/cli-linux-x64": "2.58.0", - "@sentry/cli-win32-arm64": "2.58.0", - "@sentry/cli-win32-i686": "2.58.0", - "@sentry/cli-win32-x64": "2.58.0" + "@sentry/cli-darwin": "3.2.0", + "@sentry/cli-linux-arm": "3.2.0", + "@sentry/cli-linux-arm64": "3.2.0", + "@sentry/cli-linux-i686": "3.2.0", + "@sentry/cli-linux-x64": "3.2.0", + "@sentry/cli-win32-arm64": "3.2.0", + "@sentry/cli-win32-i686": "3.2.0", + "@sentry/cli-win32-x64": "3.2.0" } }, "node_modules/@sentry/cli-darwin": { - "version": "2.58.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.58.0.tgz", - "integrity": "sha512-dI8+85N2xNsQeJZBbfGkjFScYH0xP/8+TDgoA5YiWWxsD/qSlWv1pf2VCR83smMyfcjIkDiPYIxBDticD67skQ==", - "license": "BSD-3-Clause", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-3.2.0.tgz", + "integrity": "sha512-2If2h0P/X9K0UrwlpZYKnxBmIFfa957lAHGe5VmN64v8nEHk8dxcrX+NS9nX9H75eccLGzGMcYk0Zt0KQgQJ3g==", + "dev": true, + "license": "FSL-1.1-MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/@sentry/cli-linux-arm": { - "version": "2.58.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.58.0.tgz", - "integrity": "sha512-QxBWSQkm2OL8d0XXTUOcX5RYZzZGkMw48ubU4g/c4rlT06PuJV56Z03jsMQdJWUDzKmVYoJdvFV/whxYIkwmWw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-3.2.0.tgz", + "integrity": "sha512-NVcGcS9mceivVhi8W6iEnlcK96OlPMzOdM6xkIm+7+J0uXHgUyMyc+rT6p2QG3j8jI5I7qAl7fTHWluSX2lx3g==", "cpu": [ "arm" ], - "license": "BSD-3-Clause", + "dev": true, + "license": "FSL-1.1-MIT", "optional": true, "os": [ "linux", @@ -13971,17 +14148,18 @@ "android" ], "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/@sentry/cli-linux-arm64": { - "version": "2.58.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.58.0.tgz", - "integrity": "sha512-Fso5GImxQOigZqLHAHhz85w71zxS1bvL52PI/tcjadmKrIaJdD3ANukC0UcKyKuj9xhr/k1ufNR7V+2BD16kmg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-3.2.0.tgz", + "integrity": "sha512-YFpYIfYpXYzpSrIspmPOOPjXbxWp/Ve+F2hSIQb1tSKmcxFgaUm6WfuniYF8EIaLNa8YOLECf0xo78yGXBa+ug==", "cpu": [ "arm64" ], - "license": "BSD-3-Clause", + "dev": true, + "license": "FSL-1.1-MIT", "optional": true, "os": [ "linux", @@ -13989,18 +14167,19 @@ "android" ], "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/@sentry/cli-linux-i686": { - "version": "2.58.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.58.0.tgz", - "integrity": "sha512-Av+T5YwuTtbOpe/Fyr/lsbl5XIZTFspHCiAt4Kgtllme6T1ASIDhQDXDh/OVJ8So4pHkToTn3iH8mm8vLqBqOA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-3.2.0.tgz", + "integrity": "sha512-6SOxlF37NqRRKxEuvWryBM7MAgTisq0G6ZQzhI2iuWbcrmlLUDUW2Yssz3gAR01eYJ4jfpqvojSzPRDwqB0K+Q==", "cpu": [ "x86", "ia32" ], - "license": "BSD-3-Clause", + "dev": true, + "license": "FSL-1.1-MIT", "optional": true, "os": [ "linux", @@ -14008,17 +14187,18 @@ "android" ], "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/@sentry/cli-linux-x64": { - "version": "2.58.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.58.0.tgz", - "integrity": "sha512-AxK0eqZbHn0NGWsAE8bzt/iRMMUlqsx77kru/TIBQy9cMMJaq+rLb63W7HWXln4ER32nPZYx+JuhHD9UNiAFHA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-3.2.0.tgz", + "integrity": "sha512-7LRd0A74ma/1ejlTRPOoBiFiJr4LWkoE6CnA2XwAoYd0r62WUjGHtg6gIC+yElOCwtxXP7I9fOiV2BJIAq2DHw==", "cpu": [ "x64" ], - "license": "BSD-3-Clause", + "dev": true, + "license": "FSL-1.1-MIT", "optional": true, "os": [ "linux", @@ -14026,56 +14206,59 @@ "android" ], "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/@sentry/cli-win32-arm64": { - "version": "2.58.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.58.0.tgz", - "integrity": "sha512-lIRTfGjD1TQIOuFh4rJGWt3zXyeXAlfoYYQbzG/rP6gXstiGENQtfEXZyKT+wlIGSqtbBGVfL8xp65ryjbXSgQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-3.2.0.tgz", + "integrity": "sha512-uKRi/++gnGepsaGi4goIcC13YGNEHgOUcROkz4L3H8vAR7QxWv2SHy7SCN+2S6c+Q2mOd0DfY35cMW5MzTpb7g==", "cpu": [ "arm64" ], - "license": "BSD-3-Clause", + "dev": true, + "license": "FSL-1.1-MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/@sentry/cli-win32-i686": { - "version": "2.58.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.58.0.tgz", - "integrity": "sha512-7VdB3QZ/3t2FABgIwRP2SoJcDmZaPPPZofVmJem+FgeONeLOUvHQw9WSLG4y5Dfc9yi5wO31H1ClW4uxv8EtuA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-3.2.0.tgz", + "integrity": "sha512-/84NEPeFQne2bQWfDZ+3EzioxFR8ojSwExCgVsyTfqa/4PzmaerAGUAxiD+VcJLJTyJEHAjWXTmSZGbYjIgdyQ==", "cpu": [ "x86", "ia32" ], - "license": "BSD-3-Clause", + "dev": true, + "license": "FSL-1.1-MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/@sentry/cli-win32-x64": { - "version": "2.58.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.58.0.tgz", - "integrity": "sha512-uItx4P4v9cKbgVbOpuShvIV8g42qLmZorPHwg3pYUu78c85xAWrmiXL+0JKNUf5JVBEHeHB+rIu08AZfDMhxig==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-3.2.0.tgz", + "integrity": "sha512-N9qGGT91awsh4IMyXrRHH+qIWmv9MJk9tPPAWPvLMWgdlTHT/40WYwvA4tYj80uZXU0TN8ppBWbd3ebDyOjwxA==", "cpu": [ "x64" ], - "license": "BSD-3-Clause", + "dev": true, + "license": "FSL-1.1-MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/@sentry/core": { @@ -14131,6 +14314,171 @@ } } }, + "node_modules/@sentry/react-native/node_modules/@sentry/cli": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.58.0.tgz", + "integrity": "sha512-ywfV2uYkNaW5BGFBgIEX+urkxWtY03GYKN08OLYJpfJeOWl5tzxAKKg+AkMZqnqsDqjCf8gLjZh7sF4jY+ZE1Q==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "proxy-from-env": "^1.1.0", + "which": "^2.0.2" + }, + "bin": { + "sentry-cli": "bin/sentry-cli" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@sentry/cli-darwin": "2.58.0", + "@sentry/cli-linux-arm": "2.58.0", + "@sentry/cli-linux-arm64": "2.58.0", + "@sentry/cli-linux-i686": "2.58.0", + "@sentry/cli-linux-x64": "2.58.0", + "@sentry/cli-win32-arm64": "2.58.0", + "@sentry/cli-win32-i686": "2.58.0", + "@sentry/cli-win32-x64": "2.58.0" + } + }, + "node_modules/@sentry/react-native/node_modules/@sentry/cli-darwin": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.58.0.tgz", + "integrity": "sha512-dI8+85N2xNsQeJZBbfGkjFScYH0xP/8+TDgoA5YiWWxsD/qSlWv1pf2VCR83smMyfcjIkDiPYIxBDticD67skQ==", + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/react-native/node_modules/@sentry/cli-linux-arm": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.58.0.tgz", + "integrity": "sha512-QxBWSQkm2OL8d0XXTUOcX5RYZzZGkMw48ubU4g/c4rlT06PuJV56Z03jsMQdJWUDzKmVYoJdvFV/whxYIkwmWw==", + "cpu": [ + "arm" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/react-native/node_modules/@sentry/cli-linux-arm64": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.58.0.tgz", + "integrity": "sha512-Fso5GImxQOigZqLHAHhz85w71zxS1bvL52PI/tcjadmKrIaJdD3ANukC0UcKyKuj9xhr/k1ufNR7V+2BD16kmg==", + "cpu": [ + "arm64" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/react-native/node_modules/@sentry/cli-linux-i686": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.58.0.tgz", + "integrity": "sha512-Av+T5YwuTtbOpe/Fyr/lsbl5XIZTFspHCiAt4Kgtllme6T1ASIDhQDXDh/OVJ8So4pHkToTn3iH8mm8vLqBqOA==", + "cpu": [ + "x86", + "ia32" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/react-native/node_modules/@sentry/cli-linux-x64": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.58.0.tgz", + "integrity": "sha512-AxK0eqZbHn0NGWsAE8bzt/iRMMUlqsx77kru/TIBQy9cMMJaq+rLb63W7HWXln4ER32nPZYx+JuhHD9UNiAFHA==", + "cpu": [ + "x64" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/react-native/node_modules/@sentry/cli-win32-arm64": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.58.0.tgz", + "integrity": "sha512-lIRTfGjD1TQIOuFh4rJGWt3zXyeXAlfoYYQbzG/rP6gXstiGENQtfEXZyKT+wlIGSqtbBGVfL8xp65ryjbXSgQ==", + "cpu": [ + "arm64" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/react-native/node_modules/@sentry/cli-win32-i686": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.58.0.tgz", + "integrity": "sha512-7VdB3QZ/3t2FABgIwRP2SoJcDmZaPPPZofVmJem+FgeONeLOUvHQw9WSLG4y5Dfc9yi5wO31H1ClW4uxv8EtuA==", + "cpu": [ + "x86", + "ia32" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/react-native/node_modules/@sentry/cli-win32-x64": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.58.0.tgz", + "integrity": "sha512-uItx4P4v9cKbgVbOpuShvIV8g42qLmZorPHwg3pYUu78c85xAWrmiXL+0JKNUf5JVBEHeHB+rIu08AZfDMhxig==", + "cpu": [ + "x64" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, "node_modules/@sentry/types": { "version": "10.24.0", "resolved": "https://registry.npmjs.org/@sentry/types/-/types-10.24.0.tgz", @@ -38068,9 +38416,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "6.21.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", - "integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", + "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", "license": "MIT", "engines": { "node": ">=18.17" diff --git a/package.json b/package.json index 6cab6e8682909..e4b051e73aef3 100644 --- a/package.json +++ b/package.json @@ -254,6 +254,7 @@ "@rock-js/platform-ios": "0.12.10", "@rock-js/plugin-metro": "0.12.10", "@rock-js/provider-s3": "0.12.10", + "@sentry/cli": "3.2.0", "@sentry/webpack-plugin": "4.6.0", "@storybook/addon-a11y": "10.1.10", "@storybook/addon-docs": "10.1.10", From 99058c0ef826fe1fa78d83f38a7144dc9d09ba77 Mon Sep 17 00:00:00 2001 From: Tomasz Lesniakiewicz Date: Fri, 20 Feb 2026 13:01:27 +0100 Subject: [PATCH 04/14] add notice log with bundle url --- .github/workflows/buildAdHoc.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/workflows/buildAdHoc.yml b/.github/workflows/buildAdHoc.yml index cf644e6070049..cef3dc39f0fb0 100644 --- a/.github/workflows/buildAdHoc.yml +++ b/.github/workflows/buildAdHoc.yml @@ -230,7 +230,13 @@ jobs: if: ${{ env.ARTIFACT_PATH != '' }} continue-on-error: true timeout-minutes: 5 - run: npx sentry-cli build upload "$ARTIFACT_PATH" --org expensify --project app --build-configuration AdHoc --log-level debug + run: | + OUTPUT=$(npx sentry-cli build upload "$ARTIFACT_PATH" --org expensify --project app --build-configuration AdHoc --log-level debug 2>&1) + echo "$OUTPUT" + SENTRY_URL=$(echo "$OUTPUT" | grep -oE 'https://expensify\.sentry\.io/[^ ]+' | head -1) + if [ -n "$SENTRY_URL" ]; then + echo "::notice::Android Sentry size analysis: $SENTRY_URL" + fi env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} @@ -378,7 +384,13 @@ jobs: if: ${{ env.ARTIFACT_PATH != '' }} continue-on-error: true timeout-minutes: 5 - run: npx sentry-cli build upload "$ARTIFACT_PATH" --org expensify --project app --build-configuration AdHoc --log-level debug + run: | + OUTPUT=$(npx sentry-cli build upload "$ARTIFACT_PATH" --org expensify --project app --build-configuration AdHoc --log-level debug 2>&1) + echo "$OUTPUT" + SENTRY_URL=$(echo "$OUTPUT" | grep -oE 'https://expensify\.sentry\.io/[^ ]+' | head -1) + if [ -n "$SENTRY_URL" ]; then + echo "::notice::iOS Sentry size analysis: $SENTRY_URL" + fi env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} From 103f6f43631b09715c160b8ca88d479b74dac661 Mon Sep 17 00:00:00 2001 From: Tomasz Lesniakiewicz Date: Mon, 23 Feb 2026 12:59:55 +0100 Subject: [PATCH 05/14] add table with sentry bundle urls --- .github/workflows/buildAdHoc.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.github/workflows/buildAdHoc.yml b/.github/workflows/buildAdHoc.yml index cef3dc39f0fb0..d4820e1d5d335 100644 --- a/.github/workflows/buildAdHoc.yml +++ b/.github/workflows/buildAdHoc.yml @@ -120,6 +120,7 @@ jobs: PULL_REQUEST_NUMBER: ${{ inputs.APP_PR_NUMBER }} outputs: ROCK_ANDROID_ADHOC_INDEX_URL: ${{ steps.set-artifact-url.outputs.ARTIFACT_URL }} + SENTRY_ANDROID_URL: ${{ steps.sentry-upload.outputs.SENTRY_URL }} steps: - name: Checkout # v6 @@ -227,6 +228,7 @@ jobs: validate-elf-alignment: false - name: Upload Android build to Sentry for size analysis + id: sentry-upload if: ${{ env.ARTIFACT_PATH != '' }} continue-on-error: true timeout-minutes: 5 @@ -236,6 +238,7 @@ jobs: SENTRY_URL=$(echo "$OUTPUT" | grep -oE 'https://expensify\.sentry\.io/[^ ]+' | head -1) if [ -n "$SENTRY_URL" ]; then echo "::notice::Android Sentry size analysis: $SENTRY_URL" + echo "SENTRY_URL=$SENTRY_URL" >> "$GITHUB_OUTPUT" fi env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} @@ -262,6 +265,7 @@ jobs: runs-on: macos-15-xlarge outputs: ROCK_IOS_ADHOC_INDEX_URL: ${{ steps.set-artifact-url.outputs.ARTIFACT_URL }} + SENTRY_IOS_URL: ${{ steps.sentry-upload.outputs.SENTRY_URL }} steps: - name: Checkout # v6 @@ -381,6 +385,7 @@ jobs: custom-identifier: ${{ steps.computeIdentifier.outputs.IDENTIFIER }} - name: Upload iOS build to Sentry for size analysis + id: sentry-upload if: ${{ env.ARTIFACT_PATH != '' }} continue-on-error: true timeout-minutes: 5 @@ -390,6 +395,7 @@ jobs: SENTRY_URL=$(echo "$OUTPUT" | grep -oE 'https://expensify\.sentry\.io/[^ ]+' | head -1) if [ -n "$SENTRY_URL" ]; then echo "::notice::iOS Sentry size analysis: $SENTRY_URL" + echo "SENTRY_URL=$SENTRY_URL" >> "$GITHUB_OUTPUT" fi env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} @@ -474,6 +480,8 @@ jobs: const androidLink = '${{ needs.androidHybrid.outputs.ROCK_ANDROID_ADHOC_INDEX_URL }}' || ''; const iosLink = '${{ needs.iosHybrid.outputs.ROCK_IOS_ADHOC_INDEX_URL }}' || ''; const mobileExpensifySHA = '${{ steps.getMobileExpensifySHA.outputs.SHA }}' || ''; + const androidSentryLink = '${{ needs.androidHybrid.outputs.SENTRY_ANDROID_URL }}' || ''; + const iosSentryLink = '${{ needs.iosHybrid.outputs.SENTRY_IOS_URL }}' || ''; const webStatus = webLink ? '✅ Success' : '${{ needs.web.result }}' === 'failure' ? '❌ Failed' : '⏭️ Skipped'; const androidStatus = androidLink ? '✅ Success' : '${{ needs.androidHybrid.result }}' === 'failure' ? '❌ Failed' : '⏭️ Skipped'; @@ -499,6 +507,15 @@ jobs: ], ]); + if (androidSentryLink || iosSentryLink) { + summary.addHeading('Bundle Size Analysis', 3); + summary.addTable([ + [{data: 'Platform', header: true}, {data: 'Sentry Size Analysis', header: true}], + ['Android', androidSentryLink ? `${androidSentryLink}` : '-'], + ['iOS', iosSentryLink ? `${iosSentryLink}` : '-'], + ]); + } + if (mobileExpensifySHA) { const mobileExpensifyUrl = `https://github.com/Expensify/Mobile-Expensify/commit/${mobileExpensifySHA}`; const label = '${{ inputs.MOBILE_EXPENSIFY_REF }}' ? 'Mobile-Expensify SHA (Custom)' : 'Mobile-Expensify Submodule SHA'; From d59ded86b52f9937d720028adea538c9beeee348 Mon Sep 17 00:00:00 2001 From: Tomasz Lesniakiewicz Date: Mon, 23 Feb 2026 14:42:40 +0100 Subject: [PATCH 06/14] chore: remove todos comments --- .github/workflows/deploy.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index d5c65851f611f..955a5ae7061d8 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -179,7 +179,6 @@ jobs: if: ${{ fromJSON(env.SHOULD_BUILD_APP) }} continue-on-error: true timeout-minutes: 5 - # TODO: Remove --log-level debug before merging run: npx sentry-cli build upload ${{ env.aabPath }} --org expensify --project app --build-configuration Release --log-level debug env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} @@ -406,7 +405,6 @@ jobs: if: ${{ fromJSON(env.SHOULD_BUILD_APP) }} continue-on-error: true timeout-minutes: 5 - # TODO: Remove --log-level debug before merging run: npx sentry-cli build upload ${{ env.ipaPath }} --org expensify --project app --build-configuration Release --log-level debug env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} From b2974cd45368db3c0d932023568aa4510a563acf Mon Sep 17 00:00:00 2001 From: Tomasz Lesniakiewicz Date: Tue, 24 Feb 2026 12:31:37 +0100 Subject: [PATCH 07/14] add upload sentry bundle logic to separate files --- .github/workflows/buildAndroid.yml | 20 ++++++++++++++++++++ .github/workflows/buildIOS.yml | 20 ++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/.github/workflows/buildAndroid.yml b/.github/workflows/buildAndroid.yml index bfcd38dc79e89..981b1a77d2216 100644 --- a/.github/workflows/buildAndroid.yml +++ b/.github/workflows/buildAndroid.yml @@ -35,6 +35,9 @@ on: ROCK_ARTIFACT_URL: description: URL to download the ad-hoc build artifact (adhoc only) value: ${{ jobs.build.outputs.ROCK_ARTIFACT_URL }} + SENTRY_URL: + description: URL to Sentry size analysis (adhoc only) + value: ${{ jobs.build.outputs.SENTRY_URL }} jobs: build: @@ -45,6 +48,7 @@ jobs: outputs: VERSION_CODE: ${{ steps.getAndroidVersion.outputs.VERSION_CODE }} ROCK_ARTIFACT_URL: ${{ steps.set-artifact-url.outputs.ARTIFACT_URL }} + SENTRY_URL: ${{ steps.sentry-upload.outputs.SENTRY_URL }} steps: - name: Checkout # v6 @@ -169,6 +173,22 @@ jobs: custom-identifier: ${{ steps.computeIdentifier.outputs.IDENTIFIER }} validate-elf-alignment: false + - name: Upload Android build to Sentry for size analysis + id: sentry-upload + if: ${{ env.ARTIFACT_PATH != '' && inputs.variant == 'Adhoc' }} + continue-on-error: true + timeout-minutes: 5 + run: | + OUTPUT=$(npx sentry-cli build upload "$ARTIFACT_PATH" --org expensify --project app --build-configuration AdHoc --log-level debug 2>&1) + echo "$OUTPUT" + SENTRY_URL=$(echo "$OUTPUT" | grep -oE 'https://expensify\.sentry\.io/[^ ]+' | head -1) + if [ -n "$SENTRY_URL" ]; then + echo "::notice::Android Sentry size analysis: $SENTRY_URL" + echo "SENTRY_URL=$SENTRY_URL" >> "$GITHUB_OUTPUT" + fi + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + - name: Upload Gradle profile report if: always() # v6 diff --git a/.github/workflows/buildIOS.yml b/.github/workflows/buildIOS.yml index 36bb585f62426..b9018ba4d6f89 100644 --- a/.github/workflows/buildIOS.yml +++ b/.github/workflows/buildIOS.yml @@ -35,6 +35,9 @@ on: ROCK_ARTIFACT_URL: description: URL to download the ad-hoc build artifact (adhoc only) value: ${{ jobs.build.outputs.ROCK_ARTIFACT_URL }} + SENTRY_URL: + description: URL to Sentry size analysis (adhoc only) + value: ${{ jobs.build.outputs.SENTRY_URL }} jobs: build: @@ -46,6 +49,7 @@ jobs: outputs: IOS_VERSION: ${{ steps.getIOSVersion.outputs.IOS_VERSION }} ROCK_ARTIFACT_URL: ${{ steps.set-artifact-url.outputs.ARTIFACT_URL }} + SENTRY_URL: ${{ steps.sentry-upload.outputs.SENTRY_URL }} steps: - name: Checkout # v6 @@ -223,6 +227,22 @@ jobs: comment-bot: false custom-identifier: ${{ steps.computeIdentifier.outputs.IDENTIFIER }} + - name: Upload iOS build to Sentry for size analysis + id: sentry-upload + if: ${{ env.ARTIFACT_PATH != '' && inputs.variant == 'Adhoc' }} + continue-on-error: true + timeout-minutes: 5 + run: | + OUTPUT=$(npx sentry-cli build upload "$ARTIFACT_PATH" --org expensify --project app --build-configuration AdHoc --log-level debug 2>&1) + echo "$OUTPUT" + SENTRY_URL=$(echo "$OUTPUT" | grep -oE 'https://expensify\.sentry\.io/[^ ]+' | head -1) + if [ -n "$SENTRY_URL" ]; then + echo "::notice::iOS Sentry size analysis: $SENTRY_URL" + echo "SENTRY_URL=$SENTRY_URL" >> "$GITHUB_OUTPUT" + fi + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + - name: Set artifact URL output id: set-artifact-url if: ${{ inputs.variant == 'Adhoc' }} From d34193f063de69ac33cf5468a345817102eda88e Mon Sep 17 00:00:00 2001 From: Tomasz Lesniakiewicz Date: Tue, 24 Feb 2026 12:51:44 +0100 Subject: [PATCH 08/14] bump sentry-cli version --- package-lock.json | 72 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1a3a5331c9ff2..0cb0d78c91a48 100644 --- a/package-lock.json +++ b/package-lock.json @@ -182,7 +182,7 @@ "@rock-js/platform-ios": "0.12.10", "@rock-js/plugin-metro": "0.12.10", "@rock-js/provider-s3": "0.12.10", - "@sentry/cli": "3.2.0", + "@sentry/cli": "3.2.2", "@sentry/webpack-plugin": "4.6.0", "@storybook/addon-a11y": "10.1.10", "@storybook/addon-docs": "10.1.10", @@ -13989,9 +13989,9 @@ "license": "MIT" }, "node_modules/@sentry/cli": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-3.2.0.tgz", - "integrity": "sha512-YLv/xgttSc8sRhK2xBoxmLS+yQlCW154ey2cXFsFe+yY73lXvQ9nZ7BkHmSc+YUl8y5CKHL+8edQLYV8O8PQMA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-3.2.2.tgz", + "integrity": "sha512-qmjsm9+Bq/3QGTnIfOsJdhq+8LI3imxAPbGNBpRj4R0YFk+b1ry9huRHCLgkMcRFWtPkJmGZwEq2Z7e+02QPLA==", "dev": true, "hasInstallScript": true, "license": "FSL-1.1-MIT", @@ -14008,20 +14008,20 @@ "node": ">= 18" }, "optionalDependencies": { - "@sentry/cli-darwin": "3.2.0", - "@sentry/cli-linux-arm": "3.2.0", - "@sentry/cli-linux-arm64": "3.2.0", - "@sentry/cli-linux-i686": "3.2.0", - "@sentry/cli-linux-x64": "3.2.0", - "@sentry/cli-win32-arm64": "3.2.0", - "@sentry/cli-win32-i686": "3.2.0", - "@sentry/cli-win32-x64": "3.2.0" + "@sentry/cli-darwin": "3.2.2", + "@sentry/cli-linux-arm": "3.2.2", + "@sentry/cli-linux-arm64": "3.2.2", + "@sentry/cli-linux-i686": "3.2.2", + "@sentry/cli-linux-x64": "3.2.2", + "@sentry/cli-win32-arm64": "3.2.2", + "@sentry/cli-win32-i686": "3.2.2", + "@sentry/cli-win32-x64": "3.2.2" } }, "node_modules/@sentry/cli-darwin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-3.2.0.tgz", - "integrity": "sha512-2If2h0P/X9K0UrwlpZYKnxBmIFfa957lAHGe5VmN64v8nEHk8dxcrX+NS9nX9H75eccLGzGMcYk0Zt0KQgQJ3g==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-3.2.2.tgz", + "integrity": "sha512-y1uglMBbo9dYqC92hTQBkuGk7SegLPo1cVwJzX0dhplJoBMuanLMhOMYd1J20qhkDdBhguflCHGf0tOzNTGWhg==", "dev": true, "license": "FSL-1.1-MIT", "optional": true, @@ -14033,9 +14033,9 @@ } }, "node_modules/@sentry/cli-linux-arm": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-3.2.0.tgz", - "integrity": "sha512-NVcGcS9mceivVhi8W6iEnlcK96OlPMzOdM6xkIm+7+J0uXHgUyMyc+rT6p2QG3j8jI5I7qAl7fTHWluSX2lx3g==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-3.2.2.tgz", + "integrity": "sha512-CC7N3hjOgs3cwrW0T9hqirFVUpKO6ASjdd0JT4DQHaAn34pruv8J+OoSnj1jkrT2DHxDkNNZPOFSK05AnHr8wA==", "cpu": [ "arm" ], @@ -14052,9 +14052,9 @@ } }, "node_modules/@sentry/cli-linux-arm64": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-3.2.0.tgz", - "integrity": "sha512-YFpYIfYpXYzpSrIspmPOOPjXbxWp/Ve+F2hSIQb1tSKmcxFgaUm6WfuniYF8EIaLNa8YOLECf0xo78yGXBa+ug==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-3.2.2.tgz", + "integrity": "sha512-SIGJknEQNDw9S/8QPTl8QLVe2IEiTKH3NeeHQ/Q2XWXig1ZebJfm4iTrdu47ypszIfxHeLvQkkVrr8mRKq16xA==", "cpu": [ "arm64" ], @@ -14071,9 +14071,9 @@ } }, "node_modules/@sentry/cli-linux-i686": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-3.2.0.tgz", - "integrity": "sha512-6SOxlF37NqRRKxEuvWryBM7MAgTisq0G6ZQzhI2iuWbcrmlLUDUW2Yssz3gAR01eYJ4jfpqvojSzPRDwqB0K+Q==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-3.2.2.tgz", + "integrity": "sha512-W2hQ2DvIlZI05j2JN/87lfeo51F24zmQOJU6Uz+fZz/mkSvpnjeWxjAvfDNVGlLxp7XSoDbhHfrLBxdIh6jMeg==", "cpu": [ "x86", "ia32" @@ -14091,9 +14091,9 @@ } }, "node_modules/@sentry/cli-linux-x64": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-3.2.0.tgz", - "integrity": "sha512-7LRd0A74ma/1ejlTRPOoBiFiJr4LWkoE6CnA2XwAoYd0r62WUjGHtg6gIC+yElOCwtxXP7I9fOiV2BJIAq2DHw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-3.2.2.tgz", + "integrity": "sha512-4mh3yvOUxO63lq3teexRvalD1mWaRVjpgL2cCMKA2wkB69lcL5nK2gkdzDUKx2y/elluVdvGPPZaqOr1bfNI0w==", "cpu": [ "x64" ], @@ -14110,9 +14110,9 @@ } }, "node_modules/@sentry/cli-win32-arm64": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-3.2.0.tgz", - "integrity": "sha512-uKRi/++gnGepsaGi4goIcC13YGNEHgOUcROkz4L3H8vAR7QxWv2SHy7SCN+2S6c+Q2mOd0DfY35cMW5MzTpb7g==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-3.2.2.tgz", + "integrity": "sha512-TQgfkdJgd8Y/lPzDibqc5Hamg8Hl5rN1sZwX80n4r9Ly46Yzu8Bv6KUhoNL/ktAvw9Aeko6Bx54rwZnzxFZHwg==", "cpu": [ "arm64" ], @@ -14127,9 +14127,9 @@ } }, "node_modules/@sentry/cli-win32-i686": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-3.2.0.tgz", - "integrity": "sha512-/84NEPeFQne2bQWfDZ+3EzioxFR8ojSwExCgVsyTfqa/4PzmaerAGUAxiD+VcJLJTyJEHAjWXTmSZGbYjIgdyQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-3.2.2.tgz", + "integrity": "sha512-vAcnq0SdYuvwIdREgF5APocjW3d9Z17xLwugpaAz8wpOjCeC1iMEFWqbz5k49i4iDkDVNFRMENiVvWVSu1kEnA==", "cpu": [ "x86", "ia32" @@ -14145,9 +14145,9 @@ } }, "node_modules/@sentry/cli-win32-x64": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-3.2.0.tgz", - "integrity": "sha512-N9qGGT91awsh4IMyXrRHH+qIWmv9MJk9tPPAWPvLMWgdlTHT/40WYwvA4tYj80uZXU0TN8ppBWbd3ebDyOjwxA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-3.2.2.tgz", + "integrity": "sha512-xWPTXjSSdmoyG/0ee7A9KSfsScGHCdaXMP6ASt4bMx3yYJO7ziEoZzfJE2M6oglz+woAm0LV9+O/n7g80tixlQ==", "cpu": [ "x64" ], diff --git a/package.json b/package.json index 36b83cf64dc49..00b2d2903685f 100644 --- a/package.json +++ b/package.json @@ -245,7 +245,7 @@ "@rock-js/platform-ios": "0.12.10", "@rock-js/plugin-metro": "0.12.10", "@rock-js/provider-s3": "0.12.10", - "@sentry/cli": "3.2.0", + "@sentry/cli": "3.2.2", "@sentry/webpack-plugin": "4.6.0", "@storybook/addon-a11y": "10.1.10", "@storybook/addon-docs": "10.1.10", From 043541ab84259548e7e610d0fdbb96d276e782b9 Mon Sep 17 00:00:00 2001 From: Tomasz Lesniakiewicz Date: Tue, 24 Feb 2026 14:54:15 +0100 Subject: [PATCH 09/14] generate aab for adhocs --- .github/workflows/buildAndroid.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/buildAndroid.yml b/.github/workflows/buildAndroid.yml index 981b1a77d2216..4bdb36344904d 100644 --- a/.github/workflows/buildAndroid.yml +++ b/.github/workflows/buildAndroid.yml @@ -158,7 +158,7 @@ jobs: FORCE_NATIVE_BUILD: ${{ inputs.force-native-build == 'true' && github.run_id || '' }} with: variant: ${{ inputs.variant }} - aab: ${{ inputs.variant == 'Release' }} + aab: true sign: true re-sign: true ad-hoc: ${{ inputs.variant == 'Adhoc' }} From 272110a366ccb6fe10e06e6a980d26ee5d0f0db0 Mon Sep 17 00:00:00 2001 From: Tomasz Lesniakiewicz Date: Tue, 24 Feb 2026 19:18:12 +0100 Subject: [PATCH 10/14] adjust after mergin main --- .github/workflows/buildAndroid.yml | 10 ++++++++++ .github/workflows/buildIOS.yml | 10 ++++++++++ .github/workflows/deploy.yml | 15 --------------- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/.github/workflows/buildAndroid.yml b/.github/workflows/buildAndroid.yml index bfcd38dc79e89..382edb2e0a5c2 100644 --- a/.github/workflows/buildAndroid.yml +++ b/.github/workflows/buildAndroid.yml @@ -270,3 +270,13 @@ jobs: with: name: ${{ inputs.artifact-prefix }}android-apk-artifact path: Expensify.apk + + - name: Upload Android build to Sentry for size analysis + if: ${{ inputs.variant == 'Release' && steps.collectArtifacts.outputs.HAS_AAB == 'true' }} + continue-on-error: true + timeout-minutes: 5 + run: | + AAB_PATH=$(find /tmp/android-artifacts -name '*.aab' | head -1) + npx sentry-cli build upload "$AAB_PATH" --org expensify --project app --build-configuration Release --log-level debug + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} diff --git a/.github/workflows/buildIOS.yml b/.github/workflows/buildIOS.yml index 36bb585f62426..a205a594df1ea 100644 --- a/.github/workflows/buildIOS.yml +++ b/.github/workflows/buildIOS.yml @@ -273,3 +273,13 @@ jobs: with: name: ${{ inputs.artifact-prefix }}ios-sourcemap-artifact path: Mobile-Expensify/main.jsbundle.map + + - name: Upload iOS build to Sentry for size analysis + if: ${{ inputs.variant == 'Release' }} + continue-on-error: true + timeout-minutes: 5 + run: | + IPA_PATH=$(find .rock/cache/ios/export -name '*.ipa' | head -1) + npx sentry-cli build upload "$IPA_PATH" --org expensify --project app --build-configuration Release --log-level debug + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index d5af3633c3400..ceaee7ac4b8de 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -144,13 +144,6 @@ jobs: run: | op read "op://${{ vars.OP_VAULT }}/android-fastlane-json-key.json/android-fastlane-json-key.json" --force --out-file ./android-fastlane-json-key.json - - name: Upload Android build to Sentry for size analysis - continue-on-error: true - timeout-minutes: 5 - run: npx sentry-cli build upload ${{ env.aabPath }} --org expensify --project app --build-configuration Release --log-level debug - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - - name: Upload Android app to Google Play run: bundle exec fastlane android ${{ vars.ANDROID_UPLOAD_COMMAND }} env: @@ -362,14 +355,6 @@ jobs: run: | op read "op://${{ vars.OP_VAULT }}/ios-fastlane-json-key.json/ios-fastlane-json-key.json" --force --out-file ./ios-fastlane-json-key.json - - name: Upload iOS build to Sentry for size analysis - if: ${{ fromJSON(env.SHOULD_BUILD_APP) }} - continue-on-error: true - timeout-minutes: 5 - run: npx sentry-cli build upload ${{ env.ipaPath }} --org expensify --project app --build-configuration Release --log-level debug - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - - name: Upload release build to TestFlight run: bundle exec fastlane ios upload_testflight_hybrid env: From c3ad3df5b88dd9bb5b6f29c51f39cb1c0f0ff09b Mon Sep 17 00:00:00 2001 From: Tomasz Lesniakiewicz Date: Wed, 25 Feb 2026 16:50:21 +0100 Subject: [PATCH 11/14] add secondary rock build for aab format --- .github/workflows/buildAndroid.yml | 36 +++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/.github/workflows/buildAndroid.yml b/.github/workflows/buildAndroid.yml index 83cca65e01885..59b5492e56538 100644 --- a/.github/workflows/buildAndroid.yml +++ b/.github/workflows/buildAndroid.yml @@ -174,7 +174,7 @@ jobs: FORCE_NATIVE_BUILD: ${{ inputs.force-native-build == 'true' && github.run_id || '' }} with: variant: ${{ inputs.variant }} - aab: true + aab: ${{ inputs.variant == 'Release' }} sign: true re-sign: true ad-hoc: ${{ inputs.variant == 'Adhoc' }} @@ -189,6 +189,35 @@ jobs: custom-identifier: ${{ steps.computeIdentifier.outputs.IDENTIFIER }} validate-elf-alignment: false + - name: Set artifact URL output + id: set-artifact-url + if: ${{ inputs.variant == 'Adhoc' }} + run: echo "ARTIFACT_URL=$ARTIFACT_URL" >> "$GITHUB_OUTPUT" + + - name: Rock Remote Build - Android AAB (Sentry size analysis, AAB format is required) + if: ${{ inputs.variant == 'Adhoc' }} + uses: callstackincubator/android@4cedf4d9b5c167452c96fe67233577e0fde9a025 + env: + GITHUB_TOKEN: ${{ github.token }} + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + IS_HYBRID_APP: true + with: + variant: ${{ inputs.variant }} + aab: true + sign: true + re-sign: true + ad-hoc: false + keystore-file: './upload-key.keystore' + keystore-store-file: 'upload-key.keystore' + keystore-store-password: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEYSTORE_PASSWORD }} + keystore-key-alias: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEYSTORE_ALIAS }} + keystore-key-password: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEY_PASSWORD }} + keystore-path: '../tools/buildtools/upload-key.keystore' + comment-bot: false + rock-build-extra-params: '--extra-params "-PreactNativeArchitectures=arm64-v8a,x86_64 --profile"' + custom-identifier: ${{ steps.computeIdentifier.outputs.IDENTIFIER }}-aab + validate-elf-alignment: false + - name: Upload Android build to Sentry for size analysis id: sentry-upload if: ${{ env.ARTIFACT_PATH != '' && inputs.variant == 'Adhoc' }} @@ -214,11 +243,6 @@ jobs: path: Mobile-Expensify/Android/build/reports/profile/ if-no-files-found: ignore - - name: Set artifact URL output - id: set-artifact-url - if: ${{ inputs.variant == 'Adhoc' }} - run: echo "ARTIFACT_URL=$ARTIFACT_URL" >> "$GITHUB_OUTPUT" - - name: Collect build artifacts id: collectArtifacts run: | From c28d17e2e27b3647abdd986a1b1f430f96ed9b23 Mon Sep 17 00:00:00 2001 From: Tomasz Lesniakiewicz Date: Fri, 27 Feb 2026 16:05:53 +0100 Subject: [PATCH 12/14] unify sentry bundle upload for adhocs and release --- .github/workflows/buildAndroid.yml | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/.github/workflows/buildAndroid.yml b/.github/workflows/buildAndroid.yml index 625d01a760952..41de59316a468 100644 --- a/.github/workflows/buildAndroid.yml +++ b/.github/workflows/buildAndroid.yml @@ -36,7 +36,7 @@ on: description: URL to download the ad-hoc build artifact (adhoc only) value: ${{ jobs.build.outputs.ROCK_ARTIFACT_URL }} SENTRY_URL: - description: URL to Sentry size analysis (adhoc only) + description: URL to Sentry size analysis value: ${{ jobs.build.outputs.SENTRY_URL }} AAB_FILENAME: description: Filename of the AAB artifact (empty if no AAB was produced) @@ -220,11 +220,11 @@ jobs: - name: Upload Android build to Sentry for size analysis id: sentry-upload - if: ${{ env.ARTIFACT_PATH != '' && inputs.variant == 'Adhoc' }} + if: ${{ env.ARTIFACT_PATH != '' }} continue-on-error: true timeout-minutes: 5 run: | - OUTPUT=$(npx sentry-cli build upload "$ARTIFACT_PATH" --org expensify --project app --build-configuration AdHoc --log-level debug 2>&1) + OUTPUT=$(npx sentry-cli build upload "$ARTIFACT_PATH" --org expensify --project app --build-configuration ${{ inputs.variant == 'Adhoc' && 'AdHoc' || 'Release' }} --log-level debug 2>&1) echo "$OUTPUT" SENTRY_URL=$(echo "$OUTPUT" | grep -oE 'https://expensify\.sentry\.io/[^ ]+' | head -1) if [ -n "$SENTRY_URL" ]; then @@ -335,12 +335,3 @@ jobs: name: ${{ inputs.artifact-prefix }}android-apk-artifact path: Expensify.apk - - name: Upload Android build to Sentry for size analysis - if: ${{ inputs.variant == 'Release' && steps.collectArtifacts.outputs.HAS_AAB == 'true' }} - continue-on-error: true - timeout-minutes: 5 - run: | - AAB_PATH=$(find /tmp/android-artifacts -name '*.aab' | head -1) - npx sentry-cli build upload "$AAB_PATH" --org expensify --project app --build-configuration Release --log-level debug - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} From c7cc468f535bf1bb3642c253d43d6c7e3fc8613f Mon Sep 17 00:00:00 2001 From: Tomasz Lesniakiewicz Date: Fri, 27 Feb 2026 16:11:33 +0100 Subject: [PATCH 13/14] unify the sentry bundle upload for IOS --- .github/workflows/buildIOS.yml | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/.github/workflows/buildIOS.yml b/.github/workflows/buildIOS.yml index 5ab8b60f39bc8..a5b6339992abb 100644 --- a/.github/workflows/buildIOS.yml +++ b/.github/workflows/buildIOS.yml @@ -36,7 +36,7 @@ on: description: URL to download the ad-hoc build artifact (adhoc only) value: ${{ jobs.build.outputs.ROCK_ARTIFACT_URL }} SENTRY_URL: - description: URL to Sentry size analysis (adhoc only) + description: URL to Sentry size analysis value: ${{ jobs.build.outputs.SENTRY_URL }} IPA_FILENAME: description: Filename of the IPA artifact produced by the build @@ -241,11 +241,11 @@ jobs: - name: Upload iOS build to Sentry for size analysis id: sentry-upload - if: ${{ env.ARTIFACT_PATH != '' && inputs.variant == 'Adhoc' }} + if: ${{ env.ARTIFACT_PATH != '' }} continue-on-error: true timeout-minutes: 5 run: | - OUTPUT=$(npx sentry-cli build upload "$ARTIFACT_PATH" --org expensify --project app --build-configuration AdHoc --log-level debug 2>&1) + OUTPUT=$(npx sentry-cli build upload "$ARTIFACT_PATH" --org expensify --project app --build-configuration ${{ inputs.variant == 'Adhoc' && 'AdHoc' || 'Release' }} --log-level debug 2>&1) echo "$OUTPUT" SENTRY_URL=$(echo "$OUTPUT" | grep -oE 'https://expensify\.sentry\.io/[^ ]+' | head -1) if [ -n "$SENTRY_URL" ]; then @@ -324,12 +324,3 @@ jobs: name: ${{ inputs.artifact-prefix }}ios-sourcemap-artifact path: Mobile-Expensify/main.jsbundle.map - - name: Upload iOS build to Sentry for size analysis - if: ${{ inputs.variant == 'Release' }} - continue-on-error: true - timeout-minutes: 5 - run: | - IPA_PATH=$(find .rock/cache/ios/export -name '*.ipa' | head -1) - npx sentry-cli build upload "$IPA_PATH" --org expensify --project app --build-configuration Release --log-level debug - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} From 98c00387fe652eeeff15eeaaa6d0f8f6413069c1 Mon Sep 17 00:00:00 2001 From: Tomasz Lesniakiewicz Date: Fri, 27 Feb 2026 18:20:46 +0100 Subject: [PATCH 14/14] build aab for both adhoc and release --- .github/workflows/buildAndroid.yml | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/.github/workflows/buildAndroid.yml b/.github/workflows/buildAndroid.yml index 41de59316a468..f2e8ab0018162 100644 --- a/.github/workflows/buildAndroid.yml +++ b/.github/workflows/buildAndroid.yml @@ -174,7 +174,7 @@ jobs: FORCE_NATIVE_BUILD: ${{ inputs.force-native-build == 'true' && github.run_id || '' }} with: variant: ${{ inputs.variant }} - aab: ${{ inputs.variant == 'Release' }} + aab: true sign: true re-sign: true ad-hoc: ${{ inputs.variant == 'Adhoc' }} @@ -194,30 +194,6 @@ jobs: if: ${{ inputs.variant == 'Adhoc' }} run: echo "ARTIFACT_URL=$ARTIFACT_URL" >> "$GITHUB_OUTPUT" - - name: Rock Remote Build - Android AAB (Sentry size analysis, AAB format is required) - if: ${{ inputs.variant == 'Adhoc' }} - uses: callstackincubator/android@4cedf4d9b5c167452c96fe67233577e0fde9a025 - env: - GITHUB_TOKEN: ${{ github.token }} - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - IS_HYBRID_APP: true - with: - variant: ${{ inputs.variant }} - aab: true - sign: true - re-sign: true - ad-hoc: false - keystore-file: './upload-key.keystore' - keystore-store-file: 'upload-key.keystore' - keystore-store-password: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEYSTORE_PASSWORD }} - keystore-key-alias: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEYSTORE_ALIAS }} - keystore-key-password: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEY_PASSWORD }} - keystore-path: '../tools/buildtools/upload-key.keystore' - comment-bot: false - rock-build-extra-params: '--extra-params "-PreactNativeArchitectures=arm64-v8a,x86_64 --profile"' - custom-identifier: ${{ steps.computeIdentifier.outputs.IDENTIFIER }}-aab - validate-elf-alignment: false - - name: Upload Android build to Sentry for size analysis id: sentry-upload if: ${{ env.ARTIFACT_PATH != '' }} @@ -258,7 +234,7 @@ jobs: echo "APK_FILENAME=Expensify.apk" } >> "$GITHUB_OUTPUT" else - echo "::warning::No AAB file found (expected for remote-cache hits on Adhoc builds)" + echo "::warning::No AAB file found (expected for remote-cache hits)" echo "HAS_AAB=false" >> "$GITHUB_OUTPUT" fi