Fix Android demo build workflow by explicitly copying individual files #364
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Build All Android Demos | |
on: | |
workflow_dispatch: | |
push: | |
branches: | |
- master | |
paths: | |
- 'demos/android/**' | |
pull_request: | |
branches: | |
- master | |
paths: | |
- 'demos/**' | |
- '.github/workflows/build-android-demos.yml' | |
jobs: | |
generate-matrix: | |
runs-on: ubuntu-latest | |
outputs: | |
matrix: ${{ steps.set-matrix.outputs.matrix }} | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
with: | |
sparse-checkout: demos/android | |
fetch-depth: 2 # Required for git diff in PRs | |
- name: Generate matrix | |
id: set-matrix | |
run: | | |
if [ "${{ github.event_name }}" = "pull_request" ]; then | |
# Get list of changed files in demos/android/ directory | |
changed_files=$(git diff --name-only ${{ github.event.pull_request.base.sha }} HEAD -- 'demos/android/*') | |
echo "Changed files:" | |
echo "$changed_files" | |
# Extract unique demo directories | |
matrix=$(echo "$changed_files" | grep -oE 'demos/android/[^/]*/MASTG-DEMO-[^/]+' | sort -u | head -c -1 | tr '\n' ' ' | sed 's/ /","/g') | |
# If no changes, set empty matrix | |
if [ -z "$matrix" ]; then | |
echo "matrix={\"demo\":[]}" >> $GITHUB_OUTPUT | |
else | |
echo "matrix={\"demo\":[\"$matrix\"]}" >> $GITHUB_OUTPUT | |
fi | |
else | |
# Default behavior: include all demos for master branch | |
matrix=$(echo demos/android/*/MASTG-DEMO-* | sed 's/ /","/g') | |
echo "matrix={\"demo\":[\"$matrix\"]}" >> $GITHUB_OUTPUT | |
fi | |
echo "Print matrix: $matrix" | |
- name: Print matrix | |
run: echo "${{ steps.set-matrix.outputs.matrix }}" | |
build-base-app: | |
runs-on: ubuntu-latest | |
timeout-minutes: 10 | |
steps: | |
- name: Get last commit hash of MASTestApp-Android | |
id: get-mastestapp-hash | |
run: | | |
echo "MASTESTAPP_HASH=$(git ls-remote https://github.com/cpholguera/MASTestApp-Android.git HEAD | awk '{print $1}')" >> $GITHUB_ENV | |
echo "MASTESTAPP_HASH=$MASTESTAPP_HASH" >> $GITHUB_OUTPUT | |
- name: Check if already cached | |
id: cache-check | |
uses: actions/cache/restore@v4 | |
with: | |
lookup-only: true | |
path: MASTestApp-Android/ # we're forced to write a path even if we don't need it | |
key: base-app-${{ env.MASTESTAPP_HASH }} | |
- name: Set up JDK 17 | |
if: steps.cache-check.outputs.cache-hit != 'true' | |
uses: actions/setup-java@v4 | |
with: | |
java-version: '17' | |
distribution: 'temurin' | |
- name: Setup Gradle | |
if: steps.cache-check.outputs.cache-hit != 'true' | |
uses: gradle/actions/setup-gradle@v4 | |
with: | |
cache-read-only: false | |
- name: Clone MASTestApp-Android repository | |
if: steps.cache-check.outputs.cache-hit != 'true' | |
uses: actions/checkout@v4 | |
with: | |
repository: cpholguera/MASTestApp-Android | |
path: MASTestApp-Android | |
ref: ${{ env.MASTESTAPP_HASH }} | |
- name: Build base app | |
if: steps.cache-check.outputs.cache-hit != 'true' | |
run: | | |
cd MASTestApp-Android | |
grep -q 'org.gradle.caching=true' gradle.properties || echo -en "\norg.gradle.caching=true\norg.gradle.configuration-cache=true\n" >> gradle.properties | |
./gradlew assembleDebug --stacktrace || ( | |
echo "Build failed" | |
exit 1 | |
) | |
echo "Build succeeded" | |
- name: Saving cache | |
if: steps.cache-check.outputs.cache-hit != 'true' | |
uses: actions/cache/save@v4 | |
with: | |
path: MASTestApp-Android/ | |
key: ${{ steps.cache-check.outputs.cache-primary-key }} | |
build: | |
needs: [generate-matrix, build-base-app] | |
runs-on: ubuntu-latest | |
timeout-minutes: 30 # Increase this value as needed | |
strategy: | |
matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }} | |
max-parallel: 3 # Limit the number of parallel jobs | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
with: | |
sparse-checkout: demos/android | |
- name: Set up JDK 17 | |
uses: actions/setup-java@v4 | |
with: | |
java-version: '17' | |
distribution: 'temurin' | |
- name: Setup Gradle | |
uses: gradle/actions/setup-gradle@v4 | |
with: | |
cache-read-only: true | |
- name: Restore cache | |
id: cache-base-app | |
uses: actions/cache/restore@v4 | |
with: | |
path: MASTestApp-Android/ | |
key: base-app-${{ env.MASTESTAPP_HASH }} | |
- name: Replace files and build APK | |
run: | | |
demo="${{ matrix.demo }}" | |
[ -d "$demo" ] || ( | |
echo "Demo directory not found: $demo" | |
exit 1 | |
) | |
echo "Processing $demo" | |
cp -f "$demo/MastgTest.kt" MASTestApp-Android/app/src/main/java/org/owasp/mastestapp/MastgTest.kt 2>/dev/null \ | |
&& echo "Copied MastgTest.kt for $demo" \ | |
|| echo "No MastgTest.kt found for $demo" | |
cp -f "$demo/MastgTestWebView.kt" MASTestApp-Android/app/src/main/java/org/owasp/mastestapp/MastgTestWebView.kt 2>/dev/null \ | |
&& echo "Copied MastgTestWebView.kt for $demo" \ | |
|| echo "No MastgTestWebView.kt found for $demo" | |
cp -f "$demo/AndroidManifest.xml" MASTestApp-Android/app/src/main/AndroidManifest.xml 2>/dev/null \ | |
&& echo "Copied AndroidManifest.xml for $demo" \ | |
|| echo "No AndroidManifest.xml found for $demo" | |
cp -f "$demo/filepaths.xml" MASTestApp-Android/app/src/main/res/xml/filepaths.xml 2>/dev/null \ | |
&& echo "Copied filepaths.xml for $demo" \ | |
|| echo "No filepaths.xml found for $demo" | |
cp -f "$demo/network_security_config.xml" MASTestApp-Android/app/src/main/res/xml/network_security_config.xml 2>/dev/null \ | |
&& echo "Copied network_security_config.xml for $demo" \ | |
|| echo "No network_security_config.xml found for $demo" | |
cp -f "$demo/backup_rules.xml" MASTestApp-Android/app/src/main/res/xml/backup_rules.xml 2>/dev/null \ | |
&& echo "Copied backup_rules.xml for $demo" \ | |
|| echo "No backup_rules.xml found for $demo" | |
cp -f "$demo/data_extraction_rules.xml" MASTestApp-Android/app/src/main/res/xml/data_extraction_rules.xml 2>/dev/null \ | |
&& echo "Copied data_extraction_rules.xml for $demo" \ | |
|| echo "No data_extraction_rules.xml found for $demo" | |
echo "Building APK for $demo" | |
cd MASTestApp-Android | |
grep -q 'org.gradle.caching=true' gradle.properties || echo -en "\norg.gradle.caching=true\norg.gradle.configuration-cache=true\n" >> gradle.properties | |
./gradlew assembleDebug --stacktrace || ( | |
echo "Build failed for $demo" | |
exit 1 | |
) | |
cd .. | |
echo "Build succeeded for $demo" | |
apk_filename="$(basename "$demo").apk" | |
mv MASTestApp-Android/app/build/outputs/apk/debug/app-debug.apk "$apk_filename" || ( | |
echo "APK not found for $demo" | |
exit 1 | |
) | |
echo "APK for $demo moved to $apk_filename" | |
echo "APK_NAME=$apk_filename" >> $GITHUB_ENV | |
- name: Upload APK | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ env.APK_NAME }} | |
path: "${{ env.APK_NAME }}" |