Skip to content

Commit 5a6dce8

Browse files
authored
Distribute aab with fastlane #350
ref DEV-2149
2 parents 6e31336 + bb15158 commit 5a6dce8

File tree

6 files changed

+156
-97
lines changed

6 files changed

+156
-97
lines changed

.github/workflows/ci.yaml

Lines changed: 30 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ jobs:
8080
node-version-file: "./.tool-versions"
8181
- run: make sdk-build
8282
- run: make react-native-npm-ci
83-
- run: make react-native-build-unsigned-apk
83+
- run: make react-native-build-unsigned-aab
8484

8585
test_capacitor_ios:
8686
runs-on: macos-14
@@ -108,7 +108,7 @@ jobs:
108108
- run: make sdk-build
109109
- run: make capacitor-npm-ci
110110
- run: make capacitor-build-js
111-
- run: make capacitor-build-unsigned-apk
111+
- run: make capacitor-build-unsigned-aab
112112

113113
react_native_ios:
114114
if: ${{ github.repository == 'authgear/authgear-sdk-js' }}
@@ -161,28 +161,24 @@ jobs:
161161
bundler-cache: true
162162
- run: make sdk-build
163163
- run: make react-native-npm-ci
164-
- run: make react-native-set-versionCode
165-
- run: make react-native-build-unsigned-apk
166-
- name: Install keystore
164+
- name: Build aab
167165
env:
168-
ANDROID_KEYSTORE_BASE64: ${{ secrets.REACT_NATIVE_ANDROID_KEYSTORE_BASE64 }}
166+
STORE_BASE64: ${{ secrets.REACT_NATIVE_ANDROID_KEYSTORE_BASE64 }}
167+
STORE_PASSWORD: ${{ secrets.REACT_NATIVE_ANDROID_KEYSTORE_PASSWORD }}
168+
KEY_ALIAS: ${{ secrets.REACT_NATIVE_ANDROID_KEY_ALIAS }}
169+
KEY_PASSWORD: ${{ secrets.REACT_NATIVE_ANDROID_KEY_PASSWORD }}
169170
run: |
170-
KEYSTORE_PATH=$RUNNER_TEMP/keystore.jks
171-
echo -n "$ANDROID_KEYSTORE_BASE64" | base64 --decode -o $KEYSTORE_PATH
172-
- run: make react-native-zipalign
173-
- name: Run apksigner
174-
env:
175-
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.REACT_NATIVE_ANDROID_KEYSTORE_PASSWORD }}
176-
ANDROID_KEY_ALIAS: ${{ secrets.REACT_NATIVE_ANDROID_KEY_ALIAS }}
177-
ANDROID_KEY_PASSWORD: ${{ secrets.REACT_NATIVE_ANDROID_KEY_PASSWORD }}
178-
run: |
179-
export ANDROID_KEYSTORE_PATH="$RUNNER_TEMP/keystore.jks"
180-
make react-native-apksigner
181-
- name: Distribute to App Center
171+
export STORE_FILE="$RUNNER_TEMP/upload_key.jks"
172+
echo -n "$STORE_BASE64" | base64 --decode -o "$STORE_FILE"
173+
make react-native-build-aab
174+
- name: Upload aab
182175
if: ${{ github.ref == 'refs/heads/master' }}
183176
env:
184-
APPCENTER_ACCESS_TOKEN: ${{ secrets.REACT_NATIVE_ANDROID_APPCENTER_ACCESS_TOKEN }}
185-
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"
177+
GOOGLE_SERVICE_ACCOUNT_KEY_JSON_BASE64: ${{ secrets.GOOGLE_SERVICE_ACCOUNT_KEY_JSON_BASE64 }}
178+
run: |
179+
export GOOGLE_SERVICE_ACCOUNT_KEY_JSON_FILE="$RUNNER_TEMP/google_service_account_key.json"
180+
echo -n "$GOOGLE_SERVICE_ACCOUNT_KEY_JSON_BASE64" | base64 --decode -o "$GOOGLE_SERVICE_ACCOUNT_KEY_JSON_FILE"
181+
make react-native-upload-aab
186182
187183
capacitor_ios:
188184
if: ${{ github.repository == 'authgear/authgear-sdk-js' }}
@@ -228,30 +224,25 @@ jobs:
228224
- uses: ruby/setup-ruby@v1
229225
with:
230226
bundler-cache: true
231-
- run: npm install -g appcenter-cli
232227
- run: make sdk-build
233228
- run: make capacitor-npm-ci
234229
- run: make capacitor-npm-audit
235230
- run: make capacitor-build-js
236-
- run: make capacitor-set-versionCode
237-
- run: make capacitor-build-unsigned-apk
238-
- name: Install keystore
231+
- name: Build aab
239232
env:
240-
ANDROID_KEYSTORE_BASE64: ${{ secrets.CAPACITOR_ANDROID_KEYSTORE_BASE64 }}
233+
STORE_BASE64: ${{ secrets.CAPACITOR_ANDROID_KEYSTORE_BASE64 }}
234+
STORE_PASSWORD: ${{ secrets.CAPACITOR_ANDROID_KEYSTORE_PASSWORD }}
235+
KEY_ALIAS: ${{ secrets.CAPACITOR_ANDROID_KEY_ALIAS }}
236+
KEY_PASSWORD: ${{ secrets.CAPACITOR_ANDROID_KEY_PASSWORD }}
241237
run: |
242-
KEYSTORE_PATH=$RUNNER_TEMP/keystore.jks
243-
echo -n "$ANDROID_KEYSTORE_BASE64" | base64 --decode -o $KEYSTORE_PATH
244-
- run: make capacitor-zipalign
245-
- name: Run apksigner
246-
env:
247-
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.CAPACITOR_ANDROID_KEYSTORE_PASSWORD }}
248-
ANDROID_KEY_ALIAS: ${{ secrets.CAPACITOR_ANDROID_KEY_ALIAS }}
249-
ANDROID_KEY_PASSWORD: ${{ secrets.CAPACITOR_ANDROID_KEY_PASSWORD }}
250-
run: |
251-
export ANDROID_KEYSTORE_PATH="$RUNNER_TEMP/keystore.jks"
252-
make capacitor-apksigner
253-
- name: Distribute to App Center
238+
export STORE_FILE="$RUNNER_TEMP/upload_key.jks"
239+
echo -n "$STORE_BASE64" | base64 --decode -o "$STORE_FILE"
240+
make capacitor-build-aab
241+
- name: Upload aab
254242
if: ${{ github.ref == 'refs/heads/master' }}
255243
env:
256-
APPCENTER_ACCESS_TOKEN: ${{ secrets.CAPACITOR_ANDROID_APPCENTER_ACCESS_TOKEN }}
257-
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"
244+
GOOGLE_SERVICE_ACCOUNT_KEY_JSON_BASE64: ${{ secrets.GOOGLE_SERVICE_ACCOUNT_KEY_JSON_BASE64 }}
245+
run: |
246+
export GOOGLE_SERVICE_ACCOUNT_KEY_JSON_FILE="$RUNNER_TEMP/google_service_account_key.json"
247+
echo -n "$GOOGLE_SERVICE_ACCOUNT_KEY_JSON_BASE64" | base64 --decode -o "$GOOGLE_SERVICE_ACCOUNT_KEY_JSON_FILE"
248+
make capacitor-upload-aab

