44 workflow_dispatch :
55 inputs :
66 # If not specified, only build iOS and Android apps from the main branch of Expensify/App
7- APP_PULL_REQUEST_NUMBER :
8- description : Expensify/App PR number for correct placement of apps. Default to main.
7+ APP_PULL_REQUEST_URL :
8+ description : The Expensify/App pull request URL (e.g., https://github.com/Expensify/App/pull/12345). Defaults to main.
99 required : false
1010 default : ' '
11- # Pull Request number from Mobile-Expensify repo for correct placement of OD app. It will take precedence over MOBILE-EXPENSIFY from App's PR description if both are specified. If nothing is specified defaults to Mobile-Expensify's main
12- MOBILE_EXPENSIFY_PULL_REQUEST_NUMBER :
13- description : Expensify/Mobile-Expensify PR number . Defaults to main. Overrides MOBILE-EXPENSIFY set in App's PR description.
11+ # Pull Request URL from Mobile-Expensify repo for correct placement of OD app. It will take precedence over MOBILE-EXPENSIFY from App's PR description if both are specified. If nothing is specified defaults to Mobile-Expensify's main
12+ MOBILE_EXPENSIFY_PULL_REQUEST_URL :
13+ description : The Expensify/Mobile-Expensify pull request URL . Defaults to main. Overrides MOBILE-EXPENSIFY set in App's PR description.
1414 required : false
1515 default : ' '
1616 REVIEWED_CODE :
3535 type : boolean
3636 default : true
3737
38- env :
39- # This variable is needed for fastlane to construct correct path
40- PULL_REQUEST_NUMBER : ${{ inputs.APP_PULL_REQUEST_NUMBER || github.event.number }}
41-
4238jobs :
4339 prep :
4440 runs-on : ubuntu-latest
4541 outputs :
4642 APP_REF : ${{ steps.getHeadRef.outputs.REF || 'main' }}
43+ APP_PR_NUMBER : ${{ steps.extractAppPRNumber.outputs.PR_NUMBER }}
44+ MOBILE_PR_NUMBER : ${{ steps.extractMobilePRNumber.outputs.PR_NUMBER }}
4745 steps :
4846 - name : Checkout
4947 # v4
@@ -61,15 +59,37 @@ jobs:
6159 echo "::error::🕵️♀️ Please carefully review the pull request before running a test build to ensure it does not contain any malicious code"
6260 exit 1
6361
62+ - name : Extract App PR number from URL
63+ id : extractAppPRNumber
64+ if : ${{ inputs.APP_PULL_REQUEST_URL != '' }}
65+ run : |
66+ PR_NUMBER=$(echo '${{ inputs.APP_PULL_REQUEST_URL }}' | sed -E 's|.*/pull/([0-9]+).*|\1|')
67+ if ! [[ "$PR_NUMBER" =~ ^[0-9]+$ ]]; then
68+ echo "::error::❌ Could not extract PR number from URL. Please provide a valid GitHub PR URL (e.g., https://github.com/Expensify/App/pull/12345)"
69+ exit 1
70+ fi
71+ echo "PR_NUMBER=$PR_NUMBER" >> "$GITHUB_OUTPUT"
72+
73+ - name : Extract Mobile-Expensify PR number from URL
74+ id : extractMobilePRNumber
75+ if : ${{ inputs.MOBILE_EXPENSIFY_PULL_REQUEST_URL != '' }}
76+ run : |
77+ PR_NUMBER=$(echo '${{ inputs.MOBILE_EXPENSIFY_PULL_REQUEST_URL }}' | sed -E 's|.*/pull/([0-9]+).*|\1|')
78+ if ! [[ "$PR_NUMBER" =~ ^[0-9]+$ ]]; then
79+ echo "::error::❌ Could not extract PR number from URL. Please provide a valid GitHub PR URL (e.g., https://github.com/Expensify/Mobile-Expensify/pull/12345)"
80+ exit 1
81+ fi
82+ echo "PR_NUMBER=$PR_NUMBER" >> "$GITHUB_OUTPUT"
83+
6484 - name : Check if App pull request number is correct
6585 if : ${{ github.event_name == 'workflow_dispatch' }}
6686 id : getHeadRef
6787 run : |
6888 set -e
69- if [ -z "${{ inputs.APP_PULL_REQUEST_NUMBER }}" ]; then
89+ if [ -z "${{ steps.extractAppPRNumber.outputs.PR_NUMBER }}" ]; then
7090 echo "REF=" >> "$GITHUB_OUTPUT"
7191 else
72- echo "REF=$(gh pr view ${{ inputs.APP_PULL_REQUEST_NUMBER }} --json headRefOid --jq '.headRefOid')" >> "$GITHUB_OUTPUT"
92+ echo "REF=$(gh pr view ${{ steps.extractAppPRNumber.outputs.PR_NUMBER }} --json headRefOid --jq '.headRefOid')" >> "$GITHUB_OUTPUT"
7393 fi
7494 env :
7595 GITHUB_TOKEN : ${{ github.token }}
@@ -88,14 +108,14 @@ jobs:
88108 github-token : ${{ github.token }}
89109 result-encoding : string
90110 script : |
91- if ('${{ inputs.MOBILE_EXPENSIFY_PULL_REQUEST_NUMBER }}') return '${{ inputs.MOBILE_EXPENSIFY_PULL_REQUEST_NUMBER }}';
111+ if ('${{ needs.prep.outputs.MOBILE_PR_NUMBER }}') return '${{ needs.prep.outputs.MOBILE_PR_NUMBER }}';
92112
93- if (!'${{ inputs.APP_PULL_REQUEST_NUMBER }}') return '';
113+ if (!'${{ needs.prep.outputs.APP_PR_NUMBER }}') return '';
94114
95115 const pullRequest = await github.rest.pulls.get({
96116 owner: context.repo.owner,
97117 repo: context.repo.repo,
98- pull_number: '${{ inputs.APP_PULL_REQUEST_NUMBER }}',
118+ pull_number: '${{ needs.prep.outputs.APP_PR_NUMBER }}',
99119 });
100120
101121 const body = pullRequest.data.body;
@@ -106,7 +126,7 @@ jobs:
106126
107127 getMobileExpensifyRef :
108128 runs-on : ubuntu-latest
109- needs : [getMobileExpensifyPR]
129+ needs : [prep, getMobileExpensifyPR]
110130 outputs :
111131 MOBILE_EXPENSIFY_REF : ${{ steps.getHeadRef.outputs.REF || 'main' }}
112132 steps :
@@ -118,11 +138,11 @@ jobs:
118138 id : getHeadRef
119139 run : |
120140 set -e
121- if [[ -z "${{ inputs.MOBILE_EXPENSIFY_PULL_REQUEST_NUMBER }}" && -z "${{ needs.getMobileExpensifyPR.outputs.MOBILE_EXPENSIFY_PR }}" ]]; then
141+ if [[ -z "${{ needs.prep.outputs.MOBILE_PR_NUMBER }}" && -z "${{ needs.getMobileExpensifyPR.outputs.MOBILE_EXPENSIFY_PR }}" ]]; then
122142 echo "REF=" >> "$GITHUB_OUTPUT"
123143 else
124- echo "PR=${{ inputs.MOBILE_EXPENSIFY_PULL_REQUEST_NUMBER || needs.getMobileExpensifyPR.outputs.MOBILE_EXPENSIFY_PR }}" >> "$GITHUB_OUTPUT"
125- echo "REF=$(gh pr view ${{ inputs.MOBILE_EXPENSIFY_PULL_REQUEST_NUMBER || needs.getMobileExpensifyPR.outputs.MOBILE_EXPENSIFY_PR }} -R Expensify/Mobile-Expensify --json headRefOid --jq '.headRefOid')" >> "$GITHUB_OUTPUT"
144+ echo "PR=${{ needs.prep.outputs.MOBILE_PR_NUMBER || needs.getMobileExpensifyPR.outputs.MOBILE_EXPENSIFY_PR }}" >> "$GITHUB_OUTPUT"
145+ echo "REF=$(gh pr view ${{ needs.prep.outputs.MOBILE_PR_NUMBER || needs.getMobileExpensifyPR.outputs.MOBILE_EXPENSIFY_PR }} -R Expensify/Mobile-Expensify --json headRefOid --jq '.headRefOid')" >> "$GITHUB_OUTPUT"
126146 fi
127147 env :
128148 GITHUB_TOKEN : ${{ secrets.OS_BOTIFY_TOKEN }}
@@ -133,7 +153,7 @@ jobs:
133153 needs : [prep, getMobileExpensifyPR, getMobileExpensifyRef]
134154 steps :
135155 - name : Add build start comment to Expensify/App PR
136- if : ${{ inputs.APP_PULL_REQUEST_NUMBER != ''}}
156+ if : ${{ needs.prep.outputs.APP_PR_NUMBER != '' }}
137157 # v7
138158 uses : actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea
139159 with :
@@ -143,7 +163,7 @@ jobs:
143163 github.rest.issues.createComment({
144164 owner: context.repo.owner,
145165 repo: context.repo.repo,
146- issue_number: ${{ inputs.APP_PULL_REQUEST_NUMBER }},
166+ issue_number: ${{ needs.prep.outputs.APP_PR_NUMBER }},
147167 body: `🚧 @${{ github.actor }} has triggered a test Expensify/App build. You can view the [workflow run here](${workflowURL}).`
148168 });
149169
@@ -164,9 +184,11 @@ jobs:
164184
165185 desktop :
166186 name : Build and deploy Desktop for testing
167- if : ${{ inputs.DESKTOP && inputs.APP_PULL_REQUEST_NUMBER }}
187+ if : ${{ inputs.DESKTOP && needs.prep.outputs.APP_PR_NUMBER }}
168188 needs : [prep]
169189 runs-on : macos-14-large
190+ env :
191+ PULL_REQUEST_NUMBER : ${{ needs.prep.outputs.APP_PR_NUMBER }}
170192 steps :
171193 - name : Checkout
172194 # v4
@@ -231,9 +253,11 @@ jobs:
231253
232254 web :
233255 name : Build and deploy Web
234- if : ${{ inputs.WEB && inputs.APP_PULL_REQUEST_NUMBER }}
256+ if : ${{ inputs.WEB && needs.prep.outputs.APP_PR_NUMBER }}
235257 needs : [prep]
236258 runs-on : ubuntu-latest-xl
259+ env :
260+ PULL_REQUEST_NUMBER : ${{ needs.prep.outputs.APP_PR_NUMBER }}
237261 steps :
238262 - name : Checkout
239263 # v4
@@ -271,6 +295,8 @@ jobs:
271295 if : ${{ inputs.ANDROID }}
272296 needs : [prep, getMobileExpensifyPR, getMobileExpensifyRef]
273297 runs-on : ubuntu-latest-xl
298+ env :
299+ PULL_REQUEST_NUMBER : ${{ needs.prep.outputs.APP_PR_NUMBER }}
274300 outputs :
275301 S3_APK_PATH : ${{ steps.exportAndroidS3Path.outputs.S3_APK_PATH }}
276302 steps :
@@ -393,6 +419,7 @@ jobs:
393419 needs : [prep, getMobileExpensifyPR, getMobileExpensifyRef]
394420 env :
395421 DEVELOPER_DIR : /Applications/Xcode_26.0.app/Contents/Developer
422+ PULL_REQUEST_NUMBER : ${{ needs.prep.outputs.APP_PR_NUMBER }}
396423 runs-on : macos-15-xlarge
397424 outputs :
398425 IOS_PATH : ${{ steps.export-ios-path.outputs.IOS_PATH }}
@@ -519,21 +546,21 @@ jobs:
519546 uses : actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e
520547
521548 - name : Publish links to apps for download on Expensify/App PR
522- if : ${{ inputs.APP_PULL_REQUEST_NUMBER || (!inputs.APP_PULL_REQUEST_NUMBER && !needs.getMobileExpensifyPR.outputs.MOBILE_EXPENSIFY_PR) }}
549+ if : ${{ needs.prep.outputs.APP_PR_NUMBER || (!needs.prep.outputs.APP_PR_NUMBER && !needs.getMobileExpensifyPR.outputs.MOBILE_EXPENSIFY_PR) }}
523550 uses : ./.github/actions/javascript/postTestBuildComment
524551 with :
525552 REPO : App
526- APP_PR_NUMBER : ${{ inputs.APP_PULL_REQUEST_NUMBER }}
553+ APP_PR_NUMBER : ${{ needs.prep.outputs.APP_PR_NUMBER }}
527554 MOBILE_EXPENSIFY_PR_NUMBER : ${{ needs.getMobileExpensifyPR.outputs.MOBILE_EXPENSIFY_PR }}
528555 GITHUB_TOKEN : ${{ github.token }}
529556 ANDROID : ${{ needs.androidHybrid.result }}
530557 DESKTOP : ${{ needs.desktop.result }}
531558 IOS : ${{ needs.iosHybrid.result }}
532559 WEB : ${{ needs.web.result }}
533560 ANDROID_LINK : ${{ needs.androidHybrid.outputs.S3_APK_PATH }}
534- DESKTOP_LINK : https://ad-hoc-expensify-cash.s3.amazonaws.com/desktop/${{ inputs.APP_PULL_REQUEST_NUMBER }}/NewExpensify.dmg
561+ DESKTOP_LINK : https://ad-hoc-expensify-cash.s3.amazonaws.com/desktop/${{ needs.prep.outputs.APP_PR_NUMBER }}/NewExpensify.dmg
535562 IOS_LINK : ${{ needs.iosHybrid.outputs.IOS_PATH }}
536- WEB_LINK : https://${{ inputs.APP_PULL_REQUEST_NUMBER }}.pr-testing.expensify.com
563+ WEB_LINK : https://${{ needs.prep.outputs.APP_PR_NUMBER }}.pr-testing.expensify.com
537564
538565 - name : Publish links to apps for download on Expensify/Mobile-Expensify PR
539566 if : ${{ needs.getMobileExpensifyPR.outputs.MOBILE_EXPENSIFY_PR }}
0 commit comments