Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
4c25468
Reapply "Merge pull request #70396 from callstack-internal/set-up-rem…
LukasMod Nov 25, 2025
a47843e
update callstackincubator actions to latest
LukasMod Nov 25, 2025
e03443e
Add Configure AWS Credentials step
LukasMod Nov 26, 2025
cbaf186
restore missing SENTRY_AUTH_TOKEN
LukasMod Nov 26, 2025
0ba21f4
Merge branch 'main' of github.com:callstack-internal/Expensify-App in…
LukasMod Dec 1, 2025
c3a5f4b
add ios testBuild.yaml fix
LukasMod Dec 1, 2025
a3af759
add additional rock logs
LukasMod Dec 1, 2025
dcfc3f4
remove ad-hoc flag
LukasMod Dec 2, 2025
c2d5c5c
point to fork gh actions with additional logs
LukasMod Dec 2, 2025
ccae09d
fix quoting, remove rock logs
LukasMod Dec 2, 2025
28b33aa
Merge branch 'main' of github.com:callstack-internal/Expensify-App in…
LukasMod Dec 2, 2025
a9b913b
remove duplicated android build command
LukasMod Dec 2, 2025
0e5d79e
update rock gh steps logic, add debug step
LukasMod Dec 3, 2025
85a052e
Merge branch 'main' of github.com:callstack-internal/Expensify-App in…
LukasMod Dec 3, 2025
9f58213
strip sensitive params from artifact URLs
LukasMod Dec 3, 2025
a8a1ac0
add adhoc android flag with forked rock
LukasMod Dec 5, 2025
65f149e
add buildAdhocIndexUrl
LukasMod Dec 5, 2025
24927f5
Merge branch 'main' of github.com:callstack-internal/Expensify-App in…
LukasMod Dec 5, 2025
a618655
fix passing output variables
LukasMod Dec 5, 2025
c333cf1
remove unused steps in favor of Rock
LukasMod Dec 10, 2025
0b28373
use updated actions
LukasMod Dec 10, 2025
4e8c089
Merge branch 'main' of github.com:callstack-internal/Expensify-App in…
LukasMod Dec 10, 2025
03a6483
Merge branch 'main' of github.com:callstack-internal/Expensify-App in…
LukasMod Dec 10, 2025
0b14c06
add resign rock logs
LukasMod Dec 10, 2025
5bcd9f0
add android additional logs, explicit compression method
LukasMod Dec 11, 2025
55de29a
update gh android action, use keystore from input in re-sign
LukasMod Dec 11, 2025
bc6be99
add rock patch with zip method
LukasMod Dec 12, 2025
959c3b8
clean up patches
LukasMod Dec 15, 2025
ef0cea8
patch fix
LukasMod Dec 15, 2025
d7d65ee
Merge branch 'main' of github.com:callstack-internal/Expensify-App in…
LukasMod Dec 15, 2025
aa1e8fd
update gh action
LukasMod Dec 15, 2025
e24c9e2
remove MET-INF deletion
LukasMod Dec 15, 2025
3aa2013
Merge branch 'main' of github.com:callstack-internal/Expensify-App in…
LukasMod Dec 15, 2025
3b5ddae
remove fork from rock-remote-build-android
LukasMod Dec 16, 2025
d0ddee0
Merge branch 'main' of github.com:callstack-internal/Expensify-App in…
LukasMod Dec 16, 2025
1c57618
remove fork from rock-remote-build-ios
LukasMod Dec 17, 2025
623abd5
Merge branch 'main' of github.com:callstack-internal/Expensify-App in…
LukasMod Dec 18, 2025
60af0c1
update rock to 0.11.13, remove patches
LukasMod Dec 18, 2025
b492f03
use forked rock with feat/adhoc-android
LukasMod Dec 18, 2025
6bfe2bc
update lock
LukasMod Dec 18, 2025
515b41a
use forked rock from specific commit
LukasMod Dec 18, 2025
5cf9351
use new usePrebuiltRNCore rock config
LukasMod Dec 18, 2025
e2c26f6
update rock to 0.11.14
LukasMod Dec 18, 2025
6630d68
bump rock to 0.12.0
LukasMod Dec 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .github/workflows/remote-build-ios.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,6 @@ jobs:
env:
GITHUB_TOKEN: ${{ github.token }}
IS_HYBRID_APP: ${{ matrix.is_hybrid_build }}
# Forces React Native to build from source to include our custom patches
RCT_USE_RN_DEP: 0
RCT_USE_PREBUILT_RNCORE: 0
with:
destination: simulator
scheme: ${{ matrix.scheme }}
Expand Down
179 changes: 84 additions & 95 deletions .github/workflows/testBuild.yml
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ jobs:
env:
PULL_REQUEST_NUMBER: ${{ needs.prep.outputs.APP_PR_NUMBER }}
outputs:
S3_APK_PATH: ${{ steps.exportAndroidS3Path.outputs.S3_APK_PATH }}
ROCK_ANDROID_ADHOC_INDEX_URL: ${{ steps.set-artifact-url.outputs.ARTIFACT_URL }}
steps:
- name: Checkout
# v4
Expand Down Expand Up @@ -336,23 +336,6 @@ jobs:
sed -i 's/ENVIRONMENT=staging/ENVIRONMENT=adhoc/' .env.adhoc
echo "APP_PULL_REQUEST_NUMBER=$PULL_REQUEST_NUMBER" >> .env.adhoc