Makefile

Lines changed: 39 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -81,40 +81,36 @@ react-native-npm-ci:
8181
rm -rf node_modules; \
8282
yarn install --frozen-lockfile
8383

84-
.PHONY: react-native-set-versionCode
85-
react-native-set-versionCode:
86-
/usr/bin/sed -I "" "s/versionCode 1/versionCode $(shell date +%s)/" ./example/reactnative/android/app/build.gradle
87-
88-
.PHONY: react-native-build-unsigned-apk
89-
react-native-build-unsigned-apk:
84+
.PHONY: react-native-build-unsigned-aab
85+
react-native-build-unsigned-aab:
9086
cd ./example/reactnative/android; \
91-
./gradlew :app:assembleRelease
92-
93-
.PHONY: react-native-zipalign
94-
react-native-zipalign:
95-
"$(ANDROID_HOME)/build-tools/33.0.3/zipalign" -c -v 4 ./example/reactnative/android/app/build/outputs/apk/release/app-release-unsigned.apk
96-
97-
.PHONY: react-native-apksigner
98-
react-native-apksigner:
99-
"$(ANDROID_HOME)/build-tools/33.0.3/apksigner" sign \
100-
--ks $(ANDROID_KEYSTORE_PATH) \
101-
--ks-key-alias $(ANDROID_KEY_ALIAS) \
102-
--ks-pass pass:$(ANDROID_KEYSTORE_PASSWORD) \
103-
--key-pass pass:$(ANDROID_KEY_PASSWORD) \
104-
--out ./example/reactnative/android/app/build/outputs/apk/release/app-release-signed.apk \
105-
./example/reactnative/android/app/build/outputs/apk/release/app-release-unsigned.apk
87+
./gradlew :app:bundleRelease
10688

