diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 06f3bdb3..81524c8c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -80,7 +80,7 @@ jobs: node-version-file: "./.tool-versions" - run: make sdk-build - run: make react-native-npm-ci - - run: make react-native-build-unsigned-apk + - run: make react-native-build-unsigned-aab test_capacitor_ios: runs-on: macos-14 @@ -108,7 +108,7 @@ jobs: - run: make sdk-build - run: make capacitor-npm-ci - run: make capacitor-build-js - - run: make capacitor-build-unsigned-apk + - run: make capacitor-build-unsigned-aab react_native_ios: if: ${{ github.repository == 'authgear/authgear-sdk-js' }} @@ -161,28 +161,24 @@ jobs: bundler-cache: true - run: make sdk-build - run: make react-native-npm-ci - - run: make react-native-set-versionCode - - run: make react-native-build-unsigned-apk - - name: Install keystore + - name: Build aab env: - ANDROID_KEYSTORE_BASE64: ${{ secrets.REACT_NATIVE_ANDROID_KEYSTORE_BASE64 }} + STORE_BASE64: ${{ secrets.REACT_NATIVE_ANDROID_KEYSTORE_BASE64 }} + STORE_PASSWORD: ${{ secrets.REACT_NATIVE_ANDROID_KEYSTORE_PASSWORD }} + KEY_ALIAS: ${{ secrets.REACT_NATIVE_ANDROID_KEY_ALIAS }} + KEY_PASSWORD: ${{ secrets.REACT_NATIVE_ANDROID_KEY_PASSWORD }} run: | - KEYSTORE_PATH=$RUNNER_TEMP/keystore.jks - echo -n "$ANDROID_KEYSTORE_BASE64" | base64 --decode -o $KEYSTORE_PATH - - run: make react-native-zipalign - - name: Run apksigner - env: - ANDROID_KEYSTORE_PASSWORD: ${{ secrets.REACT_NATIVE_ANDROID_KEYSTORE_PASSWORD }} - ANDROID_KEY_ALIAS: ${{ secrets.REACT_NATIVE_ANDROID_KEY_ALIAS }} - ANDROID_KEY_PASSWORD: ${{ secrets.REACT_NATIVE_ANDROID_KEY_PASSWORD }} - run: | - export ANDROID_KEYSTORE_PATH="$RUNNER_TEMP/keystore.jks" - make react-native-apksigner - - name: Distribute to App Center + export STORE_FILE="$RUNNER_TEMP/upload_key.jks" + echo -n "$STORE_BASE64" | base64 --decode -o "$STORE_FILE" + make react-native-build-aab + - name: Upload aab if: ${{ github.ref == 'refs/heads/master' }} env: - APPCENTER_ACCESS_TOKEN: ${{ secrets.REACT_NATIVE_ANDROID_APPCENTER_ACCESS_TOKEN }} - run: appcenter distribute release --debug --silent --file ./example/reactnative/android/app/build/outputs/apk/release/app-release-signed.apk --group "Collaborators" --app "Oursky/Authgear-demo-RN-Android" --release-notes "no release notes" + GOOGLE_SERVICE_ACCOUNT_KEY_JSON_BASE64: ${{ secrets.GOOGLE_SERVICE_ACCOUNT_KEY_JSON_BASE64 }} + run: | + export GOOGLE_SERVICE_ACCOUNT_KEY_JSON_FILE="$RUNNER_TEMP/google_service_account_key.json" + echo -n "$GOOGLE_SERVICE_ACCOUNT_KEY_JSON_BASE64" | base64 --decode -o "$GOOGLE_SERVICE_ACCOUNT_KEY_JSON_FILE" + make react-native-upload-aab capacitor_ios: if: ${{ github.repository == 'authgear/authgear-sdk-js' }} @@ -228,30 +224,25 @@ jobs: - uses: ruby/setup-ruby@v1 with: bundler-cache: true - - run: npm install -g appcenter-cli - run: make sdk-build - run: make capacitor-npm-ci - run: make capacitor-npm-audit - run: make capacitor-build-js - - run: make capacitor-set-versionCode - - run: make capacitor-build-unsigned-apk - - name: Install keystore + - name: Build aab env: - ANDROID_KEYSTORE_BASE64: ${{ secrets.CAPACITOR_ANDROID_KEYSTORE_BASE64 }} + STORE_BASE64: ${{ secrets.CAPACITOR_ANDROID_KEYSTORE_BASE64 }} + STORE_PASSWORD: ${{ secrets.CAPACITOR_ANDROID_KEYSTORE_PASSWORD }} + KEY_ALIAS: ${{ secrets.CAPACITOR_ANDROID_KEY_ALIAS }} + KEY_PASSWORD: ${{ secrets.CAPACITOR_ANDROID_KEY_PASSWORD }} run: | - KEYSTORE_PATH=$RUNNER_TEMP/keystore.jks - echo -n "$ANDROID_KEYSTORE_BASE64" | base64 --decode -o $KEYSTORE_PATH - - run: make capacitor-zipalign - - name: Run apksigner - env: - ANDROID_KEYSTORE_PASSWORD: ${{ secrets.CAPACITOR_ANDROID_KEYSTORE_PASSWORD }} - ANDROID_KEY_ALIAS: ${{ secrets.CAPACITOR_ANDROID_KEY_ALIAS }} - ANDROID_KEY_PASSWORD: ${{ secrets.CAPACITOR_ANDROID_KEY_PASSWORD }} - run: | - export ANDROID_KEYSTORE_PATH="$RUNNER_TEMP/keystore.jks" - make capacitor-apksigner - - name: Distribute to App Center + export STORE_FILE="$RUNNER_TEMP/upload_key.jks" + echo -n "$STORE_BASE64" | base64 --decode -o "$STORE_FILE" + make capacitor-build-aab + - name: Upload aab if: ${{ github.ref == 'refs/heads/master' }} env: - APPCENTER_ACCESS_TOKEN: ${{ secrets.CAPACITOR_ANDROID_APPCENTER_ACCESS_TOKEN }} - run: appcenter distribute release --debug --silent --file ./example/capacitor/android/app/build/outputs/apk/release/app-release-signed.apk --group "Collaborators" --app "Oursky/Authgear-Demo-Capacitor-Android" --release-notes "no release notes" + GOOGLE_SERVICE_ACCOUNT_KEY_JSON_BASE64: ${{ secrets.GOOGLE_SERVICE_ACCOUNT_KEY_JSON_BASE64 }} + run: | + export GOOGLE_SERVICE_ACCOUNT_KEY_JSON_FILE="$RUNNER_TEMP/google_service_account_key.json" + echo -n "$GOOGLE_SERVICE_ACCOUNT_KEY_JSON_BASE64" | base64 --decode -o "$GOOGLE_SERVICE_ACCOUNT_KEY_JSON_FILE" + make capacitor-upload-aab diff --git a/Makefile b/Makefile index 726a83d3..99dcb7de 100644 --- a/Makefile +++ b/Makefile @@ -81,28 +81,10 @@ react-native-npm-ci: rm -rf node_modules; \ yarn install --frozen-lockfile -.PHONY: react-native-set-versionCode -react-native-set-versionCode: - /usr/bin/sed -I "" "s/versionCode 1/versionCode $(shell date +%s)/" ./example/reactnative/android/app/build.gradle - -.PHONY: react-native-build-unsigned-apk -react-native-build-unsigned-apk: +.PHONY: react-native-build-unsigned-aab +react-native-build-unsigned-aab: cd ./example/reactnative/android; \ - ./gradlew :app:assembleRelease - -.PHONY: react-native-zipalign -react-native-zipalign: - "$(ANDROID_HOME)/build-tools/33.0.3/zipalign" -c -v 4 ./example/reactnative/android/app/build/outputs/apk/release/app-release-unsigned.apk - -.PHONY: react-native-apksigner -react-native-apksigner: - "$(ANDROID_HOME)/build-tools/33.0.3/apksigner" sign \ - --ks $(ANDROID_KEYSTORE_PATH) \ - --ks-key-alias $(ANDROID_KEY_ALIAS) \ - --ks-pass pass:$(ANDROID_KEYSTORE_PASSWORD) \ - --key-pass pass:$(ANDROID_KEY_PASSWORD) \ - --out ./example/reactnative/android/app/build/outputs/apk/release/app-release-signed.apk \ - ./example/reactnative/android/app/build/outputs/apk/release/app-release-unsigned.apk + ./gradlew :app:bundleRelease .PHONY: react-native-pod-install react-native-pod-install: @@ -110,11 +92,25 @@ react-native-pod-install: .PHONY: react-native-build-ios-app react-native-build-ios-app: - bundle exec fastlane react_native_build_ios_app CURRENT_PROJECT_VERSION:$(shell date +%s) + bundle exec fastlane ios react_native_build_ios_app CURRENT_PROJECT_VERSION:$(shell date +%s) .PHONY: react-native-upload-ios-app react-native-upload-ios-app: - bundle exec fastlane upload_ios_app ipa:./build/Release/iOS/reactNativeExample/reactNativeExample.ipa + bundle exec fastlane ios upload_ios_app ipa:./build/Release/iOS/reactNativeExample/reactNativeExample.ipa + +.PHONY: react-native-build-aab +react-native-build-aab: + bundle exec fastlane android react_native_build_aab \ + VERSION_CODE:$(shell date +%s) \ + STORE_FILE:$(STORE_FILE) \ + STORE_PASSWORD:$(STORE_PASSWORD) \ + KEY_ALIAS:$(KEY_ALIAS) \ + KEY_PASSWORD:$(KEY_PASSWORD) + +.PHONY: react-native-upload-aab +react-native-upload-aab: + bundle exec fastlane android react_native_upload_aab \ + json_key:$(GOOGLE_SERVICE_ACCOUNT_KEY_JSON_FILE) .PHONY: capacitor-npm-ci capacitor-npm-ci: @@ -135,35 +131,31 @@ capacitor-build-js: .PHONY: capacitor-build-ios-simulator capacitor-build-ios-simulator: - bundle exec fastlane capacitor_build_ios_simulator + bundle exec fastlane ios capacitor_build_ios_simulator .PHONY: capacitor-build-ios-app capacitor-build-ios-app: - bundle exec fastlane capacitor_build_ios_app CURRENT_PROJECT_VERSION:$(shell date +%s) + bundle exec fastlane ios capacitor_build_ios_app CURRENT_PROJECT_VERSION:$(shell date +%s) .PHONY: capacitor-upload-ios-app capacitor-upload-ios-app: - bundle exec fastlane upload_ios_app ipa:./build/Release/iOS/capacitor/capacitor.ipa + bundle exec fastlane ios upload_ios_app ipa:./build/Release/iOS/capacitor/capacitor.ipa -.PHONY: capacitor-build-unsigned-apk -capacitor-build-unsigned-apk: +.PHONY: capacitor-build-unsigned-aab +capacitor-build-unsigned-aab: cd ./example/capacitor/android; \ - ./gradlew :app:assembleRelease - -.PHONY: capacitor-set-versionCode -capacitor-set-versionCode: - /usr/bin/sed -I "" "s/versionCode 1/versionCode $(shell date +%s)/" ./example/capacitor/android/app/build.gradle - -.PHONY: capacitor-zipalign -capacitor-zipalign: - "$(ANDROID_HOME)/build-tools/35.0.1/zipalign" -c -v 4 ./example/capacitor/android/app/build/outputs/apk/release/app-release-unsigned.apk - -.PHONY: capacitor-apksigner -capacitor-apksigner: - "$(ANDROID_HOME)/build-tools/35.0.1/apksigner" sign \ - --ks $(ANDROID_KEYSTORE_PATH) \ - --ks-key-alias $(ANDROID_KEY_ALIAS) \ - --ks-pass pass:$(ANDROID_KEYSTORE_PASSWORD) \ - --key-pass pass:$(ANDROID_KEY_PASSWORD) \ - --out ./example/capacitor/android/app/build/outputs/apk/release/app-release-signed.apk \ - ./example/capacitor/android/app/build/outputs/apk/release/app-release-unsigned.apk + ./gradlew :app:bundleRelease + +.PHONY: capacitor-build-aab +capacitor-build-aab: + bundle exec fastlane android capacitor_build_aab \ + VERSION_CODE:$(shell date +%s) \ + STORE_FILE:$(STORE_FILE) \ + STORE_PASSWORD:$(STORE_PASSWORD) \ + KEY_ALIAS:$(KEY_ALIAS) \ + KEY_PASSWORD:$(KEY_PASSWORD) + +.PHONY: capacitor-upload-aab +capacitor-upload-aab: + bundle exec fastlane android capacitor_upload_aab \ + json_key:$(GOOGLE_SERVICE_ACCOUNT_KEY_JSON_FILE) diff --git a/example/capacitor/android/app/build.gradle b/example/capacitor/android/app/build.gradle index e6b20b4c..2f0da73a 100644 --- a/example/capacitor/android/app/build.gradle +++ b/example/capacitor/android/app/build.gradle @@ -8,7 +8,11 @@ android { applicationId "com.authgear.sdk.exampleapp.capacitor" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 + if (project.hasProperty("VERSION_CODE")) { + versionCode Integer.parseInt(project.findProperty("VERSION_CODE")) + } else { + versionCode 1 + } versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { @@ -17,10 +21,23 @@ android { ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' } } + signingConfigs { + if (project.hasProperty("STORE_FILE")) { + release { + storeFile file(project.findProperty("STORE_FILE")) + storePassword project.findProperty("STORE_PASSWORD") + keyAlias project.findProperty("KEY_ALIAS") + keyPassword project.findProperty("KEY_PASSWORD") + } + } + } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + if (project.hasProperty("STORE_FILE")) { + signingConfig signingConfigs.release + } } } } diff --git a/example/reactnative/android/app/build.gradle b/example/reactnative/android/app/build.gradle index c5f94c48..68ab8462 100644 --- a/example/reactnative/android/app/build.gradle +++ b/example/reactnative/android/app/build.gradle @@ -100,10 +100,14 @@ android { namespace "com.reactnativeexample" defaultConfig { - applicationId "com.reactnativeexample" + applicationId "com.authgear.sdk.exampleapp.reactnative" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 + if (project.hasProperty("VERSION_CODE")) { + versionCode Integer.parseInt(project.findProperty("VERSION_CODE")) + } else { + versionCode 1 + } versionName "1.0" } @@ -122,6 +126,14 @@ android { keyAlias 'androiddebugkey' keyPassword 'android' } + if (project.hasProperty("STORE_FILE")) { + release { + storeFile file(project.findProperty("STORE_FILE")) + storePassword project.findProperty("STORE_PASSWORD") + keyAlias project.findProperty("KEY_ALIAS") + keyPassword project.findProperty("KEY_PASSWORD") + } + } } buildTypes { debug { @@ -134,6 +146,9 @@ android { // signingConfig signingConfigs.debug minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + if (project.hasProperty("STORE_FILE")) { + signingConfig signingConfigs.release + } } } diff --git a/example/reactnative/android/build.gradle b/example/reactnative/android/build.gradle index 73a05b61..7a019136 100644 --- a/example/reactnative/android/build.gradle +++ b/example/reactnative/android/build.gradle @@ -1,13 +1,11 @@ buildscript { ext { - // buildToolsVersion depends on the available build tools on the Github runner. - // See https://github.com/actions/runner-images/blob/main/images/macos/macos-14-arm64-Readme.md - buildToolsVersion = "33.0.3" + buildToolsVersion = "35.0.0" minSdkVersion = 24 - compileSdkVersion = 33 - targetSdkVersion = 33 + compileSdkVersion = 35 + targetSdkVersion = 34 ndkVersion = "26.1.10909125" - kotlinVersion = "1.9.24" + kotlinVersion = "1.9.25" } repositories { google() diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 1e13f480..ced0a868 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -1,5 +1,3 @@ -default_platform(:ios) - platform :ios do lane :react_native_build_ios_app do |options| build_app( @@ -46,3 +44,51 @@ platform :ios do ) end end + +platform :android do + lane :react_native_build_aab do |options| + gradle( + project_dir: "./example/reactnative/android", + tasks: [":app:bundleRelease"], + properties: { + "VERSION_CODE" => options[:VERSION_CODE], + "STORE_FILE" => options[:STORE_FILE], + "STORE_PASSWORD" => options[:STORE_PASSWORD], + "KEY_ALIAS" => options[:KEY_ALIAS], + "KEY_PASSWORD" => options[:KEY_PASSWORD], + }, + ) + end + + lane :react_native_upload_aab do |options| + upload_to_play_store( + json_key: options[:json_key], + package_name: "com.authgear.sdk.exampleapp.reactnative", + track: "internal", + aab: "./example/reactnative/android/app/build/outputs/bundle/release/app-release.aab", + ) + end + + lane :capacitor_build_aab do |options| + gradle( + project_dir: "./example/capacitor/android", + tasks: [":app:bundleRelease"], + properties: { + "VERSION_CODE" => options[:VERSION_CODE], + "STORE_FILE" => options[:STORE_FILE], + "STORE_PASSWORD" => options[:STORE_PASSWORD], + "KEY_ALIAS" => options[:KEY_ALIAS], + "KEY_PASSWORD" => options[:KEY_PASSWORD], + }, + ) + end + + lane :capacitor_upload_aab do |options| + upload_to_play_store( + json_key: options[:json_key], + package_name: "com.authgear.sdk.exampleapp.capacitor", + track: "internal", + aab: "./example/capacitor/android/app/build/outputs/bundle/release/app-release.aab", + ) + end +end