Skip to content

Commit 2aafe9a

Browse files
Sign release APKs automatically in GitHub Actions
1 parent ddaa954 commit 2aafe9a

1 file changed

Lines changed: 62 additions & 4 deletions

File tree

.github/workflows/manual.yml

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,19 +152,77 @@ jobs:
152152
if: env.BUILD_HUMANOPERATOR == 'true'
153153
run: ./gradlew :humanoperator:assembleRelease
154154

155+
- name: Decode signing keystore
156+
env:
157+
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
158+
run: |
159+
if [ -z "$ANDROID_KEYSTORE_BASE64" ]; then
160+
echo "Missing secret: ANDROID_KEYSTORE_BASE64"
161+
exit 1
162+
fi
163+
echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > signing-keystore.jks
164+
165+
- name: Verify signing secrets
166+
env:
167+
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
168+
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
169+
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
170+
run: |
171+
[ -n "$ANDROID_KEYSTORE_PASSWORD" ] || { echo "Missing secret: ANDROID_KEYSTORE_PASSWORD"; exit 1; }
172+
[ -n "$ANDROID_KEY_ALIAS" ] || { echo "Missing secret: ANDROID_KEY_ALIAS"; exit 1; }
173+
[ -n "$ANDROID_KEY_PASSWORD" ] || { echo "Missing secret: ANDROID_KEY_PASSWORD"; exit 1; }
174+
175+
- name: Sign app APK
176+
if: env.BUILD_APP == 'true'
177+
env:
178+
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
179+
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
180+
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
181+
run: |
182+
"$ANDROID_HOME/build-tools/35.0.0/apksigner" sign \
183+
--ks signing-keystore.jks \
184+
--ks-pass pass:"$ANDROID_KEYSTORE_PASSWORD" \
185+
--ks-key-alias "$ANDROID_KEY_ALIAS" \
186+
--key-pass pass:"$ANDROID_KEY_PASSWORD" \
187+
--out app/build/outputs/apk/release/app-release-signed.apk \
188+
app/build/outputs/apk/release/app-release-unsigned.apk
189+
190+
- name: Verify signed app APK
191+
if: env.BUILD_APP == 'true'
192+
run: "$ANDROID_HOME/build-tools/35.0.0/apksigner" verify app/build/outputs/apk/release/app-release-signed.apk
193+
194+
- name: Sign humanoperator APK
195+
if: env.BUILD_HUMANOPERATOR == 'true'
196+
env:
197+
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
198+
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
199+
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
200+
run: |
201+
"$ANDROID_HOME/build-tools/35.0.0/apksigner" sign \
202+
--ks signing-keystore.jks \
203+
--ks-pass pass:"$ANDROID_KEYSTORE_PASSWORD" \
204+
--ks-key-alias "$ANDROID_KEY_ALIAS" \
205+
--key-pass pass:"$ANDROID_KEY_PASSWORD" \
206+
--out humanoperator/build/outputs/apk/release/humanoperator-release-signed.apk \
207+
humanoperator/build/outputs/apk/release/humanoperator-release-unsigned.apk
208+
209+
- name: Verify signed humanoperator APK
210+
if: env.BUILD_HUMANOPERATOR == 'true'
211+
run: "$ANDROID_HOME/build-tools/35.0.0/apksigner" verify humanoperator/build/outputs/apk/release/humanoperator-release-signed.apk
212+
155213
- name: Upload app APK
156214
if: env.BUILD_APP == 'true'
157215
uses: actions/upload-artifact@v4
158216
with:
159-
name: app-release-unsigned
160-
path: app/build/outputs/apk/release/app-release-unsigned.apk
217+
name: app-release-signed
218+
path: app/build/outputs/apk/release/app-release-signed.apk
161219

162220
- name: Upload humanoperator APK
163221
if: env.BUILD_HUMANOPERATOR == 'true'
164222
uses: actions/upload-artifact@v4
165223
with:
166-
name: humanoperator-release-unsigned
167-
path: humanoperator/build/outputs/apk/release/humanoperator-release-unsigned.apk
224+
name: humanoperator-release-signed
225+
path: humanoperator/build/outputs/apk/release/humanoperator-release-signed.apk
168226

169227
- name: Build summary
170228
run: |

0 commit comments

Comments
 (0)