10789
.PHONY: react-native-pod-install
10890
react-native-pod-install:
10991
cd ./example/reactnative/ios; bundle exec pod install
11092

11193
.PHONY: react-native-build-ios-app
11294
react-native-build-ios-app:
113-
bundle exec fastlane react_native_build_ios_app CURRENT_PROJECT_VERSION:$(shell date +%s)
95+
bundle exec fastlane ios react_native_build_ios_app CURRENT_PROJECT_VERSION:$(shell date +%s)
11496

11597
.PHONY: react-native-upload-ios-app
11698
react-native-upload-ios-app:
117-
bundle exec fastlane upload_ios_app ipa:./build/Release/iOS/reactNativeExample/reactNativeExample.ipa
99+
bundle exec fastlane ios upload_ios_app ipa:./build/Release/iOS/reactNativeExample/reactNativeExample.ipa
100+
101+
.PHONY: react-native-build-aab
102+
react-native-build-aab:
103+
bundle exec fastlane android react_native_build_aab \
104+
VERSION_CODE:$(shell date +%s) \
105+
STORE_FILE:$(STORE_FILE) \
106+
STORE_PASSWORD:$(STORE_PASSWORD) \
107+
KEY_ALIAS:$(KEY_ALIAS) \
108+
KEY_PASSWORD:$(KEY_PASSWORD)
109+
110+
.PHONY: react-native-upload-aab
111+
react-native-upload-aab:
112+
bundle exec fastlane android react_native_upload_aab \
113+
json_key:$(GOOGLE_SERVICE_ACCOUNT_KEY_JSON_FILE)
118114

119115
.PHONY: capacitor-npm-ci
120116
capacitor-npm-ci:
@@ -135,35 +131,31 @@ capacitor-build-js:
135131

136132
.PHONY: capacitor-build-ios-simulator
137133
capacitor-build-ios-simulator:
138-
bundle exec fastlane capacitor_build_ios_simulator
134+
bundle exec fastlane ios capacitor_build_ios_simulator
139135

140136
.PHONY: capacitor-build-ios-app
141137
capacitor-build-ios-app:
142-
bundle exec fastlane capacitor_build_ios_app CURRENT_PROJECT_VERSION:$(shell date +%s)
138+
bundle exec fastlane ios capacitor_build_ios_app CURRENT_PROJECT_VERSION:$(shell date +%s)
143139

144140
.PHONY: capacitor-upload-ios-app
145141
capacitor-upload-ios-app:
146-
bundle exec fastlane upload_ios_app ipa:./build/Release/iOS/capacitor/capacitor.ipa
142+
bundle exec fastlane ios upload_ios_app ipa:./build/Release/iOS/capacitor/capacitor.ipa
147143

