// CI pipeline for BowlEye (PinPoint). Builds the Debug APK and runs unit // tests on every push. Runs on the team19 VM's Jenkins install, using the // Android SDK at /opt/android-sdk (see docs/ for the VM setup this depends on). pipeline { agent any options { timeout(time: 45, unit: 'MINUTES') disableConcurrentBuilds() buildDiscarder(logRotator(numToKeepStr: '20')) } environment { ANDROID_HOME = '/opt/android-sdk' ANDROID_SDK_ROOT = '/opt/android-sdk' } stages { stage('Checkout') { steps { checkout scm } } stage('Prepare SDK pointer') { steps { // AGP will also pick up ANDROID_HOME from the environment, but // writing local.properties explicitly keeps this working even // if the job ever runs on a different agent/environment setup. sh 'echo "sdk.dir=/opt/android-sdk" > local.properties' } } stage('Build Debug APK') { steps { sh 'chmod +x ./gradlew' sh './gradlew assembleDebug --no-daemon --stacktrace' } } stage('Unit Tests') { steps { sh './gradlew testDebugUnitTest --no-daemon --stacktrace' } } stage('Deploy website') { // Only runs when a push actually touches website/, so unrelated // app commits don't trigger a redeploy. Just a plain file copy -- // nginx serves the file straight off disk, no reload needed. when { changeset 'website/**' } steps { sh 'cp website/index.html /var/www/pinpoint-site/index.html' } } } post { always { junit allowEmptyResults: true, testResults: '**/build/test-results/**/*.xml' archiveArtifacts artifacts: 'app/build/outputs/apk/**/*.apk', allowEmptyArchive: true } } }