1010 description : ' Version to release (e.g., v1.0.0)'
1111 required : true
1212 type : string
13+ track :
14+ description : ' Play Store release track'
15+ required : false
16+ type : choice
17+ default : ' internal'
18+ options :
19+ - internal
20+ - alpha
21+ - beta
22+ - production
23+ status :
24+ description : ' Play Store release status'
25+ required : false
26+ type : choice
27+ default : ' draft'
28+ options :
29+ - draft
30+ - completed
1331
1432permissions :
1533 contents : write
@@ -68,18 +86,20 @@ jobs:
6886
6987 - name : Build release APK
7088 env :
71- KEYSTORE_PASSWORD : ${{ secrets.KEYSTORE_PASSWORD }}
72- KEY_PASSWORD : ${{ secrets.KEY_PASSWORD }}
73- KEY_ALIAS : ${{ secrets.KEY_ALIAS }}
74- KEYSTORE_PATH : ${{ vars.ENABLE_SIGNING == 'true' && 'keystore.jks' || '' }}
89+ GHUI_KEYSTORE_PASSWORD : ${{ secrets.KEYSTORE_PASSWORD }}
90+ GHUI_KEY_PASSWORD : ${{ secrets.KEY_PASSWORD }}
7591 run : |
7692 if [ "${{ vars.ENABLE_SIGNING }}" = "true" ] && [ -f "app/keystore.jks" ]; then
7793 echo "Building signed release APK"
78- echo "Using key alias: ${KEY_ALIAS:-ghui}"
79- ./gradlew assembleRelease --stacktrace
94+ echo "Using key alias: ${{ secrets.KEY_ALIAS }}"
95+ ./gradlew assembleRelease \
96+ -Pandroid.injected.signing.store.file=${{ github.workspace }}/app/keystore.jks \
97+ -Pandroid.injected.signing.store.password=${{ secrets.KEYSTORE_PASSWORD }} \
98+ -Pandroid.injected.signing.key.alias=${{ secrets.KEY_ALIAS }} \
99+ -Pandroid.injected.signing.key.password=${{ secrets.KEY_PASSWORD }}
80100 else
81101 echo "Building unsigned release APK"
82- ./gradlew assembleRelease --stacktrace || ./gradlew assembleDebug --stacktrace
102+ ./gradlew assembleRelease --stacktrace
83103 fi
84104
85105 - name : Clean up keystore
@@ -137,18 +157,28 @@ jobs:
137157
138158 - name : Build release bundle
139159 env :
140- KEYSTORE_PASSWORD : ${{ secrets.KEYSTORE_PASSWORD }}
141- KEY_PASSWORD : ${{ secrets.KEY_PASSWORD }}
142- KEY_ALIAS : ${{ secrets.KEY_ALIAS }}
143- KEYSTORE_PATH : ${{ vars.ENABLE_SIGNING == 'true' && 'keystore.jks' || '' }}
160+ GHUI_KEYSTORE_PASSWORD : ${{ secrets.KEYSTORE_PASSWORD }}
161+ GHUI_KEY_PASSWORD : ${{ secrets.KEY_PASSWORD }}
144162 run : |
145163 if [ "${{ vars.ENABLE_SIGNING }}" = "true" ] && [ -f "app/keystore.jks" ]; then
146164 echo "Building signed release bundle"
147- ./gradlew bundleRelease --stacktrace
165+ ./gradlew bundleRelease \
166+ -Pandroid.injected.signing.store.file=${{ github.workspace }}/app/keystore.jks \
167+ -Pandroid.injected.signing.store.password=${{ secrets.KEYSTORE_PASSWORD }} \
168+ -Pandroid.injected.signing.key.alias=${{ secrets.KEY_ALIAS }} \
169+ -Pandroid.injected.signing.key.password=${{ secrets.KEY_PASSWORD }}
148170 else
149171 echo "Skipping bundle build - signing not configured"
150172 fi
151173
174+ - name : Generate debug symbols
175+ if : ${{ vars.ENABLE_SIGNING == 'true' }}
176+ run : |
177+ echo "Checking for debug symbols..."
178+ find app/build/outputs -name "*.zip" -type f | grep -i debug || echo "No debug symbol zips found"
179+ find app/build/outputs -name "*symbols*" -type f || echo "No symbol files found"
180+ ls -la app/build/outputs/bundle/release/ || true
181+
152182 - name : Clean up keystore
153183 if : always()
154184 run : |
@@ -242,24 +272,96 @@ jobs:
242272 runs-on : ubuntu-latest
243273
244274 steps :
275+ - name : Checkout code
276+ uses : actions/checkout@v4
277+
245278 - name : Download AAB artifact
246279 uses : actions/download-artifact@v4
247280 with :
248281 name : release-bundle
249282 path : release-artifacts/
250283
251- - name : Find AAB file
252- id : find-aab
284+ - name : Find bundle and symbols
285+ id : find-files
253286 run : |
254287 AAB_PATH=$(find release-artifacts -name "*.aab" | head -1)
255288 echo "aab_path=$AAB_PATH" >> $GITHUB_OUTPUT
256289
257- - name : Upload to Play Store
290+ # Look for debug symbols
291+ SYMBOLS_PATH=$(find release-artifacts -name "native-debug-symbols.zip" 2>/dev/null | head -1)
292+ if [ -n "$SYMBOLS_PATH" ]; then
293+ echo "symbols_path=$SYMBOLS_PATH" >> $GITHUB_OUTPUT
294+ echo "Found debug symbols at: $SYMBOLS_PATH"
295+ else
296+ echo "No debug symbols found"
297+ fi
298+
299+ - name : Determine release track and status
300+ id : release-config
301+ run : |
302+ if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
303+ TRACK="${{ github.event.inputs.track }}"
304+ STATUS="${{ github.event.inputs.status }}"
305+ else
306+ # Default for tag pushes
307+ TRACK="internal"
308+ STATUS="draft"
309+ fi
310+ echo "track=$TRACK" >> $GITHUB_OUTPUT
311+ echo "status=$STATUS" >> $GITHUB_OUTPUT
312+ echo "Deploying to track: $TRACK with status: $STATUS"
313+
314+ - name : Create whatsnew directory
315+ run : |
316+ mkdir -p whatsnew
317+
318+ # Generate release notes
319+ echo "Release ${{ needs.prepare.outputs.version }}" > whatsnew/whatsnew-en-US
320+ echo "" >> whatsnew/whatsnew-en-US
321+
322+ # Get recent commits
323+ git log --pretty=format:"• %s" -5 >> whatsnew/whatsnew-en-US
324+
325+ # Chinese version
326+ echo "版本 ${{ needs.prepare.outputs.version }}" > whatsnew/whatsnew-zh-CN
327+ echo "" >> whatsnew/whatsnew-zh-CN
328+ git log --pretty=format:"• %s" -5 >> whatsnew/whatsnew-zh-CN
329+
330+ - name : Upload to Play Store (with debug symbols)
331+ if : steps.find-files.outputs.symbols_path != ''
258332 uses : r0adkll/upload-google-play@v1
259333 with :
260- serviceAccountJsonPlainText : ${{ secrets.SERVICE_ACCOUNT_JSON }}
334+ serviceAccountJsonPlainText : ${{ secrets.PLAY_STORE_SERVICE_ACCOUNT_JSON }}
261335 packageName : me.ghui.v2er
262- releaseFiles : ${{ steps.find-aab.outputs.aab_path }}
263- track : internal
264- status : completed
265- whatsNewDirectory : whatsnew/
336+ releaseFiles : ${{ steps.find-files.outputs.aab_path }}
337+ track : ${{ steps.release-config.outputs.track }}
338+ status : ${{ steps.release-config.outputs.status }}
339+ debugSymbols : ${{ steps.find-files.outputs.symbols_path }}
340+ whatsNewDirectory : whatsnew/
341+ changesNotSentForReview : true
342+ continue-on-error : true
343+ id : upload-with-symbols
344+
345+ - name : Upload to Play Store (without debug symbols)
346+ if : steps.find-files.outputs.symbols_path == '' || steps.upload-with-symbols.outcome == 'failure'
347+ uses : r0adkll/upload-google-play@v1
348+ with :
349+ serviceAccountJsonPlainText : ${{ secrets.PLAY_STORE_SERVICE_ACCOUNT_JSON }}
350+ packageName : me.ghui.v2er
351+ releaseFiles : ${{ steps.find-files.outputs.aab_path }}
352+ track : ${{ steps.release-config.outputs.track }}
353+ status : ${{ steps.release-config.outputs.status }}
354+ whatsNewDirectory : whatsnew/
355+ changesNotSentForReview : true
356+
357+ - name : Play Store Upload Summary
358+ if : success()
359+ run : |
360+ echo "## Play Store Upload Complete :rocket:" >> $GITHUB_STEP_SUMMARY
361+ echo "" >> $GITHUB_STEP_SUMMARY
362+ echo "- **Version**: ${{ needs.prepare.outputs.version }}" >> $GITHUB_STEP_SUMMARY
363+ echo "- **Track**: ${{ steps.release-config.outputs.track }}" >> $GITHUB_STEP_SUMMARY
364+ echo "- **Status**: ${{ steps.release-config.outputs.status }}" >> $GITHUB_STEP_SUMMARY
365+ echo "- **Package**: me.ghui.v2er" >> $GITHUB_STEP_SUMMARY
366+ echo "" >> $GITHUB_STEP_SUMMARY
367+ echo "[View in Play Console](https://play.google.com/console/u/0/developers/your-developer-id/app/me.ghui.v2er)" >> $GITHUB_STEP_SUMMARY
0 commit comments