@@ -142,7 +142,7 @@ jobs:
142142 uses : bitwarden/gh-actions/get-keyvault-secrets@main
143143 with :
144144 keyvault : gh-android
145- secrets : " UPLOAD-KEYSTORE-PASSWORD,UPLOAD-BETA-KEYSTORE-PASSWORD,UPLOAD-BETA-KEY-PASSWORD,PLAY-KEYSTORE-PASSWORD,PLAY-BETA-KEYSTORE-PASSWORD,PLAY-BETA-KEY-PASSWORD"
145+ secrets : " UPLOAD-KEYSTORE-PASSWORD,UPLOAD-BETA-KEYSTORE-PASSWORD,UPLOAD-BETA-KEY-PASSWORD,PLAY-KEYSTORE-PASSWORD,PLAY-BETA-KEYSTORE-PASSWORD,PLAY-BETA-KEY-PASSWORD,BWS-ACCESS-TOKEN "
146146
147147 - name : Retrieve secrets
148148 env :
@@ -260,6 +260,48 @@ jobs:
260260 keyAlias:bitwarden \
261261 keyPassword:${{ env.PLAY-KEYSTORE-PASSWORD }}
262262
263+ - name : Retrieve test data
264+ if : ${{ (matrix.variant == 'prod') && (matrix.artifact == 'apk') }}
265+ uses : bitwarden/sm-action@14f92f1d294ae3c2b6a3845d389cd2c318b0dfd8 # v2.2.0
266+ with :
267+ access_token : ${{ steps.get-kv-secrets.outputs.BWS-ACCESS-TOKEN }}
268+ secrets : |
269+ 63e93f73-5118-4a62-9db8-b3160176aa8a > TEST_ACCOUNT_CREDS
270+
271+ - name : Configure .json test data file
272+ run : printf %s '${{ env.TEST_ACCOUNT_CREDS }}' > app/src/androidTest/assets/TestData.json
273+
274+ - name : Build test APK (espresso)
275+ if : ${{ (matrix.variant == 'prod') && (matrix.artifact == 'apk') }}
276+ env :
277+ _TEST_APK_PATH : app/build/outputs/apk/androidTest/standard/release/com.x8bit.bitwarden-standard-release-androidTest.apk
278+ _TEST_APK_SIGNED_PATH : app/build/outputs/apk/androidTest/standard/release/com.x8bit.bitwarden-test.apk
279+ run : |
280+ ./gradlew :app:assembleStandardReleaseAndroidTest
281+ # bundle exec fastlane assembleTestApk \
282+ # storeFile:app_play-keystore.jks \
283+ # storePassword:${{ env.PLAY-KEYSTORE-PASSWORD }} \
284+ # keyAlias:bitwarden \
285+ # keyPassword:${{ env.PLAY-KEYSTORE-PASSWORD }}
286+ # mv $_TEST_APK_PATH $_TEST_APK_SIGNED_PATH
287+
288+ # TODO: test if bundle exec fastlane assembleTestApk works and replace this step
289+ - name : Sign and rename test APK
290+ if : ${{ (matrix.variant == 'prod') && (matrix.artifact == 'apk') }}
291+ env :
292+ _TEST_APK_PATH : app/build/outputs/apk/androidTest/standard/release/com.x8bit.bitwarden-standard-release-androidTest.apk
293+ _TEST_APK_SIGNED_PATH : app/build/outputs/apk/androidTest/standard/release/com.x8bit.bitwarden-test.apk
294+ _PLAY_KEYSTORE_PASSWORD : ${{ steps.get-kv-secrets.outputs.PLAY-KEYSTORE-PASSWORD }}
295+ _PLAY_KEYSTORE_ALIAS : ${{ steps.get-kv-secrets.outputs.PLAY-KEYSTORE-ALIAS }}
296+ run : |
297+ $ANDROID_SDK_ROOT/build-tools/34.0.0/apksigner sign \
298+ --ks keystores/app_play-keystore.jks \
299+ --ks-key-alias bitwarden \
300+ --ks-pass pass:$_PLAY_KEYSTORE_PASSWORD \
301+ --key-pass pass:$_PLAY_KEYSTORE_PASSWORD \
302+ $_TEST_APK_PATH
303+ mv $_TEST_APK_PATH $_TEST_APK_SIGNED_PATH
304+
263305 - name : Generate beta Play Store APK
264306 if : ${{ (matrix.variant == 'prod') && (matrix.artifact == 'apk') }}
265307 env :
@@ -301,6 +343,14 @@ jobs:
301343 path : app/build/outputs/apk/standard/release/com.x8bit.bitwarden.apk
302344 if-no-files-found : error
303345
346+ - name : Upload test .apk artifact
347+ if : ${{ (matrix.variant == 'prod') && (matrix.artifact == 'apk') }}
348+ uses : actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
349+ with :
350+ name : com.x8bit.bitwarden-test.apk
351+ path : app/build/outputs/apk/androidTest/standard/release/com.x8bit.bitwarden-test.apk
352+ if-no-files-found : error
353+
304354 - name : Upload beta .apk artifact
305355 if : ${{ (matrix.variant == 'prod') && (matrix.artifact == 'apk') }}
306356 uses : actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
@@ -421,6 +471,14 @@ jobs:
421471 bundle exec fastlane publishProdToPlayStore
422472 bundle exec fastlane publishBetaToPlayStore
423473
474+ test-device :
475+ name : Test device
476+ needs : publish_playstore
477+ uses : bitwarden/android/.github/workflows/test-device.yml@QA-1126b/adding-native-sanity-test # TODO replace branch with main before merging
478+ with :
479+ apk_filename : com.x8bit.bitwarden.apk
480+ test_apk_filename : com.x8bit.bitwarden-test.apk
481+
424482 publish_fdroid :
425483 name : Publish F-Droid artifacts
426484 needs :
@@ -602,144 +660,3 @@ jobs:
602660 bundle exec fastlane distributeReleaseFDroidToFirebase \
603661 actionUrl:${{ env.GITHUB_ACTION_RUN_URL }} \
604662 service_credentials_file:${{ env.APP_FDROID_FIREBASE_CREDS_PATH }}
605-
606- test_on_device :
607- name : Running sanity check on a real device
608- needs : publish_playstore
609- runs-on : ubuntu-24.04
610- if : github.ref == 'refs/heads/main'
611- env :
612- _JAVA_VERSION : 17
613- _GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
614-
615- steps :
616- - name : Check out repo
617- uses : actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
618-
619- - name : Validate Gradle wrapper
620- uses : gradle/actions/wrapper-validation@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1
621-
622- - name : Cache Gradle files
623- uses : actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
624- with :
625- path : |
626- ~/.gradle/caches
627- ~/.gradle/wrapper
628- key : ${{ runner.os }}-gradle-v2-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', '**/libs.versions.toml') }}
629- restore-keys : |
630- ${{ runner.os }}-gradle-v2-
631-
632- - name : Cache build output
633- uses : actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
634- with :
635- path : ${{ github.workspace }}/build-cache
636- key : ${{ runner.os }}-build-cache-${{ github.sha }}
637- restore-keys : |
638- ${{ runner.os }}-build-
639-
640- - name : Configure JDK
641- uses : actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1
642- with :
643- distribution : " temurin"
644- java-version : ${{ env._JAVA_VERSION }}
645-
646- - name : Configure Ruby
647- uses : ruby/setup-ruby@ca041f971d66735f3e5ff1e21cc13e2d51e7e535 # v1.233.0
648- with :
649- bundler-cache : true
650-
651- - name : Install Fastlane
652- run : |
653- gem install bundler:2.2.27
654- bundle config path vendor/bundle
655- bundle install --jobs 4 --retry 3
656-
657- - name : Install saucectl
658- run : |
659- npm i -g saucectl
660-
661- - name : Retrieve secrets
662- env :
663- ACCOUNT_NAME : bitwardenci
664- CONTAINER_NAME : mobile
665- run : |
666- mkdir -p ${{ github.workspace }}/secrets
667- mkdir -p ${{ github.workspace }}/app/src/standardRelease
668-
669- az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \
670- --name app_play-keystore.jks --file ${{ github.workspace }}/keystores/app_play-keystore.jks --output none
671- az storage blob download --account-name $ACCOUNT_NAME --container-name $CONTAINER_NAME \
672- --name google-services.json --file ${{ github.workspace }}/app/src/standardRelease/google-services.json --output none
673-
674- - name : Log in to Azure
675- uses : bitwarden/gh-actions/azure-login@main
676- with :
677- subscription_id : ${{ secrets.AZURE_SUBSCRIPTION_ID }}
678- tenant_id : ${{ secrets.AZURE_TENANT_ID }}
679- client_id : ${{ secrets.AZURE_CLIENT_ID }}
680-
681- - name : Get E2E test secrets from Azure
682- uses : bitwarden/gh-actions/get-keyvault-secrets@main
683- with :
684- keyvault : gh-android
685- secrets : " BWS-ACCESS-TOKEN, SAUCE-LABS-USERNAME, SAUCE-LABS-ACCESS-KEY"
686- id : get-e2e-secrets
687-
688- - name : Log out from Azure
689- uses : bitwarden/gh-actions/azure-logout@main
690-
691- - name : Retrieve test data
692- uses : bitwarden/sm-action@14f92f1d294ae3c2b6a3845d389cd2c318b0dfd8 # v2.2.0
693- with :
694- access_token : ${{ steps.get-e2e-secrets.outputs.BWS-ACCESS-TOKEN }}
695- secrets : |
696- 63e93f73-5118-4a62-9db8-b3160176aa8a > TEST_ACCOUNT_CREDS
697-
698- - name : Configure .json test data file
699- run : printf %s '${{ env.TEST_ACCOUNT_CREDS }}' > app/src/androidTest/assets/TestData.json
700-
701- - name : Build test APK (espresso)
702- run : |
703- ./gradlew :app:assembleStandardReleaseAndroidTest
704-
705- - name : Download release APK artifact
706- uses : actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
707- with :
708- name : com.x8bit.bitwarden.apk
709- path : app/build/outputs/apk/standard/release/
710-
711- - name : Signing test APK
712- run : |
713- $ANDROID_SDK_ROOT/build-tools/34.0.0/apksigner sign \
714- --ks keystores/app_play-keystore.jks \
715- --ks-key-alias bitwarden \
716- --ks-pass pass:${{ secrets.PLAY_KEYSTORE_PASSWORD }} \
717- --key-pass pass:${{ secrets.PLAY_KEYSTORE_PASSWORD }} \
718- app/build/outputs/apk/androidTest/standard/release/com.x8bit.bitwarden-standard-release-androidTest.apk
719-
720- - name : Upload APK to SauceLabs storage
721- run : |
722- saucectl storage upload app/build/outputs/apk/standard/release/com.x8bit.bitwarden.apk
723- env :
724- SAUCE_USERNAME : ${{ steps.get-e2e-secrets.outputs.SAUCE-LABS-USERNAME }}
725- SAUCE_ACCESS_KEY : ${{ steps.get-e2e-secrets.outputs.SAUCE-LABS-ACCESS-KEY }}
726-
727- - name : Upload test APK to SauceLabs storage
728- run : |
729- saucectl storage upload app/build/outputs/apk/androidTest/standard/release/com.x8bit.bitwarden-standard-release-androidTest.apk
730- env :
731- SAUCE_USERNAME : ${{ steps.get-e2e-secrets.outputs.SAUCE-LABS-USERNAME }}
732- SAUCE_ACCESS_KEY : ${{ steps.get-e2e-secrets.outputs.SAUCE-LABS-ACCESS-KEY }}
733-
734- - name : Run tests on SauceLabs
735- run : saucectl run --config .sauce/config.yml
736- env :
737- SAUCE_USERNAME : ${{ steps.get-e2e-secrets.outputs.SAUCE-LABS-USERNAME }}
738- SAUCE_ACCESS_KEY : ${{ steps.get-e2e-secrets.outputs.SAUCE-LABS-ACCESS-KEY }}
739-
740- - name : Upload SauceLabs test report
741- if : always()
742- uses : actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
743- with :
744- name : saucectl-report
745- path : saucectl-report.xml
0 commit comments