From 60a905821f26848c8922f959b7c0c1ae730b7dca Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Mon, 25 Aug 2025 13:52:18 +0200 Subject: [PATCH 01/28] change docker image to bullseye test image --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index d0ecd8e85a..3f813d0886 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -31,7 +31,7 @@ pipeline { agent { docker { - image 'catrobat/catrobat-paintroid:stable' + image 'floriankanduth/devops-846:bullseye' args '--device /dev/kvm:/dev/kvm -v /var/local/container_shared/gradle_cache/$EXECUTOR_NUMBER:/home/user/.gradle -m=6.5G' label 'LimitedEmulator' alwaysPull true From 4bc1f846fe47e0d8fdfdcbe1e76e1d0253968e7e Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Tue, 26 Aug 2025 15:16:35 +0200 Subject: [PATCH 02/28] Update Jenkinsfile --- Jenkinsfile | 71 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 59 insertions(+), 12 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 3f813d0886..eb6b7bed4b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,5 +1,44 @@ #!groovy +class DockerParameters { + + // 'docker build' would normally copy the whole build-dir to the container, changing the + // docker build directory avoids that overhead + def dir = 'docker' + def args = '--device /dev/kvm:/dev/kvm -v /var/local/container_shared/gradle_cache/$EXECUTOR_NUMBER:/home/user/.gradle -m=6.5G' + def label = 'LimitedEmulator' + def image = 'floriankanduth/paintroid_java17:latest' + +} + +def dockerParameters = new DockerParameters() + +def startEmulator(String android_version, String stageName) { + sh 'adb start-server' + // creates a new avd, and if it already exists it does nothing. + sh "echo no | avdmanager create avd --force --name android${android_version}" + " --package 'system-images;android-${android_version};default;x86_64'" + sh "/home/user/android/sdk/emulator/emulator -no-window -no-boot-anim -noaudio -avd android${android_version} > ${stageName}_emulator.log 2>&1 &" +} + +def waitForEmulatorAndPressWakeUpKey() { + sh 'adb devices' + sh 'timeout 5m adb wait-for-device' + sh '''#!/bin/bash +adb devices +timeout 5m adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; +done' +echo "Emulator started" +''' + sh ''' + adb shell settings put global window_animation_scale 0 & + adb shell settings put global transition_animation_scale 0 & + adb shell settings put global animator_duration_scale 0 & + ''' + + // In case the device went to sleep + sh 'adb shell input keyevent KEYCODE_WAKEUP' +} + def reports = 'Paintroid/build/reports' // place the cobertura xml relative to the source, so that the source can be found @@ -23,6 +62,11 @@ def useDebugLabelParameter(defaultLabel) { } pipeline { + environment { + ANDROID_VERSION = 28 + ADB_INSTALL_TIMEOUT = 60 + } + parameters { string name: 'DEBUG_LABEL', defaultValue: '', description: 'For debugging when entered will be used as label to decide on which slaves the jobs will run.' booleanParam name: 'BUILD_WITH_CATROID', defaultValue: false, description: 'When checked then the current Paintroid build will be built with the current develop branch of Catroid' @@ -30,10 +74,10 @@ pipeline { } agent { - docker { - image 'floriankanduth/devops-846:bullseye' - args '--device /dev/kvm:/dev/kvm -v /var/local/container_shared/gradle_cache/$EXECUTOR_NUMBER:/home/user/.gradle -m=6.5G' - label 'LimitedEmulator' + docker { + image dockerParameters.image + args dockerParameters.args + label dockerParameters.label alwaysPull true } } @@ -52,6 +96,7 @@ pipeline { stages { stage('Build Debug-APK') { steps { + sh "java --version" sh "./gradlew -Pindependent='#$env.BUILD_NUMBER $env.BRANCH_NAME' assembleDebug" archiveArtifacts 'app/build/outputs/apk/debug/paintroid-debug*.apk' plot csvFileName: 'dexcount.csv', csvSeries: [[displayTableFlag: false, exclusionValues: '', file: 'Paintroid/build/outputs/dexcount/*.csv', inclusionFlag: 'OFF', url: '']], group: 'APK Stats', numBuilds: '180', style: 'line', title: 'dexcount' @@ -70,14 +115,14 @@ pipeline { sh 'rm -rf Catroid; mkdir Catroid' dir('Catroid') { git branch: params.CATROID_BRANCH, url: 'https://github.com/Catrobat/Catroid.git' - sh "rm -f catroid/src/main/libs/*.aar" - sh "mv -f ../colorpicker/build/outputs/aar/colorpicker-debug.aar catroid/src/main/libs/colorpicker-LOCAL.aar" - sh "mv -f ../Paintroid/build/outputs/aar/Paintroid-debug.aar catroid/src/main/libs/Paintroid-LOCAL.aar" + sh 'rm -f catroid/src/main/libs/*.aar' + sh 'mv -f ../colorpicker/build/outputs/aar/colorpicker-debug.aar catroid/src/main/libs/colorpicker-LOCAL.aar' + sh 'mv -f ../Paintroid/build/outputs/aar/Paintroid-debug.aar catroid/src/main/libs/Paintroid-LOCAL.aar' } renameApks("${env.BRANCH_NAME}-${env.BUILD_NUMBER}") dir('Catroid') { - archiveArtifacts "catroid/src/main/libs/*.aar" - sh "./gradlew assembleCatroidDebug" + archiveArtifacts 'catroid/src/main/libs/*.aar' + sh './gradlew assembleCatroidDebug' archiveArtifacts 'catroid/build/outputs/apk/catroid/debug/catroid-catroid-debug.apk' } } @@ -114,9 +159,11 @@ pipeline { stage('Device Tests') { steps { - sh "echo no | avdmanager create avd --force --name android28 --package 'system-images;android-28;default;x86_64'" - sh "/home/user/android/sdk/emulator/emulator -no-window -no-boot-anim -noaudio -avd android28 > /dev/null 2>&1 &" - sh './gradlew -PenableCoverage -Pjenkins -Pemulator=android28 -Pci createDebugCoverageReport -i' + catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') { + startEmulator(ANDROID_VERSION, 'device_tests') + waitForEmulatorAndPressWakeUpKey() + sh "./gradlew disableAnimations -PenableCoverage -Pjenkins -Pemulator=android${android_version} -Pci createDebugCoverageReport -i" + } } post { always { From 922d5849a0114de700efa5a88f08d3212f00a67a Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Tue, 26 Aug 2025 15:21:54 +0200 Subject: [PATCH 03/28] change docker image --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index eb6b7bed4b..0f0d9141db 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,7 +7,7 @@ class DockerParameters { def dir = 'docker' def args = '--device /dev/kvm:/dev/kvm -v /var/local/container_shared/gradle_cache/$EXECUTOR_NUMBER:/home/user/.gradle -m=6.5G' def label = 'LimitedEmulator' - def image = 'floriankanduth/paintroid_java17:latest' + def image = 'floriankanduth/devops-846:bullseye' } From e9521bf1fb709112d1341630ed252a853312c409 Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Tue, 26 Aug 2025 15:56:38 +0200 Subject: [PATCH 04/28] archive emulator log --- Jenkinsfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 0f0d9141db..5b5f6fa0a9 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -186,7 +186,11 @@ pipeline { post { always { - step([$class: 'LogParserPublisher', failBuildOnError: true, projectRulePath: 'buildScripts/log_parser_rules', unstableOnWarning: true, useProjectRule: true]) + steps { + [$class: 'LogParserPublisher', failBuildOnError: true, projectRulePath: 'buildScripts/log_parser_rules', unstableOnWarning: true, useProjectRule: true] + archiveArtifacts "${stageName}_emulator.log" + + } } changed { notifyChat() From a1c002a731414bdd6a764280c97f62e84781a271 Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Tue, 26 Aug 2025 16:00:48 +0200 Subject: [PATCH 05/28] Update Jenkinsfile --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 5b5f6fa0a9..62c1870bce 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -187,7 +187,7 @@ pipeline { post { always { steps { - [$class: 'LogParserPublisher', failBuildOnError: true, projectRulePath: 'buildScripts/log_parser_rules', unstableOnWarning: true, useProjectRule: true] + step([$class: 'LogParserPublisher', failBuildOnError: true, projectRulePath: 'buildScripts/log_parser_rules', unstableOnWarning: true, useProjectRule: true]) archiveArtifacts "${stageName}_emulator.log" } From ffe268bcdef4ded6b80400683a95ec6926f038d3 Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Tue, 26 Aug 2025 16:13:01 +0200 Subject: [PATCH 06/28] Update Jenkinsfile --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 62c1870bce..f1a2327d91 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -17,7 +17,7 @@ def startEmulator(String android_version, String stageName) { sh 'adb start-server' // creates a new avd, and if it already exists it does nothing. sh "echo no | avdmanager create avd --force --name android${android_version}" + " --package 'system-images;android-${android_version};default;x86_64'" - sh "/home/user/android/sdk/emulator/emulator -no-window -no-boot-anim -noaudio -avd android${android_version} > ${stageName}_emulator.log 2>&1 &" + sh "/home/user/android/sdk/emulator/emulator -no-window -no-boot-anim -noaudio -avd android${android_version}" } def waitForEmulatorAndPressWakeUpKey() { From 146604c8eb43b44163aa417bdf50a905c908971c Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Tue, 26 Aug 2025 16:37:25 +0200 Subject: [PATCH 07/28] Update Jenkinsfile --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index f1a2327d91..1421a31efc 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,7 +5,7 @@ class DockerParameters { // 'docker build' would normally copy the whole build-dir to the container, changing the // docker build directory avoids that overhead def dir = 'docker' - def args = '--device /dev/kvm:/dev/kvm -v /var/local/container_shared/gradle_cache/$EXECUTOR_NUMBER:/home/user/.gradle -m=6.5G' + def args = '--user 1000:1000 --device /dev/kvm:/dev/kvm -v /var/local/container_shared/gradle_cache/$EXECUTOR_NUMBER:/home/user/.gradle -m=6.5G' def label = 'LimitedEmulator' def image = 'floriankanduth/devops-846:bullseye' From 9f36a08f7a5b59a943c1bf155c407cec7af1f3a7 Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Tue, 26 Aug 2025 16:56:40 +0200 Subject: [PATCH 08/28] Update Jenkinsfile --- Jenkinsfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 1421a31efc..19de81e34d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -17,7 +17,7 @@ def startEmulator(String android_version, String stageName) { sh 'adb start-server' // creates a new avd, and if it already exists it does nothing. sh "echo no | avdmanager create avd --force --name android${android_version}" + " --package 'system-images;android-${android_version};default;x86_64'" - sh "/home/user/android/sdk/emulator/emulator -no-window -no-boot-anim -noaudio -avd android${android_version}" + sh "/home/user/android/sdk/emulator/emulator -no-window -no-boot-anim -noaudio -avd android${android_version} > ${stageName}_emulator.log 2>&1 &" } def waitForEmulatorAndPressWakeUpKey() { @@ -97,6 +97,7 @@ pipeline { stage('Build Debug-APK') { steps { sh "java --version" + sh "whoami" sh "./gradlew -Pindependent='#$env.BUILD_NUMBER $env.BRANCH_NAME' assembleDebug" archiveArtifacts 'app/build/outputs/apk/debug/paintroid-debug*.apk' plot csvFileName: 'dexcount.csv', csvSeries: [[displayTableFlag: false, exclusionValues: '', file: 'Paintroid/build/outputs/dexcount/*.csv', inclusionFlag: 'OFF', url: '']], group: 'APK Stats', numBuilds: '180', style: 'line', title: 'dexcount' From 5022ea14e3a1f30860a2434ba80950f73be334f5 Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Tue, 26 Aug 2025 17:25:26 +0200 Subject: [PATCH 09/28] Update Jenkinsfile --- Jenkinsfile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 19de81e34d..8f97c55df9 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -168,7 +168,8 @@ pipeline { } post { always { - sh '/home/user/android/sdk/platform-tools/adb logcat -d > logcat.txt' + archiveArtifacts "device_tests_emulator.log" + // sh '/home/user/android/sdk/platform-tools/adb logcat -d > logcat.txt' sh './gradlew stopEmulator' junitAndCoverage "$reports/coverage/debug/report.xml", 'device', javaSrc archiveArtifacts 'logcat.txt' @@ -188,9 +189,7 @@ pipeline { post { always { steps { - step([$class: 'LogParserPublisher', failBuildOnError: true, projectRulePath: 'buildScripts/log_parser_rules', unstableOnWarning: true, useProjectRule: true]) - archiveArtifacts "${stageName}_emulator.log" - + step([$class: 'LogParserPublisher', failBuildOnError: true, projectRulePath: 'buildScripts/log_parser_rules', unstableOnWarning: true, useProjectRule: true]) } } changed { From 62a7f646bbf24a3b66b68cb450d90ac889d61080 Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Tue, 26 Aug 2025 17:43:38 +0200 Subject: [PATCH 10/28] Update Jenkinsfile --- Jenkinsfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 8f97c55df9..a60041934b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -14,6 +14,7 @@ class DockerParameters { def dockerParameters = new DockerParameters() def startEmulator(String android_version, String stageName) { + sh "whoami" sh 'adb start-server' // creates a new avd, and if it already exists it does nothing. sh "echo no | avdmanager create avd --force --name android${android_version}" + " --package 'system-images;android-${android_version};default;x86_64'" @@ -22,7 +23,7 @@ def startEmulator(String android_version, String stageName) { def waitForEmulatorAndPressWakeUpKey() { sh 'adb devices' - sh 'timeout 5m adb wait-for-device' + // sh 'timeout 5m adb wait-for-device' sh '''#!/bin/bash adb devices timeout 5m adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; From 7400410ded571578ebe1771ed84888b60db99310 Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Tue, 26 Aug 2025 17:54:29 +0200 Subject: [PATCH 11/28] Update Jenkinsfile --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index a60041934b..9bb33e6e80 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,7 +5,7 @@ class DockerParameters { // 'docker build' would normally copy the whole build-dir to the container, changing the // docker build directory avoids that overhead def dir = 'docker' - def args = '--user 1000:1000 --device /dev/kvm:/dev/kvm -v /var/local/container_shared/gradle_cache/$EXECUTOR_NUMBER:/home/user/.gradle -m=6.5G' + def args = '--device /dev/kvm:/dev/kvm -v /var/local/container_shared/gradle_cache/$EXECUTOR_NUMBER:/home/user/.gradle -m=6.5G' def label = 'LimitedEmulator' def image = 'floriankanduth/devops-846:bullseye' From c66e61087cfb4dff687a7a8ff212c4c20d07f181 Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Wed, 27 Aug 2025 14:21:11 +0200 Subject: [PATCH 12/28] Update Jenkinsfile --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 9bb33e6e80..f551dbc66f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,7 +7,7 @@ class DockerParameters { def dir = 'docker' def args = '--device /dev/kvm:/dev/kvm -v /var/local/container_shared/gradle_cache/$EXECUTOR_NUMBER:/home/user/.gradle -m=6.5G' def label = 'LimitedEmulator' - def image = 'floriankanduth/devops-846:bullseye' + def image = 'floriankanduth/paintroid_java17:latest' } From 9af3b7dfc93ff31dea21de3375e03399f93fb9eb Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Wed, 27 Aug 2025 15:23:12 +0200 Subject: [PATCH 13/28] Update Jenkinsfile --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index f551dbc66f..fceec5f666 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,7 +7,7 @@ class DockerParameters { def dir = 'docker' def args = '--device /dev/kvm:/dev/kvm -v /var/local/container_shared/gradle_cache/$EXECUTOR_NUMBER:/home/user/.gradle -m=6.5G' def label = 'LimitedEmulator' - def image = 'floriankanduth/paintroid_java17:latest' + def image = 'floriankanduth/devops-846:eclipse' } From a6f2cded0c829bc5d0ebb1279aa49e9f414d4819 Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Thu, 28 Aug 2025 13:32:25 +0200 Subject: [PATCH 14/28] add kvm debug cmds --- Jenkinsfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index fceec5f666..913de809e0 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -99,6 +99,8 @@ pipeline { steps { sh "java --version" sh "whoami" + sh "egrep -c '(vmx|svm)' /proc/cpuinfo" + sh "kvm-ok" sh "./gradlew -Pindependent='#$env.BUILD_NUMBER $env.BRANCH_NAME' assembleDebug" archiveArtifacts 'app/build/outputs/apk/debug/paintroid-debug*.apk' plot csvFileName: 'dexcount.csv', csvSeries: [[displayTableFlag: false, exclusionValues: '', file: 'Paintroid/build/outputs/dexcount/*.csv', inclusionFlag: 'OFF', url: '']], group: 'APK Stats', numBuilds: '180', style: 'line', title: 'dexcount' From e9266a3e921b3d988e74b7534bc897e9947de9ad Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Thu, 28 Aug 2025 13:36:40 +0200 Subject: [PATCH 15/28] switch to bullseye --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 913de809e0..5f15b1cef4 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,7 +7,7 @@ class DockerParameters { def dir = 'docker' def args = '--device /dev/kvm:/dev/kvm -v /var/local/container_shared/gradle_cache/$EXECUTOR_NUMBER:/home/user/.gradle -m=6.5G' def label = 'LimitedEmulator' - def image = 'floriankanduth/devops-846:eclipse' + def image = 'floriankanduth/devops-846:bullseye' } From 3880a06c1f82e90db6149673856ea365c1b45d00 Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Wed, 1 Oct 2025 14:03:40 +0200 Subject: [PATCH 16/28] Update Jenkinsfile run container in privileged mode --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 5f15b1cef4..431eb06049 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,7 +5,7 @@ class DockerParameters { // 'docker build' would normally copy the whole build-dir to the container, changing the // docker build directory avoids that overhead def dir = 'docker' - def args = '--device /dev/kvm:/dev/kvm -v /var/local/container_shared/gradle_cache/$EXECUTOR_NUMBER:/home/user/.gradle -m=6.5G' + def args = '--privileged --device /dev/kvm:/dev/kvm -v /var/local/container_shared/gradle_cache/$EXECUTOR_NUMBER:/home/user/.gradle -m=6.5G' def label = 'LimitedEmulator' def image = 'floriankanduth/devops-846:bullseye' From 19a3381f7c75ae59bc197c7bdfa6eab1e3f2e986 Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Wed, 1 Oct 2025 14:13:17 +0200 Subject: [PATCH 17/28] Update Jenkinsfile remove privileged again --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 431eb06049..5f15b1cef4 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,7 +5,7 @@ class DockerParameters { // 'docker build' would normally copy the whole build-dir to the container, changing the // docker build directory avoids that overhead def dir = 'docker' - def args = '--privileged --device /dev/kvm:/dev/kvm -v /var/local/container_shared/gradle_cache/$EXECUTOR_NUMBER:/home/user/.gradle -m=6.5G' + def args = '--device /dev/kvm:/dev/kvm -v /var/local/container_shared/gradle_cache/$EXECUTOR_NUMBER:/home/user/.gradle -m=6.5G' def label = 'LimitedEmulator' def image = 'floriankanduth/devops-846:bullseye' From fae4218f52fbaf458f5dde66875a84e955993bac Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Thu, 2 Oct 2025 18:00:55 +0200 Subject: [PATCH 18/28] Update Jenkinsfile to use eclipse docker image --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 5f15b1cef4..913de809e0 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,7 +7,7 @@ class DockerParameters { def dir = 'docker' def args = '--device /dev/kvm:/dev/kvm -v /var/local/container_shared/gradle_cache/$EXECUTOR_NUMBER:/home/user/.gradle -m=6.5G' def label = 'LimitedEmulator' - def image = 'floriankanduth/devops-846:bullseye' + def image = 'floriankanduth/devops-846:eclipse' } From ef3979f7729ead33e8a8e7389b5cd02ed38dfb1e Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Fri, 3 Oct 2025 14:52:52 +0200 Subject: [PATCH 19/28] remove disableAnimations in Jenkinsfile animations are already disabled --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 913de809e0..40287f1350 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -166,7 +166,7 @@ pipeline { catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') { startEmulator(ANDROID_VERSION, 'device_tests') waitForEmulatorAndPressWakeUpKey() - sh "./gradlew disableAnimations -PenableCoverage -Pjenkins -Pemulator=android${android_version} -Pci createDebugCoverageReport -i" + sh "./gradlew -PenableCoverage -Pjenkins -Pemulator=android${android_version} -Pci createDebugCoverageReport -i" } } post { From 97793bee8ecc413c44cfd8db79cf8676362e3be8 Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:12:42 +0200 Subject: [PATCH 20/28] remove debug commands --- Jenkinsfile | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 40287f1350..70b7a94c2f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -14,11 +14,10 @@ class DockerParameters { def dockerParameters = new DockerParameters() def startEmulator(String android_version, String stageName) { - sh "whoami" sh 'adb start-server' // creates a new avd, and if it already exists it does nothing. sh "echo no | avdmanager create avd --force --name android${android_version}" + " --package 'system-images;android-${android_version};default;x86_64'" - sh "/home/user/android/sdk/emulator/emulator -no-window -no-boot-anim -noaudio -avd android${android_version} > ${stageName}_emulator.log 2>&1 &" + sh "emulator -no-window -no-boot-anim -noaudio -avd android${android_version} > ${stageName}_emulator.log 2>&1 &" } def waitForEmulatorAndPressWakeUpKey() { @@ -97,10 +96,6 @@ pipeline { stages { stage('Build Debug-APK') { steps { - sh "java --version" - sh "whoami" - sh "egrep -c '(vmx|svm)' /proc/cpuinfo" - sh "kvm-ok" sh "./gradlew -Pindependent='#$env.BUILD_NUMBER $env.BRANCH_NAME' assembleDebug" archiveArtifacts 'app/build/outputs/apk/debug/paintroid-debug*.apk' plot csvFileName: 'dexcount.csv', csvSeries: [[displayTableFlag: false, exclusionValues: '', file: 'Paintroid/build/outputs/dexcount/*.csv', inclusionFlag: 'OFF', url: '']], group: 'APK Stats', numBuilds: '180', style: 'line', title: 'dexcount' From e1ca2f2cfa5310b69eb002ea7d70a7dfb63cbada Mon Sep 17 00:00:00 2001 From: Florian Kanduth Date: Wed, 8 Oct 2025 16:13:17 +0200 Subject: [PATCH 21/28] add helper build scripts --- Jenkinsfile | 28 +------------- buildScripts/build_and_test.sh | 14 +++++++ buildScripts/startEmulator.sh | 20 ++++++++++ docker/Dockerfile.jenkins | 71 +++++++++++++++------------------- 4 files changed, 67 insertions(+), 66 deletions(-) create mode 100755 buildScripts/build_and_test.sh create mode 100755 buildScripts/startEmulator.sh diff --git a/Jenkinsfile b/Jenkinsfile index 70b7a94c2f..ae6548a54b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -13,32 +13,6 @@ class DockerParameters { def dockerParameters = new DockerParameters() -def startEmulator(String android_version, String stageName) { - sh 'adb start-server' - // creates a new avd, and if it already exists it does nothing. - sh "echo no | avdmanager create avd --force --name android${android_version}" + " --package 'system-images;android-${android_version};default;x86_64'" - sh "emulator -no-window -no-boot-anim -noaudio -avd android${android_version} > ${stageName}_emulator.log 2>&1 &" -} - -def waitForEmulatorAndPressWakeUpKey() { - sh 'adb devices' - // sh 'timeout 5m adb wait-for-device' - sh '''#!/bin/bash -adb devices -timeout 5m adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; -done' -echo "Emulator started" -''' - sh ''' - adb shell settings put global window_animation_scale 0 & - adb shell settings put global transition_animation_scale 0 & - adb shell settings put global animator_duration_scale 0 & - ''' - - // In case the device went to sleep - sh 'adb shell input keyevent KEYCODE_WAKEUP' -} - def reports = 'Paintroid/build/reports' // place the cobertura xml relative to the source, so that the source can be found @@ -159,7 +133,7 @@ pipeline { stage('Device Tests') { steps { catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') { - startEmulator(ANDROID_VERSION, 'device_tests') + sh "./buildScripts/startEmulator.sh ${android_version} device_tests" waitForEmulatorAndPressWakeUpKey() sh "./gradlew -PenableCoverage -Pjenkins -Pemulator=android${android_version} -Pci createDebugCoverageReport -i" } diff --git a/buildScripts/build_and_test.sh b/buildScripts/build_and_test.sh new file mode 100755 index 0000000000..bac9f71e35 --- /dev/null +++ b/buildScripts/build_and_test.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -euo pipefail + +android_version=$1 + +cd .. +./gradlew assembleDebug +./gradlew pmd checkstyle lint detekt +./gradlew -PenableCoverage -Pjenkins jacocoTestDebugUnitTestReport + +./buildScripts/startEmulator.sh "$android_version" manual_test + +./gradlew -PenableCoverage -Pjenkins -Pemulator=android"${android_version}" -Pci createDebugCoverageReport -i +./gradlew stopEmulator \ No newline at end of file diff --git a/buildScripts/startEmulator.sh b/buildScripts/startEmulator.sh new file mode 100755 index 0000000000..4617573d1a --- /dev/null +++ b/buildScripts/startEmulator.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -euo pipefail + +android_version=$1 +stageName=$2 +echo "Starting emulator" +adb start-server +echo no | avdmanager create avd --force --name "android${android_version}" --package "system-images;android-${android_version};default;x86_64" +emulator -no-window -no-boot-anim -noaudio -avd "android${android_version}" > "${stageName}_emulator.log" 2>&1 & + +adb devices +timeout 5m adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1;done' +echo "Emulator started" + +echo "Disable Animations" +adb shell settings put global window_animation_scale 0 & +adb shell settings put global transition_animation_scale 0 & +adb shell settings put global animator_duration_scale 0 & + +adb shell input keyevent KEYCODE_WAKEUP diff --git a/docker/Dockerfile.jenkins b/docker/Dockerfile.jenkins index 5435e5f0b4..6373d4f5cd 100644 --- a/docker/Dockerfile.jenkins +++ b/docker/Dockerfile.jenkins @@ -1,65 +1,55 @@ -FROM debian:bullseye +FROM eclipse-temurin:11-jdk-jammy@sha256:f2e5cb53ab0fbcf0b4e0cbe963f684f524ea493835e6c36617536caac53ad4b6 # Android Dependencies # -------------------- -# Adapt the paramters below to change the dependencies. +# Adapt the parameters below to change the dependencies. # ARG ANDROID_API_LEVEL=28 ARG ANDROID_BUILD_TOOLS_LEVEL=30.0.3 ARG ANDROID_NDK_VERSION=21.1.6352462 ARG ANDROID_CLI_TOOLS_URL="https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip" -ARG SDKMANAGER_PACKAGES="build-tools;${ANDROID_BUILD_TOOLS_LEVEL} platforms;android-$ANDROID_API_LEVEL cmake;3.6.4111459 system-images;android-28;default;x86_64" +ARG SDKMANAGER_PACKAGES="build-tools;${ANDROID_BUILD_TOOLS_LEVEL} platforms;android-$ANDROID_API_LEVEL cmake;3.6.4111459 system-images;android-28;default;x86_64 emulator" # Arguments, Environment # ---------------------- # # Default values for the arguments to be passed from the Jenkinsfile. # Those contain the uid and gid of the Jenkins user, and are used to # create this user inside of the container, needed for eg ssh-agent to work + ARG USER_ID=1000 ARG USER_HOME=/home/user ARG GROUP_ID=1000 ARG KVM_GROUP_ID=999 + # Environment variables that are needed by the build job. ENV ANDROID_SDK_ROOT=$USER_HOME/android/sdk ENV ANDROID_AVD_HOME=$USER_HOME/avds + # Deprecated: Still used by gradle, once gradle respects ANDROID_SDK_ROOT, this can be removed ENV ANDROID_HOME=$ANDROID_SDK_ROOT -ENV PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin +ENV PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator ARG _SDKMANAGER=$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager + # System Packages # --------------- # -# curl/openssh-client: upload to web/share # x11-commons/x11-utils/libpulse0 needed to start emulator RUN apt-get update && apt-get install -y --no-install-recommends \ - curl \ - unzip \ - openssh-client \ - x11-common \ - x11-utils \ + git \ + gnupg \ + less \ + libasound2 \ + libnss3-dev \ libpulse0 \ libxcursor-dev \ - libnss3-dev \ - libasound2 \ - wget \ - gnupg \ + make \ + python2 \ software-properties-common \ + unzip \ + x11-common \ + x11-utils \ && rm -rf /var/lib/apt/lists/* -# Install Fastlane -RUN apt-get update -RUN apt-get install -y python2 -RUN apt-get install -y --no-install-recommends \ - openjdk-11-jdk-headless \ - #ruby-full \ - rubygems \ - ruby-dev \ - g++ \ - make \ - less \ - git \ - && rm -rf /var/lib/apt/lists/* \ - && gem install rake \ - && gem install fastlane -NV + # User Management # --------------- # @@ -78,22 +68,23 @@ RUN mkdir -p $ANDROID_AVD_HOME # ------------------ # ARG _CMD_LINE=$ANDROID_SDK_ROOT/cmdline-tools -RUN curl $ANDROID_CLI_TOOLS_URL --output /tmp/android_sdk.zip \ - && mkdir -p $ANDROID_SDK_ROOT \ +ADD --chown=user:user $ANDROID_CLI_TOOLS_URL /tmp/android_sdk.zip +RUN mkdir -p $ANDROID_SDK_ROOT \ && unzip -d $ANDROID_SDK_ROOT /tmp/android_sdk.zip \ && rm /tmp/android_sdk.zip \ && mkdir -p $_CMD_LINE/latest \ && mv $_CMD_LINE/bin $_CMD_LINE/lib $_CMD_LINE/source.properties $_CMD_LINE/latest/ # Android NDK # ---------------- +# (unused) +# RUN if [ ! -z "$ANDROID_NDK_URL" ]; then \ +# curl $ANDROID_NDK_URL --output /tmp/android_ndk.zip \ +# && mkdir -p $ANDROID_SDK_ROOT /tmp/ndk \ +# && unzip -d /tmp/ndk /tmp/android_ndk.zip \ +# && mv /tmp/ndk/* $ANDROID_SDK_ROOT/ndk-bundle \ +# && rm /tmp/android_ndk.zip; \ +# fi # -RUN if [ ! -z "$ANDROID_NDK_URL" ]; then \ - curl $ANDROID_NDK_URL --output /tmp/android_ndk.zip \ - && mkdir -p $ANDROID_SDK_ROOT /tmp/ndk \ - && unzip -d /tmp/ndk /tmp/android_ndk.zip \ - && mv /tmp/ndk/* $ANDROID_SDK_ROOT/ndk-bundle \ - && rm /tmp/android_ndk.zip; \ - fi # Installing SDK Packages # ----------------------- # @@ -108,4 +99,6 @@ RUN if [ ! -z "$SDKMANAGER_PACKAGES" ]; then yes | $_SDKMANAGER $SDKMANAGER_PACK # are respected, no matter what is configured elsewhere. ENV _JAVA_OPTIONS="-XX:+UnlockExperimentalVMOptions" # Accept SDK licenses -RUN yes | $_SDKMANAGER --licenses \ No newline at end of file +RUN yes | $_SDKMANAGER --licenses + +CMD ["bash"] From 445bc42a6c38adce7de6977905dc7bea6c23e1e7 Mon Sep 17 00:00:00 2001 From: Florian Kanduth Date: Wed, 8 Oct 2025 16:20:57 +0200 Subject: [PATCH 22/28] removed undefined function --- Jenkinsfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index ae6548a54b..f5e2e65b2a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -134,7 +134,6 @@ pipeline { steps { catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') { sh "./buildScripts/startEmulator.sh ${android_version} device_tests" - waitForEmulatorAndPressWakeUpKey() sh "./gradlew -PenableCoverage -Pjenkins -Pemulator=android${android_version} -Pci createDebugCoverageReport -i" } } From bf01f42f9b3f1d7db0c95865e900a738db4ca3c1 Mon Sep 17 00:00:00 2001 From: Florian Kanduth Date: Wed, 8 Oct 2025 17:25:16 +0200 Subject: [PATCH 23/28] remove unnecessary packages from container --- buildScripts/startEmulator.sh | 1 + docker/{Dockerfile.jenkins => dockerfile} | 25 ++++++++++++----------- 2 files changed, 14 insertions(+), 12 deletions(-) rename docker/{Dockerfile.jenkins => dockerfile} (90%) diff --git a/buildScripts/startEmulator.sh b/buildScripts/startEmulator.sh index 4617573d1a..ba77ea523d 100755 --- a/buildScripts/startEmulator.sh +++ b/buildScripts/startEmulator.sh @@ -8,6 +8,7 @@ adb start-server echo no | avdmanager create avd --force --name "android${android_version}" --package "system-images;android-${android_version};default;x86_64" emulator -no-window -no-boot-anim -noaudio -avd "android${android_version}" > "${stageName}_emulator.log" 2>&1 & +echo "Wait for device..." adb devices timeout 5m adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1;done' echo "Emulator started" diff --git a/docker/Dockerfile.jenkins b/docker/dockerfile similarity index 90% rename from docker/Dockerfile.jenkins rename to docker/dockerfile index 6373d4f5cd..6aa071ed51 100644 --- a/docker/Dockerfile.jenkins +++ b/docker/dockerfile @@ -36,15 +36,15 @@ ARG _SDKMANAGER=$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager # x11-commons/x11-utils/libpulse0 needed to start emulator RUN apt-get update && apt-get install -y --no-install-recommends \ git \ - gnupg \ - less \ - libasound2 \ - libnss3-dev \ - libpulse0 \ - libxcursor-dev \ - make \ +# gnupg \ +# less \ +# libasound2 \ +# libnss3-dev \ +# libpulse0 \ +# libxcursor-dev \ +# make \ python2 \ - software-properties-common \ +# software-properties-common \ unzip \ x11-common \ x11-utils \ @@ -55,10 +55,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ # # add the 'Jenkins' user # Add group of the user used by Jenkins during building. -RUN if [ ! $(getent group $GROUP_ID) ]; then groupadd -g $GROUP_ID user; fi -RUN groupadd -g $KVM_GROUP_ID kvm -RUN mkdir -p catroid/build/reports/jacoco/jacocoTestCatroidDebugUnitTestReport/html -RUN mkdir -p catroid/build/reports/coverage/catroid/debug/ +RUN if [ ! $(getent group $GROUP_ID) ]; then groupadd -g $GROUP_ID user; fi &&\ + groupadd -g $KVM_GROUP_ID kvm &&\ + mkdir -p catroid/build/reports/jacoco/jacocoTestCatroidDebugUnitTestReport/html &&\ + mkdir -p catroid/build/reports/coverage/catroid/debug/ + # Add the user used by Jenkins during building. RUN useradd -m -u $USER_ID -g $GROUP_ID -G $KVM_GROUP_ID -d $USER_HOME -s /usr/sbin/nologin user # Run all other commands as user From 18caacbc9506756c51028dfd9bcb77f08f1ba44e Mon Sep 17 00:00:00 2001 From: Florian Kanduth Date: Thu, 9 Oct 2025 11:17:10 +0200 Subject: [PATCH 24/28] test building dockerfile on jenkins --- Dockerfile | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Jenkinsfile | 9 +---- 2 files changed, 111 insertions(+), 8 deletions(-) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..0c2ac743f2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,110 @@ +FROM eclipse-temurin:11-jdk-jammy@sha256:f2e5cb53ab0fbcf0b4e0cbe963f684f524ea493835e6c36617536caac53ad4b6 +# Android Dependencies +# -------------------- +# Adapt the parameters below to change the dependencies. +# + +ARG ANDROID_API_LEVEL=28 +ARG ANDROID_BUILD_TOOLS_LEVEL=30.0.3 +ARG ANDROID_NDK_VERSION=21.1.6352462 +ARG ANDROID_CLI_TOOLS_URL="https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip" +ARG SDKMANAGER_PACKAGES="build-tools;${ANDROID_BUILD_TOOLS_LEVEL} platforms;android-$ANDROID_API_LEVEL cmake;3.6.4111459 system-images;android-28;default;x86_64 emulator" + +# Arguments, Environment +# ---------------------- +# +# Default values for the arguments to be passed from the Jenkinsfile. +# Those contain the uid and gid of the Jenkins user, and are used to +# create this user inside of the container, needed for eg ssh-agent to work + +ARG USER_ID=1000 +ARG USER_HOME=/home/user +ARG GROUP_ID=1000 +ARG KVM_GROUP_ID=999 + +# SDK paths +ARG _SDKMANAGER=$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager +ARG _CMD_LINE=$ANDROID_SDK_ROOT/cmdline-tools +ARG _SDK_TMP_ZIP=/tmp/android_sdk.zip +# Environment variables that are needed by the build job. +ENV ANDROID_SDK_ROOT=$USER_HOME/android/sdk +ENV ANDROID_AVD_HOME=$USER_HOME/avds + +# Deprecated: Still used by gradle, once gradle respects ANDROID_SDK_ROOT, this can be removed +ENV ANDROID_HOME=$ANDROID_SDK_ROOT +ENV PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator + +# Performance related settings for the JVM +# - Respect the cgroup settings for memory. +# +# Note: Usage of _JAVA_OPTIONS is in general discouraged. +# This is an internal flag that will be preferred over +# JAVA_TOOL_OPTIONS and the command line parameters. +# We still use it here to ensure that these settings +# are respected, no matter what is configured elsewhere. +ENV _JAVA_OPTIONS="-XX:+UnlockExperimentalVMOptions" + +# System Packages +# --------------- +# +# x11-commons/x11-utils/libpulse0 needed to start emulator +RUN apt-get update && apt-get install -y --no-install-recommends \ + git=1:2.34.1-1ubuntu1.15 \ + libasound2 \ + libnss3-dev \ + libpulse0 \ + libxcursor-dev \ + python2-minimal=2.7.* \ + unzip \ + x11-common \ + x11-utils \ + && rm -rf /var/lib/apt/lists/* + +# User Management +# --------------- +# +# add the 'Jenkins' user +# Add group of the user used by Jenkins during building. +RUN if [ ! $(getent group $GROUP_ID) ]; then groupadd -g $GROUP_ID user; fi &&\ + groupadd -g $KVM_GROUP_ID kvm &&\ + mkdir -p catroid/build/reports/jacoco/jacocoTestCatroidDebugUnitTestReport/html &&\ + mkdir -p catroid/build/reports/coverage/catroid/debug/ + +# Add the user used by Jenkins during building. +RUN useradd -m -u $USER_ID -g $GROUP_ID -G $KVM_GROUP_ID -d $USER_HOME -s /usr/sbin/nologin user +# Run all other commands as user +USER user +RUN mkdir -p $ANDROID_AVD_HOME + +# Android SDK +# ------------------ +# + +ADD --chown=user:user $ANDROID_CLI_TOOLS_URL $_SDK_TMP_ZIP +RUN mkdir -p $ANDROID_SDK_ROOT \ + && unzip -d $ANDROID_SDK_ROOT $_SDK_TMP_ZIP \ + && rm $_SDK_TMP_ZIP \ + && mkdir -p $_CMD_LINE/latest \ + && mv $_CMD_LINE/bin $_CMD_LINE/lib $_CMD_LINE/source.properties $_CMD_LINE/latest/ \ + +# Android NDK (unused) +# ---------------- +# +# RUN if [ ! -z "$ANDROID_NDK_URL" ]; then \ +# curl $ANDROID_NDK_URL --output /tmp/android_ndk.zip \ +# && mkdir -p $ANDROID_SDK_ROOT /tmp/ndk \ +# && unzip -d /tmp/ndk /tmp/android_ndk.zip \ +# && mv /tmp/ndk/* $ANDROID_SDK_ROOT/ndk-bundle \ +# && rm /tmp/android_ndk.zip; \ +# fi +# + +# Installing SDK Packages +# ----------------------- +# +RUN if [ ! -z "$SDKMANAGER_PACKAGES" ]; then yes | $_SDKMANAGER $SDKMANAGER_PACKAGES; fi + +# Accept SDK licenses +RUN yes | $_SDKMANAGER --licenses + +CMD ["bash"] diff --git a/Jenkinsfile b/Jenkinsfile index f5e2e65b2a..e48cf4161b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -47,14 +47,7 @@ pipeline { string name: 'CATROID_BRANCH', defaultValue: 'develop', description: 'The branch which to build catroid with, when BUILD_WITH_CATROID is checked.' } - agent { - docker { - image dockerParameters.image - args dockerParameters.args - label dockerParameters.label - alwaysPull true - } - } + agent { dockerfile true } options { timeout(time: 2, unit: 'HOURS') From e85a07b84446dd60d477e37a335a8afb39a0101a Mon Sep 17 00:00:00 2001 From: Florian Kanduth Date: Thu, 9 Oct 2025 11:17:10 +0200 Subject: [PATCH 25/28] test building dockerfile on jenkins --- Dockerfile | 111 ++++++++++++++++++++++++++++++++++++++++++++++ Jenkinsfile | 9 +--- docker/dockerfile | 62 ++++++++++++++------------ 3 files changed, 146 insertions(+), 36 deletions(-) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..b4e5f727e2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,111 @@ +FROM eclipse-temurin:11-jdk-jammy@sha256:f2e5cb53ab0fbcf0b4e0cbe963f684f524ea493835e6c36617536caac53ad4b6 +# Android Dependencies +# -------------------- +# Adapt the parameters below to change the dependencies. +# + +ARG ANDROID_API_LEVEL=28 +ARG ANDROID_BUILD_TOOLS_LEVEL=30.0.3 +ARG ANDROID_NDK_VERSION=21.1.6352462 +ARG ANDROID_CLI_TOOLS_URL="https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip" +ARG SDKMANAGER_PACKAGES="build-tools;${ANDROID_BUILD_TOOLS_LEVEL} platforms;android-$ANDROID_API_LEVEL cmake;3.6.4111459 system-images;android-28;default;x86_64 emulator" + +# Arguments, Environment +# ---------------------- +# +# Default values for the arguments to be passed from the Jenkinsfile. +# Those contain the uid and gid of the Jenkins user, and are used to +# create this user inside of the container, needed for eg ssh-agent to work + +ARG USER_ID=1000 +ARG USER_HOME=/home/user +ARG GROUP_ID=1000 +ARG KVM_GROUP_ID=999 + +# Environment variables that are needed by the build job. +ENV ANDROID_SDK_ROOT=$USER_HOME/android/sdk +ENV ANDROID_AVD_HOME=$USER_HOME/avds + +# SDK paths +ARG _SDKMANAGER=$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager +ARG _CMD_LINE=$ANDROID_SDK_ROOT/cmdline-tools +ARG _SDK_TMP_ZIP=/tmp/android_sdk.zip + +# Deprecated: Still used by gradle, once gradle respects ANDROID_SDK_ROOT, this can be removed +ENV ANDROID_HOME=$ANDROID_SDK_ROOT +ENV PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator + +# Performance related settings for the JVM +# - Respect the cgroup settings for memory. +# +# Note: Usage of _JAVA_OPTIONS is in general discouraged. +# This is an internal flag that will be preferred over +# JAVA_TOOL_OPTIONS and the command line parameters. +# We still use it here to ensure that these settings +# are respected, no matter what is configured elsewhere. +ENV _JAVA_OPTIONS="-XX:+UnlockExperimentalVMOptions" + +# System Packages +# --------------- +# +# x11-commons/x11-utils/libpulse0 needed to start emulator +RUN apt-get update && apt-get install -y --no-install-recommends \ + git=1:2.34.1-1ubuntu1.15 \ + libasound2 \ + libnss3-dev \ + libpulse0 \ + libxcursor-dev \ + python2-minimal=2.7.* \ + unzip \ + x11-common \ + x11-utils \ + && rm -rf /var/lib/apt/lists/* + +# User Management +# --------------- +# +# add the 'Jenkins' user +# Add group of the user used by Jenkins during building. +RUN if [ ! $(getent group $GROUP_ID) ]; then groupadd -g $GROUP_ID user; fi &&\ + groupadd -g $KVM_GROUP_ID kvm &&\ + mkdir -p catroid/build/reports/jacoco/jacocoTestCatroidDebugUnitTestReport/html &&\ + mkdir -p catroid/build/reports/coverage/catroid/debug/ + +# Add the user used by Jenkins during building. +RUN useradd -m -u $USER_ID -g $GROUP_ID -G $KVM_GROUP_ID -d $USER_HOME -s /usr/sbin/nologin user +# Run all other commands as user +USER user +RUN mkdir -p $ANDROID_AVD_HOME + +# Android SDK +# ------------------ +# + +ADD --chown=user:user $ANDROID_CLI_TOOLS_URL $_SDK_TMP_ZIP +RUN mkdir -p $ANDROID_SDK_ROOT \ + && unzip -d $ANDROID_SDK_ROOT $_SDK_TMP_ZIP \ + && rm $_SDK_TMP_ZIP \ + && mkdir -p $_CMD_LINE/latest \ + && mv $_CMD_LINE/bin $_CMD_LINE/lib $_CMD_LINE/source.properties $_CMD_LINE/latest/ + +# Android NDK (unused) +# ---------------- +# +# RUN if [ ! -z "$ANDROID_NDK_URL" ]; then \ +# curl $ANDROID_NDK_URL --output /tmp/android_ndk.zip \ +# && mkdir -p $ANDROID_SDK_ROOT /tmp/ndk \ +# && unzip -d /tmp/ndk /tmp/android_ndk.zip \ +# && mv /tmp/ndk/* $ANDROID_SDK_ROOT/ndk-bundle \ +# && rm /tmp/android_ndk.zip; \ +# fi +# + +# Installing SDK Packages +# ----------------------- +# +RUN if [ ! -z "$SDKMANAGER_PACKAGES" ]; then yes | $_SDKMANAGER $SDKMANAGER_PACKAGES; fi + +# Accept SDK licenses +RUN yes | $_SDKMANAGER --licenses + +CMD ["bash"] diff --git a/Jenkinsfile b/Jenkinsfile index f5e2e65b2a..e48cf4161b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -47,14 +47,7 @@ pipeline { string name: 'CATROID_BRANCH', defaultValue: 'develop', description: 'The branch which to build catroid with, when BUILD_WITH_CATROID is checked.' } - agent { - docker { - image dockerParameters.image - args dockerParameters.args - label dockerParameters.label - alwaysPull true - } - } + agent { dockerfile true } options { timeout(time: 2, unit: 'HOURS') diff --git a/docker/dockerfile b/docker/dockerfile index 6aa071ed51..b4e5f727e2 100644 --- a/docker/dockerfile +++ b/docker/dockerfile @@ -9,6 +9,7 @@ ARG ANDROID_BUILD_TOOLS_LEVEL=30.0.3 ARG ANDROID_NDK_VERSION=21.1.6352462 ARG ANDROID_CLI_TOOLS_URL="https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip" ARG SDKMANAGER_PACKAGES="build-tools;${ANDROID_BUILD_TOOLS_LEVEL} platforms;android-$ANDROID_API_LEVEL cmake;3.6.4111459 system-images;android-28;default;x86_64 emulator" + # Arguments, Environment # ---------------------- # @@ -25,26 +26,36 @@ ARG KVM_GROUP_ID=999 ENV ANDROID_SDK_ROOT=$USER_HOME/android/sdk ENV ANDROID_AVD_HOME=$USER_HOME/avds +# SDK paths +ARG _SDKMANAGER=$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager +ARG _CMD_LINE=$ANDROID_SDK_ROOT/cmdline-tools +ARG _SDK_TMP_ZIP=/tmp/android_sdk.zip + # Deprecated: Still used by gradle, once gradle respects ANDROID_SDK_ROOT, this can be removed ENV ANDROID_HOME=$ANDROID_SDK_ROOT ENV PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator -ARG _SDKMANAGER=$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager + +# Performance related settings for the JVM +# - Respect the cgroup settings for memory. +# +# Note: Usage of _JAVA_OPTIONS is in general discouraged. +# This is an internal flag that will be preferred over +# JAVA_TOOL_OPTIONS and the command line parameters. +# We still use it here to ensure that these settings +# are respected, no matter what is configured elsewhere. +ENV _JAVA_OPTIONS="-XX:+UnlockExperimentalVMOptions" # System Packages # --------------- # # x11-commons/x11-utils/libpulse0 needed to start emulator RUN apt-get update && apt-get install -y --no-install-recommends \ - git \ -# gnupg \ -# less \ -# libasound2 \ -# libnss3-dev \ -# libpulse0 \ -# libxcursor-dev \ -# make \ - python2 \ -# software-properties-common \ + git=1:2.34.1-1ubuntu1.15 \ + libasound2 \ + libnss3-dev \ + libpulse0 \ + libxcursor-dev \ + python2-minimal=2.7.* \ unzip \ x11-common \ x11-utils \ @@ -65,19 +76,21 @@ RUN useradd -m -u $USER_ID -g $GROUP_ID -G $KVM_GROUP_ID -d $USER_HOME -s /usr/s # Run all other commands as user USER user RUN mkdir -p $ANDROID_AVD_HOME + # Android SDK # ------------------ # -ARG _CMD_LINE=$ANDROID_SDK_ROOT/cmdline-tools -ADD --chown=user:user $ANDROID_CLI_TOOLS_URL /tmp/android_sdk.zip + +ADD --chown=user:user $ANDROID_CLI_TOOLS_URL $_SDK_TMP_ZIP RUN mkdir -p $ANDROID_SDK_ROOT \ - && unzip -d $ANDROID_SDK_ROOT /tmp/android_sdk.zip \ - && rm /tmp/android_sdk.zip \ - && mkdir -p $_CMD_LINE/latest \ - && mv $_CMD_LINE/bin $_CMD_LINE/lib $_CMD_LINE/source.properties $_CMD_LINE/latest/ -# Android NDK + && unzip -d $ANDROID_SDK_ROOT $_SDK_TMP_ZIP \ + && rm $_SDK_TMP_ZIP \ + && mkdir -p $_CMD_LINE/latest \ + && mv $_CMD_LINE/bin $_CMD_LINE/lib $_CMD_LINE/source.properties $_CMD_LINE/latest/ + +# Android NDK (unused) # ---------------- -# (unused) +# # RUN if [ ! -z "$ANDROID_NDK_URL" ]; then \ # curl $ANDROID_NDK_URL --output /tmp/android_ndk.zip \ # && mkdir -p $ANDROID_SDK_ROOT /tmp/ndk \ @@ -86,19 +99,12 @@ RUN mkdir -p $ANDROID_SDK_ROOT \ # && rm /tmp/android_ndk.zip; \ # fi # + # Installing SDK Packages # ----------------------- # RUN if [ ! -z "$SDKMANAGER_PACKAGES" ]; then yes | $_SDKMANAGER $SDKMANAGER_PACKAGES; fi -# Performance related settings for the JVM -# - Respect the cgroup settings for memory. -# -# Note: Usage of _JAVA_OPTIONS is in general discouraged. -# This is an internal flag that will be preferred over -# JAVA_TOOL_OPTIONS and the command line parameters. -# We still use it here to ensure that these settings -# are respected, no matter what is configured elsewhere. -ENV _JAVA_OPTIONS="-XX:+UnlockExperimentalVMOptions" + # Accept SDK licenses RUN yes | $_SDKMANAGER --licenses From 835d9d9dfab62748affe795ba056a623eda759cc Mon Sep 17 00:00:00 2001 From: Florian Kanduth Date: Thu, 9 Oct 2025 11:50:16 +0200 Subject: [PATCH 26/28] revert to prebuilt docker image --- Dockerfile | 111 ---------------------------------------------------- Jenkinsfile | 9 ++++- 2 files changed, 8 insertions(+), 112 deletions(-) delete mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index b4e5f727e2..0000000000 --- a/Dockerfile +++ /dev/null @@ -1,111 +0,0 @@ -FROM eclipse-temurin:11-jdk-jammy@sha256:f2e5cb53ab0fbcf0b4e0cbe963f684f524ea493835e6c36617536caac53ad4b6 -# Android Dependencies -# -------------------- -# Adapt the parameters below to change the dependencies. -# - -ARG ANDROID_API_LEVEL=28 -ARG ANDROID_BUILD_TOOLS_LEVEL=30.0.3 -ARG ANDROID_NDK_VERSION=21.1.6352462 -ARG ANDROID_CLI_TOOLS_URL="https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip" -ARG SDKMANAGER_PACKAGES="build-tools;${ANDROID_BUILD_TOOLS_LEVEL} platforms;android-$ANDROID_API_LEVEL cmake;3.6.4111459 system-images;android-28;default;x86_64 emulator" - -# Arguments, Environment -# ---------------------- -# -# Default values for the arguments to be passed from the Jenkinsfile. -# Those contain the uid and gid of the Jenkins user, and are used to -# create this user inside of the container, needed for eg ssh-agent to work - -ARG USER_ID=1000 -ARG USER_HOME=/home/user -ARG GROUP_ID=1000 -ARG KVM_GROUP_ID=999 - -# Environment variables that are needed by the build job. -ENV ANDROID_SDK_ROOT=$USER_HOME/android/sdk -ENV ANDROID_AVD_HOME=$USER_HOME/avds - -# SDK paths -ARG _SDKMANAGER=$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager -ARG _CMD_LINE=$ANDROID_SDK_ROOT/cmdline-tools -ARG _SDK_TMP_ZIP=/tmp/android_sdk.zip - -# Deprecated: Still used by gradle, once gradle respects ANDROID_SDK_ROOT, this can be removed -ENV ANDROID_HOME=$ANDROID_SDK_ROOT -ENV PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator - -# Performance related settings for the JVM -# - Respect the cgroup settings for memory. -# -# Note: Usage of _JAVA_OPTIONS is in general discouraged. -# This is an internal flag that will be preferred over -# JAVA_TOOL_OPTIONS and the command line parameters. -# We still use it here to ensure that these settings -# are respected, no matter what is configured elsewhere. -ENV _JAVA_OPTIONS="-XX:+UnlockExperimentalVMOptions" - -# System Packages -# --------------- -# -# x11-commons/x11-utils/libpulse0 needed to start emulator -RUN apt-get update && apt-get install -y --no-install-recommends \ - git=1:2.34.1-1ubuntu1.15 \ - libasound2 \ - libnss3-dev \ - libpulse0 \ - libxcursor-dev \ - python2-minimal=2.7.* \ - unzip \ - x11-common \ - x11-utils \ - && rm -rf /var/lib/apt/lists/* - -# User Management -# --------------- -# -# add the 'Jenkins' user -# Add group of the user used by Jenkins during building. -RUN if [ ! $(getent group $GROUP_ID) ]; then groupadd -g $GROUP_ID user; fi &&\ - groupadd -g $KVM_GROUP_ID kvm &&\ - mkdir -p catroid/build/reports/jacoco/jacocoTestCatroidDebugUnitTestReport/html &&\ - mkdir -p catroid/build/reports/coverage/catroid/debug/ - -# Add the user used by Jenkins during building. -RUN useradd -m -u $USER_ID -g $GROUP_ID -G $KVM_GROUP_ID -d $USER_HOME -s /usr/sbin/nologin user -# Run all other commands as user -USER user -RUN mkdir -p $ANDROID_AVD_HOME - -# Android SDK -# ------------------ -# - -ADD --chown=user:user $ANDROID_CLI_TOOLS_URL $_SDK_TMP_ZIP -RUN mkdir -p $ANDROID_SDK_ROOT \ - && unzip -d $ANDROID_SDK_ROOT $_SDK_TMP_ZIP \ - && rm $_SDK_TMP_ZIP \ - && mkdir -p $_CMD_LINE/latest \ - && mv $_CMD_LINE/bin $_CMD_LINE/lib $_CMD_LINE/source.properties $_CMD_LINE/latest/ - -# Android NDK (unused) -# ---------------- -# -# RUN if [ ! -z "$ANDROID_NDK_URL" ]; then \ -# curl $ANDROID_NDK_URL --output /tmp/android_ndk.zip \ -# && mkdir -p $ANDROID_SDK_ROOT /tmp/ndk \ -# && unzip -d /tmp/ndk /tmp/android_ndk.zip \ -# && mv /tmp/ndk/* $ANDROID_SDK_ROOT/ndk-bundle \ -# && rm /tmp/android_ndk.zip; \ -# fi -# - -# Installing SDK Packages -# ----------------------- -# -RUN if [ ! -z "$SDKMANAGER_PACKAGES" ]; then yes | $_SDKMANAGER $SDKMANAGER_PACKAGES; fi - -# Accept SDK licenses -RUN yes | $_SDKMANAGER --licenses - -CMD ["bash"] diff --git a/Jenkinsfile b/Jenkinsfile index e48cf4161b..f5e2e65b2a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -47,7 +47,14 @@ pipeline { string name: 'CATROID_BRANCH', defaultValue: 'develop', description: 'The branch which to build catroid with, when BUILD_WITH_CATROID is checked.' } - agent { dockerfile true } + agent { + docker { + image dockerParameters.image + args dockerParameters.args + label dockerParameters.label + alwaysPull true + } + } options { timeout(time: 2, unit: 'HOURS') From 85ec494c1c25fa7a946d13893b80d892cdab8a20 Mon Sep 17 00:00:00 2001 From: floriankanduth <125960486+floriankanduth@users.noreply.github.com> Date: Fri, 24 Oct 2025 20:36:41 +0200 Subject: [PATCH 27/28] Update Docker image in Jenkinsfile Moved image to catrobat registry --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index f5e2e65b2a..a9db329fe0 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,7 +7,7 @@ class DockerParameters { def dir = 'docker' def args = '--device /dev/kvm:/dev/kvm -v /var/local/container_shared/gradle_cache/$EXECUTOR_NUMBER:/home/user/.gradle -m=6.5G' def label = 'LimitedEmulator' - def image = 'floriankanduth/devops-846:eclipse' + def image = 'catrobat/catrobat-paintroid:DEVOPS-846-test' } From 9e4f735ea0f2999a2b89f96133c95d3e02f3f344 Mon Sep 17 00:00:00 2001 From: Florian Kanduth Date: Mon, 27 Oct 2025 20:39:29 +0100 Subject: [PATCH 28/28] add fastlane and fix dependencies --- docker/dockerfile | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docker/dockerfile b/docker/dockerfile index b4e5f727e2..8c0f57b0cb 100644 --- a/docker/dockerfile +++ b/docker/dockerfile @@ -55,11 +55,19 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libnss3-dev \ libpulse0 \ libxcursor-dev \ - python2-minimal=2.7.* \ + python2=2.7.* \ unzip \ x11-common \ x11-utils \ - && rm -rf /var/lib/apt/lists/* + #ruby-full \ + rubygems \ + ruby-dev \ + g++ \ + make \ + less \ + && rm -rf /var/lib/apt/lists/* \ + && gem install rake \ + && gem install fastlane -NV # User Management # ---------------