- name: Get Java version
id: get-java-version
uses: ./.github/actions/composite/getJavaVersion

- name: Setup Java
# v4
uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12
with:
distribution: oracle
java-version: ${{ steps.get-java-version.outputs.version }}

- name: Setup Ruby
# v1.229.0
uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252
with:
bundler-cache: true

- name: Setup 1Password CLI and certificates
uses: Expensify/GitHub-Actions/setup-certificate-1p@main
with:
Expand Down Expand Up @@ -381,17 +364,6 @@ jobs:
ANDROID_UPLOAD_KEYSTORE_ALIAS: op://${{ vars.OP_VAULT }}/Repository-Secrets/ANDROID_UPLOAD_KEYSTORE_ALIAS
ANDROID_UPLOAD_KEY_PASSWORD: op://${{ vars.OP_VAULT }}/Repository-Secrets/ANDROID_UPLOAD_KEY_PASSWORD

- name: Build Android app
id: build
env:
ANDROID_UPLOAD_KEYSTORE_PASSWORD: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEYSTORE_PASSWORD }}
ANDROID_UPLOAD_KEYSTORE_ALIAS: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEYSTORE_ALIAS }}
ANDROID_UPLOAD_KEY_PASSWORD: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEY_PASSWORD }}
GITHUB_ACTOR: ${{ github.actor }}
GITHUB_TOKEN: ${{ github.token }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
run: bundle exec fastlane android build_adhoc_hybrid

- name: Configure AWS Credentials
# v4
uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722
Expand All @@ -400,19 +372,31 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1

- name: Upload Android AdHoc build to S3
run: bundle exec fastlane android upload_s3
- name: Rock Remote Build - Android
id: rock-remote-build-android
uses: callstackincubator/android@0bbc1b7c2e1a8be1ecb4d6c744c211869823fd65
env:
S3_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY_ID }}
S3_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
S3_BUCKET: ad-hoc-expensify-cash
S3_REGION: us-east-1

- name: Export S3 path
id: exportAndroidS3Path
run: |
# $s3APKPath is set from within the Fastfile, android upload_s3 lane
echo "S3_APK_PATH=$s3APKPath" >> "$GITHUB_OUTPUT"
GITHUB_TOKEN: ${{ github.token }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
IS_HYBRID_APP: true
with:
variant: 'Adhoc'
sign: true
re-sign: true
ad-hoc: true
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 }}
# Specify the path (relative to the Android source directory) where the keystore should be placed.
keystore-path: '../tools/buildtools/upload-key.keystore'
comment-bot: false
rock-build-extra-params: '--extra-params -PreactNativeArchitectures=arm64-v8a,x86_64'

- name: Set artifact URL output
id: set-artifact-url
run: echo "ARTIFACT_URL=$ARTIFACT_URL" >> "$GITHUB_OUTPUT"

iosHybrid:
name: Build and deploy iOS for testing
Expand All @@ -423,7 +407,7 @@ jobs:
PULL_REQUEST_NUMBER: ${{ needs.prep.outputs.APP_PR_NUMBER }}
runs-on: macos-15-xlarge
outputs:
IOS_PATH: ${{ steps.export-ios-path.outputs.IOS_PATH }}
ROCK_IOS_ADHOC_INDEX_URL: ${{ steps.set-artifact-url.outputs.ARTIFACT_URL }}
steps:
- name: Checkout
# v4
Expand Down Expand Up @@ -456,35 +440,6 @@ jobs:
sed -i '' 's/ENVIRONMENT=staging/ENVIRONMENT=adhoc/' .env.adhoc
echo "PULL_REQUEST_NUMBER=$PULL_REQUEST_NUMBER" >> .env.adhoc

- name: Setup Ruby
# v1.229.0
uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252
with:
bundler-cache: true

- name: Install New Expensify Gems
run: bundle install

- name: Cache Pod dependencies
# v4
uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57
id: pods-cache
with:
path: Mobile-Expensify/iOS/Pods
key: ${{ runner.os }}-pods-cache-${{ hashFiles('Mobile-Expensify/iOS/Podfile.lock', 'firebase.json') }}

- name: Compare Podfile.lock and Manifest.lock
id: compare-podfile-and-manifest
run: echo "IS_PODFILE_SAME_AS_MANIFEST=${{ hashFiles('Mobile-Expensify/iOS/Podfile.lock') == hashFiles('Mobile-Expensify/iOS/Manifest.lock') }}" >> "$GITHUB_OUTPUT"

- name: Install cocoapods
uses: nick-fields/retry@3f757583fb1b1f940bc8ef4bf4734c8dc02a5847
if: steps.pods-cache.outputs.cache-hit != 'true' || steps.compare-podfile-and-manifest.outputs.IS_PODFILE_SAME_AS_MANIFEST != 'true' || steps.setup-node.outputs.cache-hit != 'true'
with:
timeout_minutes: 10
max_attempts: 5
command: npm run pod-install

