Skip to content

Commit f867bb8

Browse files
committed
feat: add CI/CD
1 parent a49bc08 commit f867bb8

3 files changed

Lines changed: 105 additions & 0 deletions

File tree

.github/workflows/release.yaml

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
name: Build all sample apps and create release
2+
3+
on:
4+
push:
5+
tags:
6+
- "v*.*.*"
7+
8+
jobs:
9+
build-and-release:
10+
runs-on: ubuntu-latest
11+
12+
steps:
13+
- name: Checkout source
14+
uses: actions/checkout@v3
15+
16+
- name: Set up JDK
17+
uses: actions/setup-java@v3
18+
with:
19+
distribution: 'temurin'
20+
java-version: '17'
21+
22+
- name: Grant permission to gradlew
23+
run: find . -name "gradlew" -exec chmod +x {} \;
24+
25+
- name: Build all apps (placeholder and flag versions)
26+
run: |
27+
for appdir in */ ; do
28+
if [ -f "$appdir/config.json" ] && [ -f "$appdir/gradlew" ]; then
29+
echo "==> Processing $appdir"
30+
31+
cd "$appdir"
32+
33+
# Load config values
34+
FLAG=$(jq -r '.flag' config.json)
35+
FILES=$(jq -r '.files[]' config.json)
36+
37+
# Placeholder build (no edits)
38+
echo "-> Building placeholder version"
39+
40+
pwd
41+
ls
42+
ls ../
43+
44+
./gradlew clean assembleRelease \
45+
-Pandroid.injected.signing.store.file=$GITHUB_WORKSPACE/release-key.jks \
46+
-Pandroid.injected.signing.store.password=${{ secrets.KEYSTORE_PASSWORD }} \
47+
-Pandroid.injected.signing.key.alias=${{ secrets.KEY_ALIAS }} \
48+
-Pandroid.injected.signing.key.password=${{ secrets.KEYSTORE_PASSWORD }}
49+
50+
cp app/build/outputs/apk/release/app-release.apk "../${appdir%/}-placeholder.apk"
51+
52+
# Modify files for flag version
53+
echo "-> Replacing placeholder with flag"
54+
for file in $FILES; do
55+
echo "Editing $file"
56+
sed -i "s/DROIDGROUND_FLAG_PLACEHOLDER/${FLAG//\//\\/}/g" "$file"
57+
done
58+
59+
echo "-> Building flag version"
60+
./gradlew clean assembleRelease \
61+
-Pandroid.injected.signing.store.file=$GITHUB_WORKSPACE//release-key.jks \
62+
-Pandroid.injected.signing.store.password=${{ secrets.KEYSTORE_PASSWORD }} \
63+
-Pandroid.injected.signing.key.alias=${{ secrets.KEY_ALIAS }} \
64+
-Pandroid.injected.signing.key.password=${{ secrets.KEYSTORE_PASSWORD }}
65+
66+
cp app/build/outputs/apk/release/app-release.apk "../${appdir%/}-flag.apk"
67+
68+
# Restore original files (optional, to not pollute git)
69+
git restore .
70+
71+
cd ..
72+
fi
73+
done
74+
75+
- name: Upload all APKs to GitHub Release
76+
uses: softprops/action-gh-release@v2
77+
with:
78+
files: |
79+
*-placeholder.apk
80+
*-flag.apk
81+
env:
82+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,17 @@ Every sample app has the following:
1717
Using this info the *GitHub action* can build **two versions** of each app (one with the placeholder flag and one with the actual flag).
1818
This simulates what should happen in a real CTF event, where the player are given the placeholder version while the real one is installed on the device accessible through *DroidGround*.
1919

20+
The release signing config is set as follows:
21+
22+
```kotlin
23+
signingConfigs {
24+
create("release") {
25+
storeFile = file(project.findProperty("android.injected.signing.store.file") as String? ?: "")
26+
storePassword = project.findProperty("android.injected.signing.store.password") as String? ?: ""
27+
keyAlias = project.findProperty("android.injected.signing.key.alias") as String? ?: ""
28+
keyPassword = project.findProperty("android.injected.signing.key.password") as String? ?: ""
29+
}
30+
}
31+
```
32+
2033
If you want to build them on your own you can use the `build.sh` script provided here in the root of the repo.

hidden-activity/app/build.gradle.kts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,18 @@ android {
1818
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
1919
}
2020

21+
signingConfigs {
22+
create("release") {
23+
storeFile = file(project.findProperty("android.injected.signing.store.file") as String? ?: "")
24+
storePassword = project.findProperty("android.injected.signing.store.password") as String? ?: ""
25+
keyAlias = project.findProperty("android.injected.signing.key.alias") as String? ?: ""
26+
keyPassword = project.findProperty("android.injected.signing.key.password") as String? ?: ""
27+
}
28+
}
29+
2130
buildTypes {
2231
release {
32+
signingConfig = signingConfigs.getByName("release")
2333
isMinifyEnabled = false
2434
proguardFiles(
2535
getDefaultProguardFile("proguard-android-optimize.txt"),

0 commit comments

Comments
 (0)