diff options
| author | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2021-03-20 16:51:05 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-20 16:51:05 +0100 |
| commit | 0862f8489b1122671cefa5c5bd59f677b56a3712 (patch) | |
| tree | 9256a835306601fa522476d02be4c38e0bf001c9 | |
| parent | 592d60d6d2ef51923eebd844888930b07892da39 (diff) | |
| parent | fce499eaafa0afecee5c14346ff7d75e2fe999b6 (diff) | |
Add support for code coverage tracking via Codecov
This pull request enables aggregate code coverage reports via Jacoco and adds support for coverage tracking via Codecov.
| -rw-r--r-- | .github/workflows/build-api.yml | 23 | ||||
| -rw-r--r-- | .github/workflows/build-frontend.yml | 3 | ||||
| -rw-r--r-- | .github/workflows/build-simulator.yml | 29 | ||||
| -rw-r--r-- | api/.gitignore | 2 | ||||
| -rw-r--r-- | api/pytest.ini | 1 | ||||
| -rw-r--r-- | api/requirements.txt | 1 | ||||
| -rw-r--r-- | codecov.yml | 7 | ||||
| -rw-r--r-- | simulator/build.gradle.kts | 1 | ||||
| -rw-r--r-- | simulator/buildSrc/build.gradle.kts | 2 | ||||
| -rw-r--r-- | simulator/buildSrc/src/main/kotlin/jacoco-aggregation.gradle.kts | 26 | ||||
| -rw-r--r-- | simulator/buildSrc/src/main/kotlin/jacoco-conventions.gradle.kts | 33 | ||||
| -rw-r--r-- | simulator/buildSrc/src/main/kotlin/testing-conventions.gradle.kts | 9 | ||||
| -rw-r--r-- | simulator/gradle.properties | 8 | ||||
| -rw-r--r-- | simulator/opendc-compute/opendc-compute-simulator/build.gradle.kts | 1 | ||||
| -rw-r--r-- | simulator/opendc-format/build.gradle.kts | 1 | ||||
| -rw-r--r-- | simulator/opendc-harness/build.gradle.kts | 1 | ||||
| -rw-r--r-- | simulator/opendc-simulator/opendc-simulator-compute/build.gradle.kts | 1 | ||||
| -rw-r--r-- | simulator/opendc-workflow/opendc-workflow-service/build.gradle.kts | 1 |
18 files changed, 117 insertions, 33 deletions
diff --git a/.github/workflows/build-api.yml b/.github/workflows/build-api.yml index 5bbc30c4..4ae261db 100644 --- a/.github/workflows/build-api.yml +++ b/.github/workflows/build-api.yml @@ -1,9 +1,6 @@ name: Build API on: - push: - paths: - - 'api/**' pull_request: branches: [master] @@ -29,8 +26,20 @@ jobs: python -m pip install --upgrade pip pip install -r requirements.txt - name: Lint with pylint - run: | - ./check.sh + run: ./check.sh - name: Test with pytest - run: | - pytest opendc + run: pytest --cov=opendc/ --junitxml=.junit-report.xml + - name: Publish report + if: always() + uses: mikepenz/action-junit-report@v2 + with: + check_name: test (Python ${{ matrix.python }}) + report_paths: '**/.junit-report.xml' + github_token: ${{ secrets.GITHUB_TOKEN }} + - name: Upload code coverage + uses: codecov/codecov-action@v1 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: ./api/.coverage + flags: api + diff --git a/.github/workflows/build-frontend.yml b/.github/workflows/build-frontend.yml index 73ab49d5..7c1b95a7 100644 --- a/.github/workflows/build-frontend.yml +++ b/.github/workflows/build-frontend.yml @@ -1,9 +1,6 @@ name: Build Frontend on: - push: - paths: - - 'frontend/**' pull_request: branches: [master] diff --git a/.github/workflows/build-simulator.yml b/.github/workflows/build-simulator.yml index 57e8b46d..1bee19bc 100644 --- a/.github/workflows/build-simulator.yml +++ b/.github/workflows/build-simulator.yml @@ -1,9 +1,6 @@ name: Build Simulator on: - push: - paths: - - 'simulator/**' pull_request: branches: [master] @@ -21,6 +18,8 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v2 + - name: Validate Gradle wrapper + uses: gradle/wrapper-validation-action@v1 - name: Set up JDK uses: actions/setup-java@v1 with: @@ -36,4 +35,26 @@ jobs: - name: Build with Gradle run: ./gradlew assemble - name: Check with Gradle - run: ./gradlew check --info + run: ./gradlew check codeCoverageReport + - name: Publish report + if: always() + uses: mikepenz/action-junit-report@v2 + with: + check_name: test (Java ${{ matrix.java }}) + report_paths: '**/build/test-results/test/TEST-*.xml' + github_token: ${{ secrets.GITHUB_TOKEN }} + - name: Upload artifacts + if: always() + uses: actions/upload-artifact@v2 + with: + name: reports-${{ matrix.os }}-jdk${{ matrix.java }} + path: | + ./**/build/reports/**/* + ./**/build/test-results/**/* + retention-days: 5 + - name: Upload code coverage + uses: codecov/codecov-action@v1 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: ./simulator/build/reports/jacoco/report.xml + flags: simulator diff --git a/api/.gitignore b/api/.gitignore index 0e4f0a70..b0390689 100644 --- a/api/.gitignore +++ b/api/.gitignore @@ -14,3 +14,5 @@ _mailinglist config.json test.json .env* +.coverage +.junit-report.xml diff --git a/api/pytest.ini b/api/pytest.ini index 8c28be16..8e7964ba 100644 --- a/api/pytest.ini +++ b/api/pytest.ini @@ -2,3 +2,4 @@ env = OPENDC_FLASK_TESTING=True OPENDC_FLASK_SECRET=Secret +junit_family = xunit2 diff --git a/api/requirements.txt b/api/requirements.txt index 9bf69b8f..8d0a283a 100644 --- a/api/requirements.txt +++ b/api/requirements.txt @@ -30,6 +30,7 @@ pylint==2.5.3 pymongo==3.10.1 pyparsing==2.4.7 pytest==5.4.3 +pytest-cov==2.11.1 pytest-env==0.6.2 pytest-mock==3.2.0 python-dotenv==0.14.0 diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 00000000..6b69e117 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,7 @@ +flags: + simulator: + paths: + - simulator/ + api: + paths: + - api/ diff --git a/simulator/build.gradle.kts b/simulator/build.gradle.kts index 6b0a9bf1..061d8fc3 100644 --- a/simulator/build.gradle.kts +++ b/simulator/build.gradle.kts @@ -22,6 +22,7 @@ plugins { `dokka-conventions` + `jacoco-aggregation` } allprojects { diff --git a/simulator/buildSrc/build.gradle.kts b/simulator/buildSrc/build.gradle.kts index 4cc1958a..be071d0c 100644 --- a/simulator/buildSrc/build.gradle.kts +++ b/simulator/buildSrc/build.gradle.kts @@ -33,7 +33,7 @@ repositories { } dependencies { - implementation(kotlin("gradle-plugin", version = "1.4.30")) + implementation(kotlin("gradle-plugin", version = "1.4.31")) implementation("org.jlleitschuh.gradle:ktlint-gradle:10.0.0") implementation("org.jetbrains.dokka:dokka-gradle-plugin:0.10.1") } diff --git a/simulator/buildSrc/src/main/kotlin/jacoco-aggregation.gradle.kts b/simulator/buildSrc/src/main/kotlin/jacoco-aggregation.gradle.kts index 8c07fdea..3e8aa741 100644 --- a/simulator/buildSrc/src/main/kotlin/jacoco-aggregation.gradle.kts +++ b/simulator/buildSrc/src/main/kotlin/jacoco-aggregation.gradle.kts @@ -32,19 +32,25 @@ repositories { mavenCentral() } -task<JacocoReport>("jacocoTestReport") { +tasks.register<JacocoReport>("codeCoverageReport") { group = "Coverage reports" - description = "Generates an aggregate report from all subprojects" + description = "Generates an aggregate report based on all subprojects" - val jacocoReportTasks = subprojects.map { it.tasks.withType<JacocoReport>() } - dependsOn(jacocoReportTasks) - executionData(jacocoReportTasks) + reports { + xml.isEnabled = true + xml.destination = file("${buildDir}/reports/jacoco/report.xml") - subprojects.forEach { testedProject -> - val sourceSets = testedProject.convention.findPlugin(JavaPluginConvention::class)?.sourceSets ?: return@forEach + html.isEnabled = true + } - this@task.additionalSourceDirs.from(sourceSets["main"].allSource.srcDirs) - this@task.sourceDirectories.from(sourceSets["main"].allSource.srcDirs) - this@task.classDirectories.from(sourceSets["main"].output) + subprojects { + this@subprojects.plugins.withType<JacocoPlugin>().configureEach { + this@subprojects.tasks.matching { + it.extensions.findByType<JacocoTaskExtension>() != null } + .configureEach { + sourceSets(this@subprojects.the<SourceSetContainer>().named("main").get()) + executionData(this) + } + } } } diff --git a/simulator/buildSrc/src/main/kotlin/jacoco-conventions.gradle.kts b/simulator/buildSrc/src/main/kotlin/jacoco-conventions.gradle.kts index e0bc2ce4..d0534d4f 100644 --- a/simulator/buildSrc/src/main/kotlin/jacoco-conventions.gradle.kts +++ b/simulator/buildSrc/src/main/kotlin/jacoco-conventions.gradle.kts @@ -30,3 +30,36 @@ tasks.jacocoTestReport { html.isEnabled = true } } + +/* Share sources folder with other projects for aggregated JaCoCo reports */ +configurations.create("transitiveSourcesElements") { + isVisible = false + isCanBeResolved = false + isCanBeConsumed = true + extendsFrom(configurations.implementation.get()) + attributes { + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME)) + attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION)) + attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named("source-folders")) + } + sourceSets.main.get().java.srcDirs.forEach { + outgoing.artifact(it) + } +} + +/* Share the coverage data to be aggregated for the whole product */ +configurations.create("coverageDataElements") { + isVisible = false + isCanBeResolved = false + isCanBeConsumed = true + extendsFrom(configurations.implementation.get()) + attributes { + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME)) + attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION)) + attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named("jacoco-coverage-data")) + } + // This will cause the test task to run if the coverage data is requested by the aggregation task + outgoing.artifact(tasks.test.map { task -> + task.extensions.getByType<JacocoTaskExtension>().destinationFile!! + }) +} diff --git a/simulator/buildSrc/src/main/kotlin/testing-conventions.gradle.kts b/simulator/buildSrc/src/main/kotlin/testing-conventions.gradle.kts index 566b765f..f129c282 100644 --- a/simulator/buildSrc/src/main/kotlin/testing-conventions.gradle.kts +++ b/simulator/buildSrc/src/main/kotlin/testing-conventions.gradle.kts @@ -1,7 +1,3 @@ -import org.gradle.kotlin.dsl.`java-library` -import org.gradle.kotlin.dsl.kotlin -import org.gradle.platform.base.Library - /* * Copyright (c) 2021 AtLarge Research * @@ -30,6 +26,11 @@ plugins { tasks.test { useJUnitPlatform() + + reports { + html.isEnabled = true + junitXml.isEnabled = true + } } dependencies { diff --git a/simulator/gradle.properties b/simulator/gradle.properties index 930be6b5..8d41408c 100644 --- a/simulator/gradle.properties +++ b/simulator/gradle.properties @@ -21,12 +21,12 @@ # # Dependencies -kotlinx-coroutines.version = 1.4.2 +kotlinx-coroutines.version = 1.4.3 # Dependencies (Logging) -kotlin-logging.version = 2.0.4 +kotlin-logging.version = 2.0.6 slf4j.version = 1.7.30 -log4j.version = 2.14.0 +log4j.version = 2.14.1 # Dependencies (CLI) clikt.version = 3.1.0 @@ -45,4 +45,4 @@ classgraph.version = 4.8.102 # Dependencies (Testing) junit-jupiter.version = 5.7.1 junit-platform.version = 1.7.1 -mockk.version = 1.10.5 +mockk.version = 1.11.0 diff --git a/simulator/opendc-compute/opendc-compute-simulator/build.gradle.kts b/simulator/opendc-compute/opendc-compute-simulator/build.gradle.kts index 31fcda2f..1ad3f1c6 100644 --- a/simulator/opendc-compute/opendc-compute-simulator/build.gradle.kts +++ b/simulator/opendc-compute/opendc-compute-simulator/build.gradle.kts @@ -26,6 +26,7 @@ description = "Simulator for OpenDC Compute" plugins { `kotlin-library-conventions` `testing-conventions` + `jacoco-conventions` } dependencies { diff --git a/simulator/opendc-format/build.gradle.kts b/simulator/opendc-format/build.gradle.kts index 385e556d..ea43275a 100644 --- a/simulator/opendc-format/build.gradle.kts +++ b/simulator/opendc-format/build.gradle.kts @@ -26,6 +26,7 @@ description = "Library for reading common data formats for topology simulation" plugins { `kotlin-library-conventions` `testing-conventions` + `jacoco-conventions` } dependencies { diff --git a/simulator/opendc-harness/build.gradle.kts b/simulator/opendc-harness/build.gradle.kts index f980853c..01b4ecd6 100644 --- a/simulator/opendc-harness/build.gradle.kts +++ b/simulator/opendc-harness/build.gradle.kts @@ -26,6 +26,7 @@ description = "Harness for defining repeatable experiments using OpenDC" plugins { `kotlin-library-conventions` `testing-conventions` + `jacoco-conventions` } dependencies { diff --git a/simulator/opendc-simulator/opendc-simulator-compute/build.gradle.kts b/simulator/opendc-simulator/opendc-simulator-compute/build.gradle.kts index 66d7d9e5..0005928f 100644 --- a/simulator/opendc-simulator/opendc-simulator-compute/build.gradle.kts +++ b/simulator/opendc-simulator/opendc-simulator-compute/build.gradle.kts @@ -25,6 +25,7 @@ description = "Library for simulation of cloud computing components" plugins { `kotlin-library-conventions` `testing-conventions` + `jacoco-conventions` } dependencies { diff --git a/simulator/opendc-workflow/opendc-workflow-service/build.gradle.kts b/simulator/opendc-workflow/opendc-workflow-service/build.gradle.kts index 12a54235..bec18ae9 100644 --- a/simulator/opendc-workflow/opendc-workflow-service/build.gradle.kts +++ b/simulator/opendc-workflow/opendc-workflow-service/build.gradle.kts @@ -26,6 +26,7 @@ description = "Workflow orchestration service for OpenDC" plugins { `kotlin-library-conventions` `testing-conventions` + `jacoco-conventions` } dependencies { |
