From d2cfa70b008cbb11eebd59f148ed5c3db6c8e7ad Mon Sep 17 00:00:00 2001 From: sergemuhundu Date: Wed, 30 Oct 2024 16:34:20 +0100 Subject: [PATCH 1/2] deploy pre-release of mobile apps --- apps/mobile/app.json | 94 ++++++++++++++++++++++++++++++++++++++++++++ apps/mobile/eas.json | 16 ++++++++ 2 files changed, 110 insertions(+) create mode 100644 apps/mobile/app.json diff --git a/apps/mobile/app.json b/apps/mobile/app.json new file mode 100644 index 000000000..8fd353adc --- /dev/null +++ b/apps/mobile/app.json @@ -0,0 +1,94 @@ +{ + "name": "ever-cloc-mobile", + "displayName": "Ever Cloc Mobile", + "expo": { + "name": "Ever Cloc Mobile", + "slug": "ever-cloc-mobile", + "version": "0.1.0", + "orientation": "portrait", + "icon": "./assets/images/ever-teams-logo.png", + "splash": { + "image": "./assets/images/splash-ever-teams.png", + "resizeMode": "cover", + "backgroundColor": "#ffffff" + }, + "owner": "everco", + "updates": { + "fallbackToCacheTimeout": 0, + "url": "https://u.expo.dev/540994c7-edcb-4c17-8d00-849fa3b4759a" + }, + "jsEngine": "hermes", + "assetBundlePatterns": ["**/*"], + "plugins": [ + [ + "expo-media-library", + { + "photosPermission": "Allow $(PRODUCT_NAME) to access your photos.", + "savePhotosPermission": "Allow $(PRODUCT_NAME) to save photos.", + "isAccessMediaLocationEnabled": true + } + ], + "sentry-expo", + [ + "expo-build-properties", + { + "android": { + "enableProguardInReleaseBuilds": true, + "extraProguardRules": "-keep public class com.horcrux.svg.** {*;}", + "allowBackup": false, + "minSdkVersion": 23, + "targetSdkVersion": 34 + } + } + ] + ], + "android": { + "icon": "./assets/images/app-icon-android-legacy-ever-teams.png", + "package": "ever.cloc", + "adaptiveIcon": { + "foregroundImage": "./assets/images/app-icon-android-adaptive-foreground-ever.png", + "backgroundImage": "./assets/images/app-icon-android-adaptive-background.png" + }, + "splash": { + "image": "./assets/images/splash-ever-teams.png", + "resizeMode": "cover", + "backgroundColor": "#ffffff" + }, + "permissions": [ + "android.permission.READ_EXTERNAL_STORAGE", + "android.permission.WRITE_EXTERNAL_STORAGE", + "android.permission.ACCESS_MEDIA_LOCATION" + ] + }, + "ios": { + "icon": "./assets/images/app-icon-ios-ever-teams.png", + "supportsTablet": true, + "bundleIdentifier": "ever.cloc", + "splash": { + "image": "./assets/images/splash-ever-teams.png", + "tabletImage": "./assets/images/splash-logo-ever-teams-ios-tablet.png", + "resizeMode": "cover", + "backgroundColor": "#ffffff" + }, + "infoPlist": { + "NSCameraUsageDescription": "This app uses the camera to scan barcodes on event tickets.", + "NSPhotoLibraryUsageDescription": "Allow $(PRODUCT_NAME) to access your photos.", + "NSPhotoLibraryAddUsageDescription": "Allow $(PRODUCT_NAME) to save photos." + } + }, + "web": { + "favicon": "./assets/images/app-icon-web-favicon.png", + "splash": { + "image": "./assets/images/splash-logo-web-ever-teams.png", + "resizeMode": "contain", + "backgroundColor": "#ffffff" + } + }, + "extra": { + "eas": { + "projectId": "540994c7-edcb-4c17-8d00-849fa3b4759a" + } + }, + "runtimeVersion": "exposdk:48.0.0" + } +} diff --git a/apps/mobile/eas.json b/apps/mobile/eas.json index 866d70a6f..eef5c22f4 100644 --- a/apps/mobile/eas.json +++ b/apps/mobile/eas.json @@ -13,6 +13,9 @@ }, "production": { "autoIncrement": true + }, + "internal": { + "distribution": "internal" } }, "submit": { @@ -28,6 +31,19 @@ "ascApiKeyId": "APPSTORE_API_KEY_ID_PLACEHOLDER", "ascApiKeyPath": "./AuthKey_8A3H79GTF8.p8" } + }, + "internal": { + "android": { + "track": "internal", + "releaseStatus": "draft", + "changesNotSentForReview": false + }, + "ios": { + "ascAppId": "APPLE_ID_PLACEHOLDER", + "ascApiKeyIssuerId": "APPSTORE_ISSUER_ID_PLACEHOLDER", + "ascApiKeyId": "APPSTORE_API_KEY_ID_PLACEHOLDER", + "ascApiKeyPath": "./AuthKey_8A3H79GTF8.p8" + } } } } From b0ef8fbe90da942189d85e08505a38ff3b3b120d Mon Sep 17 00:00:00 2001 From: sergemuhundu Date: Wed, 30 Oct 2024 19:45:33 +0100 Subject: [PATCH 2/2] Update stage workflow --- .github/workflows/mobile.apps.android.yml | 4 +- .github/workflows/mobile.apps.ios.yml | 6 +- .../workflows/mobile.apps.stage.android.yml | 94 +++++++++++++++++++ .github/workflows/mobile.apps.stage.ios.yml | 89 ++++++++++++++++++ .github/workflows/release.stage.yml | 2 +- apps/mobile/app.json | 94 ------------------- 6 files changed, 189 insertions(+), 100 deletions(-) create mode 100644 .github/workflows/mobile.apps.stage.android.yml create mode 100644 .github/workflows/mobile.apps.stage.ios.yml delete mode 100644 apps/mobile/app.json diff --git a/.github/workflows/mobile.apps.android.yml b/.github/workflows/mobile.apps.android.yml index 4269fba01..9a5dfea93 100644 --- a/.github/workflows/mobile.apps.android.yml +++ b/.github/workflows/mobile.apps.android.yml @@ -74,7 +74,7 @@ jobs: EXPO_PROJECT_IOS_BUNDLE_IDENTIFIER: ${{ secrets.EXPO_PROJECT_IOS_BUNDLE_IDENTIFIER }} - name: Build on EAS - run: cd apps/mobile && eas build --platform android --non-interactive + run: cd apps/mobile && eas build --profile production --platform android --non-interactive - name: Publish update run: cd apps/mobile && eas update --auto --platform android --non-interactive @@ -91,4 +91,4 @@ jobs: project_id: 'ever-teams-399720' - name: Upload to Play Store Console - run: cd apps/mobile && eas submit --platform android --latest --non-interactive + run: cd apps/mobile && eas submit --profile production --platform android --latest --non-interactive diff --git a/.github/workflows/mobile.apps.ios.yml b/.github/workflows/mobile.apps.ios.yml index 579a36f12..421783069 100644 --- a/.github/workflows/mobile.apps.ios.yml +++ b/.github/workflows/mobile.apps.ios.yml @@ -80,10 +80,10 @@ jobs: EXPO_PROJECT_IOS_BUNDLE_IDENTIFIER: ${{ secrets.EXPO_PROJECT_IOS_BUNDLE_IDENTIFIER }} - name: Build on EAS - run: cd apps/mobile && eas build --platform ios --non-interactive + run: cd apps/mobile && eas build --profile production --platform ios --non-interactive - name: Publish update - run: cd apps/mobile && eas update --auto --platform ios --non-interactive + run: cd apps/mobile && eas update --auto --profile production --platform ios --non-interactive - name: Upload App build to App store - run: cd apps/mobile && eas submit --platform ios --latest --non-interactive + run: cd apps/mobile && eas submit --profile production --platform ios --latest --non-interactive diff --git a/.github/workflows/mobile.apps.stage.android.yml b/.github/workflows/mobile.apps.stage.android.yml new file mode 100644 index 000000000..03c6e7f3f --- /dev/null +++ b/.github/workflows/mobile.apps.stage.android.yml @@ -0,0 +1,94 @@ +name: Mobile Build, Deploy and Publish Apps Android +on: + push: + branches: + - apps-stage + paths: + - '.github/workflows/mobile.apps.stage.yml' + - 'apps/mobile/**' + - 'package.json' + - 'yarn.lock' + +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + +jobs: + deploy: + runs-on: ubuntu-latest + + environment: prod + + permissions: + contents: read + + steps: + - name: Check for EXPO_TOKEN + run: | + if [ -z "${{ secrets.EXPO_TOKEN }}" ]; then + echo "You must provide an EXPO_TOKEN secret linked to this project's Expo account in this repo's secrets. Learn more: https://docs.expo.dev/eas-update/github-actions" + exit 1 + fi + + - uses: actions/checkout@v4 + + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: '20.11.1' + cache: 'yarn' + + - name: Setup EAS + uses: expo/expo-github-action@v8 + with: + eas-version: latest + token: ${{ secrets.EXPO_TOKEN }} + + - name: Decode Google Credentials + run: | + DECODED_GOOGLE_CREDENTIALS=$(echo '${{ secrets.GOOGLE_CREDENTIALS }}' | base64 --decode) + echo "DECODED_GOOGLE_CREDENTIALS=$DECODED_GOOGLE_CREDENTIALS" >> $GITHUB_ENV + echo "::add-mask::$DECODED_GOOGLE_CREDENTIALS" + ESCAPED_GOOGLE_CREDENTIALS=$(echo "$DECODED_GOOGLE_CREDENTIALS" | sed ':a;N;$!ba;s/\n/\\n/g' | sed 's/"/\\"/g') + ESCAPED_GOOGLE_CREDENTIALS=$(echo $ESCAPED_GOOGLE_CREDENTIALS | sed 's/\\n/\\\\n/g') + echo "ESCAPED_GOOGLE_CREDENTIALS=$ESCAPED_GOOGLE_CREDENTIALS" >> $GITHUB_ENV + echo "::add-mask::$ESCAPED_GOOGLE_CREDENTIALS" + + - name: Install Packages + run: | + yarn install --frozen-lockfile + + - name: Build Mobile + run: | + yarn build:mobile + + - name: Generate app.json and replace placeholders + run: | + cd apps/mobile && yarn config:mobile + env: + EXPO_PROJECT_SLUG: ${{ secrets.EXPO_PROJECT_SLUG }} + EXPO_PROJECT_NAME: ${{ secrets.EXPO_PROJECT_NAME }} + EXPO_PROJECT_OWNER: ${{ secrets.EXPO_PROJECT_OWNER }} + EXPO_PROJECT_ID: ${{ secrets.EXPO_PROJECT_ID }} + EXPO_PROJECT_PACKAGE_NAME: ${{ secrets.EXPO_PROJECT_PACKAGE_NAME }} + EXPO_PROJECT_IOS_BUNDLE_IDENTIFIER: ${{ secrets.EXPO_PROJECT_IOS_BUNDLE_IDENTIFIER }} + + - name: Build on EAS + run: cd apps/mobile && eas build --profile internal --platform android --non-interactive + + - name: Publish update + run: cd apps/mobile && eas update --auto --profile internal --platform android --non-interactive + + - name: 'Authenticate to Google Cloud' + uses: 'google-github-actions/auth@v1' + with: + credentials_json: ${{ env.DECODED_GOOGLE_CREDENTIALS }} + + # Install gcloud, `setup-gcloud` automatically picks up authentication from `auth`. + - name: 'Set up Cloud SDK' + uses: 'google-github-actions/setup-gcloud@v1' + with: + project_id: 'ever-teams-399720' + + - name: Upload to Play Store Console + run: cd apps/mobile && eas submit --platform android --profile internal --latest --non-interactive diff --git a/.github/workflows/mobile.apps.stage.ios.yml b/.github/workflows/mobile.apps.stage.ios.yml new file mode 100644 index 000000000..31e345f3e --- /dev/null +++ b/.github/workflows/mobile.apps.stage.ios.yml @@ -0,0 +1,89 @@ +name: Mobile Build, Deploy and Publish Apps iOS +on: + push: + branches: + - apps-stage + paths: + - '.github/workflows/mobile.apps.stage.yml' + - 'apps/mobile/**' + - 'package.json' + - 'yarn.lock' + +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + +jobs: + deploy: + runs-on: ubuntu-latest + + environment: prod + + permissions: + contents: read + + steps: + - name: Check for EXPO_TOKEN + run: | + if [ -z "${{ secrets.EXPO_TOKEN }}" ]; then + echo "You must provide an EXPO_TOKEN secret linked to this project's Expo account in this repo's secrets. Learn more: https://docs.expo.dev/eas-update/github-actions" + exit 1 + fi + + - uses: actions/checkout@v4 + + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: '20.11.1' + cache: 'yarn' + + - name: Setup EAS + uses: expo/expo-github-action@v8 + with: + eas-version: latest + token: ${{ secrets.EXPO_TOKEN }} + + - name: Set Apple Store Credentials + run: | + echo "APPLE_ID=${{ secrets.APPLE_ID }}" >> $GITHUB_ENV + echo "APPSTORE_ISSUER_ID=${{ secrets.APPSTORE_ISSUER_ID }}" >> $GITHUB_ENV + echo "APPSTORE_API_KEY_ID=${{ secrets.APPSTORE_API_KEY_ID }}" >> $GITHUB_ENV + + - name: Replace Secrets in eas.json + run: | + sed -i 's/APPLE_ID_PLACEHOLDER/${{ secrets.APPLE_ID }}/' ./apps/mobile/eas.json + sed -i 's/APPSTORE_ISSUER_ID_PLACEHOLDER/${{ secrets.APPSTORE_ISSUER_ID }}/' ./apps/mobile/eas.json + sed -i 's/APPSTORE_API_KEY_ID_PLACEHOLDER/${{ secrets.APPSTORE_API_KEY_ID }}/' ./apps/mobile/eas.json + + - name: Create Apple API Key File + run: | + echo "${{ secrets.APPSTORE_API_PRIVATE_KEY }}" > ./apps/mobile/AuthKey_R9QZ5LP8NK.p8 + + - name: Install Packages + run: | + yarn install --frozen-lockfile + + - name: Build Mobile + run: | + yarn build:mobile + + - name: Generate app.json and replace placeholders + run: | + cd apps/mobile && yarn config:mobile + env: + EXPO_PROJECT_SLUG: ${{ secrets.EXPO_PROJECT_SLUG }} + EXPO_PROJECT_NAME: ${{ secrets.EXPO_PROJECT_NAME }} + EXPO_PROJECT_OWNER: ${{ secrets.EXPO_PROJECT_OWNER }} + EXPO_PROJECT_ID: ${{ secrets.EXPO_PROJECT_ID }} + EXPO_PROJECT_PACKAGE_NAME: ${{ secrets.EXPO_PROJECT_PACKAGE_NAME }} + EXPO_PROJECT_IOS_BUNDLE_IDENTIFIER: ${{ secrets.EXPO_PROJECT_IOS_BUNDLE_IDENTIFIER }} + + - name: Build on EAS + run: cd apps/mobile && eas build --profile internal --platform ios --non-interactive + + - name: Publish update + run: cd apps/mobile && eas update --auto --profile internal --platform ios --non-interactive + + - name: Upload App build to App store + run: cd apps/mobile && eas submit --profile internal --platform ios --latest --non-interactive diff --git a/.github/workflows/release.stage.yml b/.github/workflows/release.stage.yml index 8538e8c89..239573145 100644 --- a/.github/workflows/release.stage.yml +++ b/.github/workflows/release.stage.yml @@ -21,7 +21,7 @@ jobs: id: tag_version with: github_token: ${{ secrets.GITHUB_TOKEN }} - release_branches: apps,master,main,develop,stage + release_branches: apps,master,main,develop,stage,apps-stage pre_release_branches: something_to_possible_use_later - name: Create a GitHub release diff --git a/apps/mobile/app.json b/apps/mobile/app.json deleted file mode 100644 index 8fd353adc..000000000 --- a/apps/mobile/app.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "name": "ever-cloc-mobile", - "displayName": "Ever Cloc Mobile", - "expo": { - "name": "Ever Cloc Mobile", - "slug": "ever-cloc-mobile", - "version": "0.1.0", - "orientation": "portrait", - "icon": "./assets/images/ever-teams-logo.png", - "splash": { - "image": "./assets/images/splash-ever-teams.png", - "resizeMode": "cover", - "backgroundColor": "#ffffff" - }, - "owner": "everco", - "updates": { - "fallbackToCacheTimeout": 0, - "url": "https://u.expo.dev/540994c7-edcb-4c17-8d00-849fa3b4759a" - }, - "jsEngine": "hermes", - "assetBundlePatterns": ["**/*"], - "plugins": [ - [ - "expo-media-library", - { - "photosPermission": "Allow $(PRODUCT_NAME) to access your photos.", - "savePhotosPermission": "Allow $(PRODUCT_NAME) to save photos.", - "isAccessMediaLocationEnabled": true - } - ], - "sentry-expo", - [ - "expo-build-properties", - { - "android": { - "enableProguardInReleaseBuilds": true, - "extraProguardRules": "-keep public class com.horcrux.svg.** {*;}", - "allowBackup": false, - "minSdkVersion": 23, - "targetSdkVersion": 34 - } - } - ] - ], - "android": { - "icon": "./assets/images/app-icon-android-legacy-ever-teams.png", - "package": "ever.cloc", - "adaptiveIcon": { - "foregroundImage": "./assets/images/app-icon-android-adaptive-foreground-ever.png", - "backgroundImage": "./assets/images/app-icon-android-adaptive-background.png" - }, - "splash": { - "image": "./assets/images/splash-ever-teams.png", - "resizeMode": "cover", - "backgroundColor": "#ffffff" - }, - "permissions": [ - "android.permission.READ_EXTERNAL_STORAGE", - "android.permission.WRITE_EXTERNAL_STORAGE", - "android.permission.ACCESS_MEDIA_LOCATION" - ] - }, - "ios": { - "icon": "./assets/images/app-icon-ios-ever-teams.png", - "supportsTablet": true, - "bundleIdentifier": "ever.cloc", - "splash": { - "image": "./assets/images/splash-ever-teams.png", - "tabletImage": "./assets/images/splash-logo-ever-teams-ios-tablet.png", - "resizeMode": "cover", - "backgroundColor": "#ffffff" - }, - "infoPlist": { - "NSCameraUsageDescription": "This app uses the camera to scan barcodes on event tickets.", - "NSPhotoLibraryUsageDescription": "Allow $(PRODUCT_NAME) to access your photos.", - "NSPhotoLibraryAddUsageDescription": "Allow $(PRODUCT_NAME) to save photos." - } - }, - "web": { - "favicon": "./assets/images/app-icon-web-favicon.png", - "splash": { - "image": "./assets/images/splash-logo-web-ever-teams.png", - "resizeMode": "contain", - "backgroundColor": "#ffffff" - } - }, - "extra": { - "eas": { - "projectId": "540994c7-edcb-4c17-8d00-849fa3b4759a" - } - }, - "runtimeVersion": "exposdk:48.0.0" - } -}