- name: Setup 1Password CLI and certificates
uses: Expensify/GitHub-Actions/setup-certificate-1p@main
with:
Expand All @@ -500,10 +455,27 @@ jobs:
op read "op://${{ vars.OP_VAULT }}/OldApp_AdHoc_Notification_Service/OldApp_AdHoc_Notification_Service.mobileprovision" --force --out-file ./OldApp_AdHoc_Notification_Service.mobileprovision
op read "op://${{ vars.OP_VAULT }}/New Expensify Distribution Certificate/Certificates.p12" --force --out-file ./Certificates.p12

- name: Build AdHoc app
run: bundle exec fastlane ios build_adhoc_hybrid
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
- name: Create ExportOptions.plist
run: |
cat > Mobile-Expensify/iOS/ExportOptions.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>ad-hoc</string>
<key>provisioningProfiles</key>
<dict>
<key>com.expensify.expensifylite.adhoc</key>
<string>(OldApp) AdHoc</string>
<key>com.expensify.expensifylite.adhoc.SmartScanExtension</key>
<string>(OldApp) AdHoc: Share Extension</string>
<key>com.expensify.expensifylite.adhoc.NotificationServiceExtension</key>
<string>(OldApp) AdHoc: Notification Service</string>
</dict>
</dict>
</plist>
EOF

- name: Configure AWS Credentials
# v4
Expand All @@ -513,23 +485,40 @@ jobs:
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1

- name: Upload AdHoc build to S3
run: bundle exec fastlane ios upload_s3
- name: Rock Remote Build - iOS
id: rock-remote-build-ios
uses: callstackincubator/ios@8dcef6cc275e0cf3299f5a97cde5ebd635c887d7
env:
S3_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY_ID }}
S3_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
S3_BUCKET: ad-hoc-expensify-cash
S3_REGION: us-east-1

- name: Export iOS path
id: export-ios-path
run: |
content_ios="$(cat ./ios_paths.json)"
content_ios="${content_ios//'%'/'%25'}"
content_ios="${content_ios//$'\n'/'%0A'}"
content_ios="${content_ios//$'\r'/'%0D'}"
ios_path=$(echo "$content_ios" | jq -r '.html_path')
echo "IOS_PATH=$ios_path" >> "$GITHUB_OUTPUT"
GITHUB_TOKEN: ${{ github.token }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
IS_HYBRID_APP: true
with:
destination: device
re-sign: true
ad-hoc: true
scheme: 'Expensify AdHoc'
configuration: 'AdHoc'
certificate-file: './Certificates.p12'
provisioning-profiles: |
[
{
"name": "(OldApp) AdHoc",
"file": "./OldApp_AdHoc.mobileprovision"
},
{
"name": "(OldApp) AdHoc: Share Extension",
"file": "./OldApp_AdHoc_Share_Extension.mobileprovision"
},
{
"name": "(OldApp) AdHoc: Notification Service",
"file": "./OldApp_AdHoc_Notification_Service.mobileprovision"
}
]
comment-bot: false

- name: Set artifact URL output
id: set-artifact-url
run: echo "ARTIFACT_URL=$ARTIFACT_URL" >> "$GITHUB_OUTPUT"

postGithubComment:
runs-on: ubuntu-latest
Expand Down Expand Up @@ -559,9 +548,9 @@ jobs:
DESKTOP: ${{ needs.desktop.result }}
IOS: ${{ needs.iosHybrid.result }}
WEB: ${{ needs.web.result }}
ANDROID_LINK: ${{ needs.androidHybrid.outputs.S3_APK_PATH }}
ANDROID_LINK: ${{ needs.androidHybrid.outputs.ROCK_ANDROID_ADHOC_INDEX_URL }}
DESKTOP_LINK: https://ad-hoc-expensify-cash.s3.amazonaws.com/desktop/${{ needs.prep.outputs.APP_PR_NUMBER }}/NewExpensify.dmg
IOS_LINK: ${{ needs.iosHybrid.outputs.IOS_PATH }}
IOS_LINK: ${{ needs.iosHybrid.outputs.ROCK_IOS_ADHOC_INDEX_URL }}
WEB_LINK: https://${{ needs.prep.outputs.APP_PR_NUMBER }}.pr-testing.expensify.com

- name: Publish links to apps for download on Expensify/Mobile-Expensify PR
Expand All @@ -573,5 +562,5 @@ jobs:
GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }}
ANDROID: ${{ needs.androidHybrid.result }}
IOS: ${{ needs.iosHybrid.result }}
ANDROID_LINK: ${{ needs.androidHybrid.outputs.S3_APK_PATH }}
IOS_LINK: ${{ needs.iosHybrid.outputs.IOS_PATH }}
ANDROID_LINK: ${{ needs.androidHybrid.outputs.ROCK_ANDROID_ADHOC_INDEX_URL }}
IOS_LINK: ${{ needs.iosHybrid.outputs.ROCK_IOS_ADHOC_INDEX_URL }}
Loading
Loading