62
62
java-version : ' 17'
63
63
64
64
- name : Setup Ruby
65
- uses : ruby/setup-ruby@a05e47355e80e57b9a67566a813648fa67d92011
65
+ uses : ruby/setup-ruby@v1.187.0
66
66
with :
67
67
ruby-version : ' 2.7'
68
68
bundler-cache : true
@@ -80,38 +80,42 @@ jobs:
80
80
- name : Set version in ENV
81
81
run : echo "VERSION_CODE=$(grep -o 'versionCode\s\+[0-9]\+' android/app/build.gradle | awk '{ print $2 }')" >> "$GITHUB_ENV"
82
82
83
- - name : Run Fastlane beta
84
- if : ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
85
- run : bundle exec fastlane android beta
83
+ - name : Run Fastlane
84
+ run : bundle exec fastlane android ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) && 'production' || 'beta' }}
86
85
env :
86
+ RUBYOPT : ' -rostruct'
87
87
MYAPP_UPLOAD_STORE_PASSWORD : ${{ secrets.MYAPP_UPLOAD_STORE_PASSWORD }}
88
88
MYAPP_UPLOAD_KEY_PASSWORD : ${{ secrets.MYAPP_UPLOAD_KEY_PASSWORD }}
89
-
90
- - name : Run Fastlane production
91
- if : ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
92
- run : bundle exec fastlane android production
93
- env :
94
89
VERSION : ${{ env.VERSION_CODE }}
95
90
96
91
- name : Archive Android sourcemaps
97
- uses : actions/upload-artifact@v3
92
+ uses : actions/upload-artifact@v4
98
93
with :
99
94
name : android-sourcemap-${{ github.ref_name }}
100
95
path : android/app/build/generated/sourcemaps/react/productionRelease/index.android.bundle.map
101
96
102
- - name : Upload Android version to GitHub artifacts
97
+ - name : Upload Android build to GitHub artifacts
103
98
if : ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
104
- uses : actions/upload-artifact@v3
99
+ uses : actions/upload-artifact@v4
105
100
with :
106
101
name : app-production-release.aab
107
102
path : android/app/build/outputs/bundle/productionRelease/app-production-release.aab
108
103
109
- - name : Upload Android version to Browser Stack
104
+ - name : Upload Android build to Browser Stack
110
105
if : ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
111
106
run : curl -u "$BROWSERSTACK" -X POST "https://api-cloud.browserstack.com/app-live/upload" -F "file=@./android/app/build/outputs/bundle/productionRelease/app-production-release.aab"
112
107
env :
113
108
BROWSERSTACK : ${{ secrets.BROWSERSTACK }}
114
109
110
+ - name : Upload Android build to GitHub Release
111
+ if : ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
112
+ run : |
113
+ RUN_ID="$(gh run list --workflow platformDeploy.yml --event push --branch ${{ github.event.release.tag_name }} --json databaseId --jq '.[0].databaseId')"
114
+ gh run download "$RUN_ID" --name app-production-release.aab
115
+ gh release upload ${{ github.event.release.tag_name }} app-production-release.aab
116
+ env :
117
+ GITHUB_TOKEN : ${{ github.token }}
118
+
115
119
- name : Warn deployers if Android production deploy failed
116
120
if : ${{ failure() && fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
117
121
uses : 8398a7/action-slack@v3
@@ -147,9 +151,13 @@ jobs:
147
151
env :
148
152
DEVELOPER_ID_SECRET_PASSPHRASE : ${{ secrets.DEVELOPER_ID_SECRET_PASSPHRASE }}
149
153
150
- - name : Build production desktop app
151
- if : ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
152
- run : npm run desktop-build
154
+ - name : Build desktop app
155
+ run : |
156
+ if [[ ${{ env.SHOULD_DEPLOY_PRODUCTION }} == 'true' ]]; then
157
+ npm run desktop-build
158
+ else
159
+ npm run desktop-build-staging
160
+ fi
153
161
env :
154
162
CSC_LINK : ${{ secrets.CSC_LINK }}
155
163
CSC_KEY_PASSWORD : ${{ secrets.CSC_KEY_PASSWORD }}
@@ -159,18 +167,17 @@ jobs:
159
167
AWS_SECRET_ACCESS_KEY : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
160
168
GCP_GEOLOCATION_API_KEY : $${{ secrets.GCP_GEOLOCATION_API_KEY_PRODUCTION }}
161
169
170
+ - name : Upload desktop build to GitHub Workflow
171
+ uses : actions/upload-artifact@v4
172
+ with :
173
+ name : NewExpensify.dmg
174
+ path : desktop-build/NewExpensify.dmg
162
175
163
- - name : Build staging desktop app
164
- if : ${{ ! fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
165
- run : npm run desktop-build-staging
176
+ - name : Upload desktop build to GitHub Release
177
+ if : ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
178
+ run : gh release upload ${{ github.event.release.tag_name }} desktop-build/NewExpensify.dmg
166
179
env :
167
- CSC_LINK : ${{ secrets.CSC_LINK }}
168
- CSC_KEY_PASSWORD : ${{ secrets.CSC_KEY_PASSWORD }}
169
- APPLE_ID : ${{ secrets.APPLE_ID }}
170
- APPLE_APP_SPECIFIC_PASSWORD : ${{ secrets.APPLE_ID_PASSWORD }}
171
- AWS_ACCESS_KEY_ID : ${{ secrets.AWS_ACCESS_KEY_ID }}
172
- AWS_SECRET_ACCESS_KEY : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
173
- GCP_GEOLOCATION_API_KEY : $${{ secrets.GCP_GEOLOCATION_API_KEY_STAGING }}
180
+ GITHUB_TOKEN : ${{ github.token }}
174
181
175
182
iOS :
176
183
name : Build and deploy iOS
@@ -191,7 +198,7 @@ jobs:
191
198
uses : ./.github/actions/composite/setupNode
192
199
193
200
- name : Setup Ruby
194
- uses : ruby/setup-ruby@a05e47355e80e57b9a67566a813648fa67d92011
201
+ uses : ruby/setup-ruby@v1.187.0
195
202
with :
196
203
ruby-version : ' 2.7'
197
204
bundler-cache : true
@@ -236,43 +243,45 @@ jobs:
236
243
env :
237
244
LARGE_SECRET_PASSPHRASE : ${{ secrets.LARGE_SECRET_PASSPHRASE }}
238
245
246
+ - name : Set iOS version in ENV
247
+ run : echo "IOS_VERSION=$(echo '${{ github.event.release.tag_name }}' | tr '-' '.')" >> "$GITHUB_ENV"
248
+
239
249
- name : Run Fastlane
240
- if : ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
241
- run : bundle exec fastlane ios beta
250
+ run : bundle exec fastlane ios ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) && 'production' || 'beta' }}
242
251
env :
243
252
APPLE_CONTACT_EMAIL : ${{ secrets.APPLE_CONTACT_EMAIL }}
244
253
APPLE_CONTACT_PHONE : ${{ secrets.APPLE_CONTACT_PHONE }}
245
254
APPLE_DEMO_EMAIL : ${{ secrets.APPLE_DEMO_EMAIL }}
246
255
APPLE_DEMO_PASSWORD : ${{ secrets.APPLE_DEMO_PASSWORD }}
256
+ VERSION : ${{ env.IOS_VERSION }}
247
257
248
258
- name : Archive iOS sourcemaps
249
- uses : actions/upload-artifact@v3
259
+ uses : actions/upload-artifact@v4
250
260
with :
251
261
name : ios-sourcemap-${{ github.ref_name }}
252
262
path : main.jsbundle.map
253
263
254
- - name : Upload iOS version to GitHub artifacts
264
+ - name : Upload iOS build to GitHub artifacts
255
265
if : ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
256
- uses : actions/upload-artifact@v3
266
+ uses : actions/upload-artifact@v4
257
267
with :
258
268
name : New Expensify.ipa
259
269
path : /Users/runner/work/App/App/New Expensify.ipa
260
270
261
- - name : Upload iOS version to Browser Stack
271
+ - name : Upload iOS build to Browser Stack
262
272
if : ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
263
273
run : curl -u "$BROWSERSTACK" -X POST "https://api-cloud.browserstack.com/app-live/upload" -F "file=@/Users/runner/work/App/App/New Expensify.ipa"
264
274
env :
265
275
BROWSERSTACK : ${{ secrets.BROWSERSTACK }}
266
276
267
- - name : Set iOS version in ENV
268
- if : ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
269
- run : echo "IOS_VERSION=$(echo '${{ github.event.release.tag_name }}' | tr '-' '.')" >> "$GITHUB_ENV"
270
-
271
- - name : Run Fastlane for App Store release
277
+ - name : Upload iOS build to GitHub Release
272
278
if : ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
273
- run : bundle exec fastlane ios production
279
+ run : |
280
+ RUN_ID="$(gh run list --workflow platformDeploy.yml --event push --branch ${{ github.event.release.tag_name }} --json databaseId --jq '.[0].databaseId')"
281
+ gh run download "$RUN_ID" --name 'New Expensify.ipa'
282
+ gh release upload ${{ github.event.release.tag_name }} 'New Expensify.ipa'
274
283
env :
275
- VERSION : ${{ env.IOS_VERSION }}
284
+ GITHUB_TOKEN : ${{ github.token }}
276
285
277
286
- name : Warn deployers if iOS production deploy failed
278
287
if : ${{ failure() && fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
@@ -314,41 +323,33 @@ jobs:
314
323
aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
315
324
aws-region : us-east-1
316
325
317
- - name : Build web for production
318
- if : ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
319
- run : npm run build
320
-
321
- - name : Build web for staging
322
- if : ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
323
- run : npm run build-staging
324
-
325
- - name : Build storybook docs for production
326
- if : ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
327
- run : npm run storybook-build
328
- continue-on-error : true
326
+ - name : Build web
327
+ run : |
328
+ if [[ ${{ env.SHOULD_DEPLOY_PRODUCTION }} == 'true' ]]; then
329
+ npm run build
330
+ else
331
+ npm run build-staging
332
+ fi
329
333
330
- - name : Build storybook docs for staging
331
- if : ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
332
- run : npm run storybook-build-staging
334
+ - name : Build storybook docs
333
335
continue-on-error : true
336
+ run : |
337
+ if [[ ${{ env.SHOULD_DEPLOY_PRODUCTION }} == 'true' ]]; then
338
+ npm run storybook-build
339
+ else
340
+ npm run storybook-build-staging
341
+ fi
334
342
335
- - name : Deploy production to S3
336
- if : ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
337
- run : aws s3 cp --recursive --acl public-read "$GITHUB_WORKSPACE"/dist s3://expensify-cash/ && aws s3 cp --acl public-read --content-type 'application/json' --metadata-directive REPLACE s3://expensify-cash/.well-known/apple-app-site-association s3://expensify-cash/.well-known/apple-app-site-association && aws s3 cp --acl public-read --content-type 'application/json' --metadata-directive REPLACE s3://expensify-cash/.well-known/apple-app-site-association s3://expensify-cash/apple-app-site-association
338
-
339
- - name : Deploy staging to S3
340
- if : ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
341
- run : aws s3 cp --recursive --acl public-read "$GITHUB_WORKSPACE"/dist s3://staging-expensify-cash/ && aws s3 cp --acl public-read --content-type 'application/json' --metadata-directive REPLACE s3://staging-expensify-cash/.well-known/apple-app-site-association s3://staging-expensify-cash/.well-known/apple-app-site-association && aws s3 cp --acl public-read --content-type 'application/json' --metadata-directive REPLACE s3://staging-expensify-cash/.well-known/apple-app-site-association s3://staging-expensify-cash/apple-app-site-association
342
-
343
- - name : Purge production Cloudflare cache
344
- if : ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
345
- run : /home/runner/.local/bin/cli4 --verbose --delete hosts=["new.expensify.com"] /zones/:9ee042e6cfc7fd45e74aa7d2f78d617b/purge_cache
343
+ - name : Deploy to S3
344
+ run : |
345
+ aws s3 cp --recursive --acl public-read "$GITHUB_WORKSPACE"/dist ${{ env.S3_URL }}/
346
+ aws s3 cp --acl public-read --content-type 'application/json' --metadata-directive REPLACE ${{ env.S3_URL }}/.well-known/apple-app-site-association ${{ env.S3_URL }}/.well-known/apple-app-site-association
347
+ aws s3 cp --acl public-read --content-type 'application/json' --metadata-directive REPLACE ${{ env.S3_URL }}/.well-known/apple-app-site-association ${{env.S3_URL }}/apple-app-site-association
346
348
env :
347
- CF_API_KEY : ${{ secrets.CLOUDFLARE_TOKEN }}
349
+ S3_URL : s3:// ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) && '' || 'staging-' }}expensify-cash
348
350
349
- - name : Purge staging Cloudflare cache
350
- if : ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }}
351
- run : /home/runner/.local/bin/cli4 --verbose --delete hosts=["staging.new.expensify.com"] /zones/:9ee042e6cfc7fd45e74aa7d2f78d617b/purge_cache
351
+ - name : Purge Cloudflare cache
352
+ run : /home/runner/.local/bin/cli4 --verbose --delete hosts=["${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) && '' || 'staging.' }}new.expensify.com"] /zones/:9ee042e6cfc7fd45e74aa7d2f78d617b/purge_cache
352
353
env :
353
354
CF_API_KEY : ${{ secrets.CLOUDFLARE_TOKEN }}
354
355
0 commit comments