Skip to content

Commit e456cf1

Browse files
authored
Refactor release workflow for keystore handling and uploads
Updated the release workflow to handle keystore decoding and APK/AAB uploads more securely. Added conditional checks for keystore presence and improved artifact upload steps.
1 parent 1af6bcd commit e456cf1

1 file changed

Lines changed: 47 additions & 40 deletions

File tree

.github/workflows/release.yml

Lines changed: 47 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -40,51 +40,58 @@ jobs:
4040
restore-keys: |
4141
gradle-${{ runner.os }}-
4242
43-
- name: Decode keystore from secret
43+
- name: Decode keystore (if provided)
4444
run: |
45-
mkdir -p android/app
46-
echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 --decode > android/app/keystore.jks
47-
ls -l android/app/keystore.jks
48-
shell: bash
49-
50-
- name: Build release APK (signed via injected signing props)
45+
if [ -z "${{ secrets.KEYSTORE_BASE64 }}" ]; then
46+
echo "KEYSTORE_BASE64 not set — skipping keystore decode (build will be unsigned)"
47+
exit 0
48+
fi
49+
# create runner temp directory path and decode keystore there
50+
echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 --decode > "$RUNNER_TEMP/keystore.jks"
51+
echo "Keystore decoded to $RUNNER_TEMP/keystore.jks"
52+
- name: Build release APK and AAB
5153
env:
52-
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
53-
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
54-
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
54+
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
55+
ANDROID_KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
56+
ANDROID_KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
5557
run: |
56-
# Adjust path if your module is not "app" or if project root differs (React Native android/ vs native)
57-
./gradlew assembleRelease \
58-
-Pandroid.injected.signing.store.file=android/app/keystore.jks \
59-
-Pandroid.injected.signing.store.password="$KEYSTORE_PASSWORD" \
60-
-Pandroid.injected.signing.key.alias="$KEY_ALIAS" \
61-
-Pandroid.injected.signing.key.password="$KEY_PASSWORD"
62-
shell: bash
63-
64-
- name: Gather release APK(s)
58+
# If keystore was decoded, RUNNER_TEMP/keystore.jks exists. Use injected signing props so no keystore info is committed.
59+
STORE_FILE="$RUNNER_TEMP/keystore.jks"
60+
STORE_ARG=""
61+
if [ -f "$STORE_FILE" ]; then
62+
STORE_ARG="-Pandroid.injected.signing.store.file=$STORE_FILE -Pandroid.injected.signing.store.password=$ANDROID_KEYSTORE_PASSWORD -Pandroid.injected.signing.key.alias=$ANDROID_KEY_ALIAS -Pandroid.injected.signing.key.password=$ANDROID_KEY_PASSWORD"
63+
echo "Signing with keystore at $STORE_FILE"
64+
else
65+
echo "No keystore found at $STORE_FILE; building unsigned artifacts"
66+
fi
67+
# Force Gradle to use the setup-java JDK on the runner in case project has local overrides
68+
./gradlew assembleRelease bundleRelease -Dorg.gradle.java.home="$JAVA_HOME" $STORE_ARG
69+
- name: Remove keystore file if present
70+
if: always()
6571
run: |
66-
mkdir -p $SIGNED_APK_DIR
67-
APK_PATH=$(find . -type f -path "*/app/build/outputs/apk/release/*release*.apk" | head -n 1)
68-
if [ -z "$APK_PATH" ]; then
69-
echo "ERROR: release APK not found"
70-
exit 1
72+
if [ -f "$RUNNER_TEMP/keystore.jks" ]; then
73+
shred -u "$RUNNER_TEMP/keystore.jks" || rm -f "$RUNNER_TEMP/keystore.jks"
74+
echo "Keystore removed"
75+
else
76+
echo "No keystore to remove"
7177
fi
72-
BASENAME="app-release-${GITHUB_SHA::7}.apk"
73-
cp "$APK_PATH" "$SIGNED_APK_DIR/$BASENAME"
74-
echo "Signed APK copied to $SIGNED_APK_DIR/$BASENAME"
75-
shell: bash
7678
77-
- name: Remove keystore file securely
78-
run: |
79-
shred -u android/app/keystore.jks || rm -f android/app/keystore.jks
80-
shell: bash
79+
- name: Upload APK artifact
80+
uses: actions/upload-artifact@v4
81+
with:
82+
name: simple-data-entry-apk
83+
path: app/build/outputs/apk/release/*.apk
84+
85+
- name: Upload AAB artifact
86+
uses: actions/upload-artifact@v4
87+
with:
88+
name: simple-data-entry-aab
89+
path: app/build/outputs/bundle/release/*.aab
8190

82-
- name: Create GitHub Release and upload APK(s)
83-
uses: ncipollo/release-action@v1
91+
- name: Create GitHub Release
92+
if: ${{ startsWith(github.ref, 'refs/tags/') }}
93+
uses: softprops/action-gh-release@v2
8494
with:
85-
tag: ${{ env.RELEASE_TAG }}
86-
name: Signed APK - ${{ github.sha }}
87-
body: |
88-
Signed APK built for commit ${{ github.sha }} on branch ${{ github.ref_name }}.
89-
This release was generated automatically by the CI workflow.
90-
files: ${{ env.SIGNED_APK_DIR }}/*.apk
95+
files: |
96+
app/build/outputs/apk/release/*.apk
97+
app/build/outputs/bundle/release/*.aab

0 commit comments

Comments
 (0)