148-
.PHONY: capacitor-build-unsigned-apk
149-
capacitor-build-unsigned-apk:
144+
.PHONY: capacitor-build-unsigned-aab
145+
capacitor-build-unsigned-aab:
150146
cd ./example/capacitor/android; \
151-
./gradlew :app:assembleRelease
152-
153-
.PHONY: capacitor-set-versionCode
154-
capacitor-set-versionCode:
155-
/usr/bin/sed -I "" "s/versionCode 1/versionCode $(shell date +%s)/" ./example/capacitor/android/app/build.gradle
156-
157-
.PHONY: capacitor-zipalign
158-
capacitor-zipalign:
159-
"$(ANDROID_HOME)/build-tools/35.0.1/zipalign" -c -v 4 ./example/capacitor/android/app/build/outputs/apk/release/app-release-unsigned.apk
160-
161-
.PHONY: capacitor-apksigner
162-
capacitor-apksigner:
163-
"$(ANDROID_HOME)/build-tools/35.0.1/apksigner" sign \
164-
--ks $(ANDROID_KEYSTORE_PATH) \
165-
--ks-key-alias $(ANDROID_KEY_ALIAS) \
166-
--ks-pass pass:$(ANDROID_KEYSTORE_PASSWORD) \
167-
--key-pass pass:$(ANDROID_KEY_PASSWORD) \
168-
--out ./example/capacitor/android/app/build/outputs/apk/release/app-release-signed.apk \
169-
./example/capacitor/android/app/build/outputs/apk/release/app-release-unsigned.apk
147+
./gradlew :app:bundleRelease
148+
149+
.PHONY: capacitor-build-aab
150+
capacitor-build-aab:
151+
bundle exec fastlane android capacitor_build_aab \
152+
VERSION_CODE:$(shell date +%s) \
153+
STORE_FILE:$(STORE_FILE) \
154+
STORE_PASSWORD:$(STORE_PASSWORD) \
155+
KEY_ALIAS:$(KEY_ALIAS) \
156+
KEY_PASSWORD:$(KEY_PASSWORD)
157+
158+
.PHONY: capacitor-upload-aab
159+
capacitor-upload-aab:
160+
bundle exec fastlane android capacitor_upload_aab \
161+
json_key:$(GOOGLE_SERVICE_ACCOUNT_KEY_JSON_FILE)

example/capacitor/android/app/build.gradle

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ android {
88
applicationId "com.authgear.sdk.exampleapp.capacitor"
99
minSdkVersion rootProject.ext.minSdkVersion
1010
targetSdkVersion rootProject.ext.targetSdkVersion
11-
versionCode 1
11+
if (project.hasProperty("VERSION_CODE")) {
12+
versionCode Integer.parseInt(project.findProperty("VERSION_CODE"))
13+
} else {
14+
versionCode 1
15+
}
1216
versionName "1.0"
1317
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1418
aaptOptions {
@@ -17,10 +21,23 @@ android {
1721
ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
1822
}
1923
}
24+
signingConfigs {
25+
if (project.hasProperty("STORE_FILE")) {
26+
release {
27+
storeFile file(project.findProperty("STORE_FILE"))
28+
storePassword project.findProperty("STORE_PASSWORD")
29+
keyAlias project.findProperty("KEY_ALIAS")
30+
keyPassword project.findProperty("KEY_PASSWORD")
31+
}
32+
}
33+
}
2034
buildTypes {
2135
release {
2236
minifyEnabled false
2337
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
38+
if (project.hasProperty("STORE_FILE")) {
39+
signingConfig signingConfigs.release
40+
}
2441
}
2542
}
2643
}

