diff --git a/.circleci/config.yml b/.circleci/config.yml index 82050edd7b8f3c9a98fb486ba941872d42f94086..29858818167968060a19ef492f7b3f6c66f55342 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -8,10 +8,19 @@ commands: save-build-cache: android/save-build-cache scan-sonar: sonarcloud/scan jobs: - quickBuildReleaseWithTestsAndChecks: + quick_build_release_no_tests: executor: android/android + resource_class: large steps: - checkout + - run: + name: Check if assemble required + command: | + last_commit=$(git log -1 --pretty=%B) + if [[ $last_commit != *"Version bump"* ]]; then + circleci-agent step halt + echo "Skipping job" + fi - install-ndk: ndk-sha: "c81a5bcb4672a18d3647bf6898cd4dbcb978d0e8" ndk-version: "android-ndk-r21c" @@ -20,7 +29,66 @@ jobs: key: jars-{{ checksum "build.gradle" }}-{{ checksum "Corona-Warn-App/build.gradle" }}-{{ checksum "Server-Protocol-Buffer/build.gradle" }} - run: name: Quick Build - command: ./gradlew quickBuild quickBuildTest + command: ./gradlew assembleDeviceRelease + environment: + JVM_OPTS: -Xmx2048m + GRADLE_OPTS: -Xmx1536m -XX:+HeapDumpOnOutOfMemoryError -Dorg.gradle.caching=true -Dorg.gradle.configureondemand=true -Dkotlin.compiler.execution.strategy=in-process -Dkotlin.incremental=false + - save-build-cache + - save_cache: + paths: + - ~/.gradle + key: jars-{{ checksum "build.gradle" }}-{{ checksum "Corona-Warn-App/build.gradle" }}-{{ checksum "Server-Protocol-Buffer/build.gradle" }} + - store_artifacts: + path: Corona-Warn-App/build/reports + destination: reports + quick_build_for_testers_no_tests: + executor: android/android + resource_class: large + steps: + - checkout + - run: + name: Check if assemble required + command: | + last_commit=$(git log -1 --pretty=%B) + if [[ $last_commit != *"Version bump"* ]]; then + circleci-agent step halt + echo "Skipping job" + fi + - install-ndk: + ndk-sha: "c81a5bcb4672a18d3647bf6898cd4dbcb978d0e8" + ndk-version: "android-ndk-r21c" + - restore-build-cache + - restore_cache: + key: jars-{{ checksum "build.gradle" }}-{{ checksum "Corona-Warn-App/build.gradle" }}-{{ checksum "Server-Protocol-Buffer/build.gradle" }} + - run: + name: Quick Build + command: ./gradlew :Corona-Warn-App:assembleDeviceForTestersRelease + environment: + JVM_OPTS: -Xmx2048m + GRADLE_OPTS: -Xmx1536m -XX:+HeapDumpOnOutOfMemoryError -Dorg.gradle.caching=true -Dorg.gradle.configureondemand=true -Dkotlin.compiler.execution.strategy=in-process -Dkotlin.incremental=false + - save-build-cache + - save_cache: + paths: + - ~/.gradle + key: jars-{{ checksum "build.gradle" }}-{{ checksum "Corona-Warn-App/build.gradle" }}-{{ checksum "Server-Protocol-Buffer/build.gradle" }} + - store_artifacts: + path: Corona-Warn-App/build/reports + destination: reports + device_release_unit_tests: + executor: android/android + resource_class: large + parallelism: 4 + steps: + - checkout + - restore-build-cache + - restore_cache: + key: jars-{{ checksum "build.gradle" }}-{{ checksum "Corona-Warn-App/build.gradle" }}-{{ checksum "Server-Protocol-Buffer/build.gradle" }} + - run: + name: test splitting output + command: circleci tests glob "**/test*/**/*.kt" | circleci tests split | xargs -n 1 echo + - run: + name: Unit tests + command: ./gradlew :Corona-Warn-App:testDeviceReleaseUnitTest -i -PtestFilter="`circleci tests glob "**/test*/**/*.kt" | circleci tests split`" environment: JVM_OPTS: -Xmx2048m GRADLE_OPTS: -Xmx1536m -XX:+HeapDumpOnOutOfMemoryError -Dorg.gradle.caching=true -Dorg.gradle.configureondemand=true -Dkotlin.compiler.execution.strategy=in-process -Dkotlin.incremental=false @@ -44,8 +112,114 @@ jobs: name: Skip SonarCloud for external Pull Requests command: '[[ -v CIRCLE_PR_REPONAME ]] && circleci-agent step halt || true' - scan-sonar + device_for_testers_unit_tests: + executor: android/android + resource_class: large + parallelism: 4 + steps: + - checkout + - restore-build-cache + - restore_cache: + key: jars-{{ checksum "build.gradle" }}-{{ checksum "Corona-Warn-App/build.gradle" }}-{{ checksum "Server-Protocol-Buffer/build.gradle" }} + - run: + name: test splitting output + command: circleci tests glob "**/test*/**/*.kt" | circleci tests split | xargs -n 1 echo + - run: + name: Unit tests + command: ./gradlew :Corona-Warn-App:testDeviceForTestersReleaseUnitTest -i -PtestFilter="`circleci tests glob "**/test*/**/*.kt" | circleci tests split`" + environment: + JVM_OPTS: -Xmx2048m + GRADLE_OPTS: -Xmx1536m -XX:+HeapDumpOnOutOfMemoryError -Dorg.gradle.caching=true -Dorg.gradle.configureondemand=true -Dkotlin.compiler.execution.strategy=in-process -Dkotlin.incremental=false + - save-build-cache + - save_cache: + paths: + - ~/.gradle + key: jars-{{ checksum "build.gradle" }}-{{ checksum "Corona-Warn-App/build.gradle" }}-{{ checksum "Server-Protocol-Buffer/build.gradle" }} + - store_artifacts: + path: Corona-Warn-App/build/reports + destination: reports + - store_test_results: + path: Corona-Warn-App/build/test-results + lint_device_release_check: + executor: android/android + resource_class: large + steps: + - checkout + - run: + name: Lint check device release + command: ./gradlew --profile :Corona-Warn-App:lintDeviceRelease + environment: + JVM_OPTS: -Xmx2048m + GRADLE_OPTS: -Xmx1536m -XX:+HeapDumpOnOutOfMemoryError -Dorg.gradle.caching=true -Dorg.gradle.configureondemand=true -Dkotlin.compiler.execution.strategy=in-process -Dkotlin.incremental=false + - store_artifacts: + path: Corona-Warn-App/build/reports + destination: reports + ktlint_device_release_check: + executor: android/android + resource_class: medium + steps: + - checkout + - run: + name: Ktlint check device release + command: ./gradlew :Corona-Warn-App:ktlintDeviceReleaseCheck + environment: + JVM_OPTS: -Xmx2048m + GRADLE_OPTS: -Xmx1536m -XX:+HeapDumpOnOutOfMemoryError -Dorg.gradle.caching=true -Dorg.gradle.configureondemand=true -Dkotlin.compiler.execution.strategy=in-process -Dkotlin.incremental=false + - store_artifacts: + path: Corona-Warn-App/build/reports + destination: reports + lint_device_for_testers_check: + executor: android/android + resource_class: large + steps: + - checkout + - run: + name: Lint check device for testers + command: ./gradlew --profile :Corona-Warn-App:lintDeviceForTestersRelease + environment: + JVM_OPTS: -Xmx2048m + GRADLE_OPTS: -Xmx1536m -XX:+HeapDumpOnOutOfMemoryError -Dorg.gradle.caching=true -Dorg.gradle.configureondemand=true -Dkotlin.compiler.execution.strategy=in-process -Dkotlin.incremental=false + - store_artifacts: + path: Corona-Warn-App/build/reports + destination: reports + ktlint_device_for_testers_check: + executor: android/android + resource_class: medium + steps: + - checkout + - run: + name: Ktlint check device for testers + command: ./gradlew :Corona-Warn-App:ktlintDeviceForTestersReleaseCheck + environment: + JVM_OPTS: -Xmx2048m + GRADLE_OPTS: -Xmx1536m -XX:+HeapDumpOnOutOfMemoryError -Dorg.gradle.caching=true -Dorg.gradle.configureondemand=true -Dkotlin.compiler.execution.strategy=in-process -Dkotlin.incremental=false + - store_artifacts: + path: Corona-Warn-App/build/reports + destination: reports + detekt: + executor: android/android + resource_class: medium + steps: + - checkout + - run: + name: Detekt check + command: ./gradlew :Corona-Warn-App:detekt + environment: + JVM_OPTS: -Xmx2048m + GRADLE_OPTS: -Xmx1536m -XX:+HeapDumpOnOutOfMemoryError -Dorg.gradle.caching=true -Dorg.gradle.configureondemand=true -Dkotlin.compiler.execution.strategy=in-process -Dkotlin.incremental=false + - store_artifacts: + path: Corona-Warn-App/build/reports + destination: reports workflows: version: 2 - workflow: + quick_build: jobs: - - quickBuildReleaseWithTestsAndChecks + - quick_build_release_no_tests + - quick_build_for_testers_no_tests + - device_release_unit_tests + - device_for_testers_unit_tests + - lint_device_release_check + - lint_device_for_testers_check + - ktlint_device_release_check + - ktlint_device_for_testers_check + - detekt diff --git a/Corona-Warn-App/build.gradle b/Corona-Warn-App/build.gradle index 260f0678b8b7dba3033261cad7e734518dd2ab65..a8c84ac362cded3e91fc643a9be50bf2dd2eb761 100644 --- a/Corona-Warn-App/build.gradle +++ b/Corona-Warn-App/build.gradle @@ -129,6 +129,16 @@ android { testOptions { unitTests.all { useJUnitPlatform() + if (project.hasProperty('testFilter')) { + List<String> props = project.getProperties().get("testFilter").split("\\s+") + props.each { + def replaced = it + .replaceFirst("^(Corona-Warn-App/src/test.*/java/)(.+)\$", "**/\$2") + .replace(".kt", ".class") + project.logger.lifecycle("testFilter File: before=$it, after=$replaced") + include(replaced) + } + } } unitTests { includeAndroidResources = true @@ -173,7 +183,6 @@ android { java.srcDirs += "$projectDir/src/testShared/java" } } - } task jacocoTestReportDeviceRelease(type: JacocoReport, dependsOn: 'testDeviceReleaseUnitTest') {