example/reactnative/android/app/build.gradle

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,14 @@ android {
100100

101101
namespace "com.reactnativeexample"
102102
defaultConfig {
103-
applicationId "com.reactnativeexample"
103+
applicationId "com.authgear.sdk.exampleapp.reactnative"
104104
minSdkVersion rootProject.ext.minSdkVersion
105105
targetSdkVersion rootProject.ext.targetSdkVersion
106-
versionCode 1
106+
if (project.hasProperty("VERSION_CODE")) {
107+
versionCode Integer.parseInt(project.findProperty("VERSION_CODE"))
108+
} else {
109+
versionCode 1
110+
}
107111
versionName "1.0"
108112
}
109113

@@ -122,6 +126,14 @@ android {
122126
keyAlias 'androiddebugkey'
123127
keyPassword 'android'
124128
}
129+
if (project.hasProperty("STORE_FILE")) {
130+
release {
131+
storeFile file(project.findProperty("STORE_FILE"))
132+
storePassword project.findProperty("STORE_PASSWORD")
133+
keyAlias project.findProperty("KEY_ALIAS")
134+
keyPassword project.findProperty("KEY_PASSWORD")
135+
}
136+
}
125137
}
126138
buildTypes {
127139
debug {
@@ -134,6 +146,9 @@ android {
134146
// signingConfig signingConfigs.debug
135147
minifyEnabled enableProguardInReleaseBuilds
136148
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
149+
if (project.hasProperty("STORE_FILE")) {
150+
signingConfig signingConfigs.release
151+
}
137152
}
138153
}
139154

example/reactnative/android/build.gradle

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
buildscript {
22
ext {
3-
// buildToolsVersion depends on the available build tools on the Github runner.
4-
// See https://github.com/actions/runner-images/blob/main/images/macos/macos-14-arm64-Readme.md
5-
buildToolsVersion = "33.0.3"
3+
buildToolsVersion = "35.0.0"
64
minSdkVersion = 24
7-
compileSdkVersion = 33
8-
targetSdkVersion = 33
5+
compileSdkVersion = 35
6+
targetSdkVersion = 34
97
ndkVersion = "26.1.10909125"
10-
kotlinVersion = "1.9.24"
8+
kotlinVersion = "1.9.25"
119
}
1210
repositories {
1311
google()

fastlane/Fastfile

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
default_platform(:ios)
2-
31
platform :ios do
42
lane :react_native_build_ios_app do |options|
53
build_app(
@@ -46,3 +44,51 @@ platform :ios do
4644
)
4745
end
4846
end
47+
48+
platform :android do
49+
lane :react_native_build_aab do |options|
50+
gradle(
51+
project_dir: "./example/reactnative/android",
52+
tasks: [":app:bundleRelease"],
53+
properties: {
54+
"VERSION_CODE" => options[:VERSION_CODE],
55+
"STORE_FILE" => options[:STORE_FILE],
56+
"STORE_PASSWORD" => options[:STORE_PASSWORD],
57+
"KEY_ALIAS" => options[:KEY_ALIAS],
58+
"KEY_PASSWORD" => options[:KEY_PASSWORD],
59+
},
60+
)
61+
end
62+
63+
lane :react_native_upload_aab do |options|
64+
upload_to_play_store(
65+
json_key: options[:json_key],
66+
package_name: "com.authgear.sdk.exampleapp.reactnative",
67+
track: "internal",
68+
aab: "./example/reactnative/android/app/build/outputs/bundle/release/app-release.aab",
69+
)
70+
end
71+
72+
lane :capacitor_build_aab do |options|
73+
gradle(
74+
project_dir: "./example/capacitor/android",
75+
tasks: [":app:bundleRelease"],
76+
properties: {
77+
"VERSION_CODE" => options[:VERSION_CODE],
78+
"STORE_FILE" => options[:STORE_FILE],
79+
"STORE_PASSWORD" => options[:STORE_PASSWORD],
80+
"KEY_ALIAS" => options[:KEY_ALIAS],
81+
"KEY_PASSWORD" => options[:KEY_PASSWORD],
82+
},
83+
)
84+
end
85+
86+
lane :capacitor_upload_aab do |options|
87+
upload_to_play_store(
88+
json_key: options[:json_key],
89+
package_name: "com.authgear.sdk.exampleapp.capacitor",
90+
track: "internal",
91+
aab: "./example/capacitor/android/app/build/outputs/bundle/release/app-release.aab",
92+
)
93+
end
94+
end

0 commit comments

Comments
 (0)