diff --git a/.github/workflows/iroha2-pr.yml b/.github/workflows/iroha2-pr.yml index 79ab0919..9ad5e91d 100644 --- a/.github/workflows/iroha2-pr.yml +++ b/.github/workflows/iroha2-pr.yml @@ -3,12 +3,12 @@ name: Iroha2-java pull requests workflow on: pull_request: branches: [ iroha2-dev, iroha2-main ] + jobs: build: runs-on: self-hosted - steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK 17 uses: actions/setup-java@v3 with: @@ -23,8 +23,23 @@ jobs: key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: | ${{ runner.os }}-gradle- - - name: Build with Gradle - run: ./gradlew build --info + - name: Build with Gradle & Sonarqube analysis + run: ./gradlew build test testCoverage sonar -Dsonar.token=${{ secrets.SONAR_TOKEN }} --info + - name: DefectDojo + if: always() + uses: C4tWithShell/defectdojo-action@1.0.4 + with: + token: ${{ secrets.DEFECTOJO_TOKEN }} + defectdojo_url: ${{ secrets.DEFECTOJO_URL }} + product_type: iroha2 + engagement: ${{ github.ref_name }} + tools: "SonarQube API Import,Github Vulnerability Scan" + sonar_projectKey: hyperledger:iroha-java + github_token: ${{ secrets.GITHUB_TOKEN }} + github_repository: ${{ github.repository }} + product: ${{ github.repository }} + environment: Test + reports: '{"Github Vulnerability Scan": "github.json"}' - name: Upload build reports if: failure() uses: actions/upload-artifact@v3 diff --git a/build.gradle b/build.gradle index 96eeba45..d09f1b93 100644 --- a/build.gradle +++ b/build.gradle @@ -15,6 +15,8 @@ plugins { id 'org.jmailen.kotlinter' version "$kotlinLinterVer" id 'maven-publish' id 'com.github.johnrengelman.shadow' version '8.1.1' + id 'org.sonarqube' version "5.1.0.4882" + id 'jacoco' } allprojects { @@ -30,6 +32,7 @@ subprojects { apply plugin: 'org.jetbrains.kotlin.jvm' apply plugin: 'org.jmailen.kotlinter' apply plugin: 'com.github.johnrengelman.shadow' + apply plugin: 'jacoco' publishing { publications { @@ -53,10 +56,6 @@ subprojects { group = 'jp.co.soramitsu.iroha2-java' version = 'git rev-parse --short HEAD'.execute().text.trim() - test { - useJUnitPlatform() - } - java { toolchain { languageVersion = JavaLanguageVersion.of(8) @@ -96,6 +95,49 @@ subprojects { // uncomment to produce shadowJar build by default // it is disabled by default to publish original version by CI, not a fat jar tasks.shadowJar.enabled = false + + task testCoverage(type: JacocoReport) { + executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec") + + def sourceDirs = [ + "${project.projectDir}/src/main/java", + "${project.projectDir}/src/main/kotlin", + "${project.projectDir}/src/debug/java", + "${project.projectDir}/src/debug/kotlin" + ] + sourceDirectories.from = files(sourceDirs) + + reports { + xml.required = true + html.required = true + } + } + + test { + useJUnitPlatform() + } + + jacoco { + toolVersion = "0.8.8" + reportsDirectory = file("$buildDir/reports/") + } + + sonar { + properties { + property "sonar.projectKey", "hyperledger:iroha-java" + property "sonar.host.url", "https://sonar.katana.soramitsu.co.jp" + property "sonar.java.coveragePlugin", "jacoco" + property "sonar.projectName", "${project.group}:${rootProject.name}.${project.name}" + property "sonar.sources", "${project.projectDir}/src/main/kotlin" + // exclude projects with no tests + if (project.name != "codegen" && project.name != "model" && project.name != "tutorial") { + property "sonar.tests", "${project.projectDir}/src/test" + } + property "sonar.java.test.binaries", "${project.projectDir}/build/test-results/test/binary" + property "sonar.junit.reportPaths", "${project.projectDir}/build/test-results/test/" + property "sonar.coverage.jacoco.xmlReportPaths", "${project.projectDir}/build/reports/testCoverage/*.xml" + } + } } task allShadowJars { diff --git a/examples/tutorial/build.gradle.kts b/examples/tutorial/build.gradle.kts index 0260ad34..aca25721 100644 --- a/examples/tutorial/build.gradle.kts +++ b/examples/tutorial/build.gradle.kts @@ -10,3 +10,12 @@ dependencies { implementation(project(":block")) api(project(":admin-client")) } + +tasks.testCoverage { + mustRunAfter(":admin-client:testCoverage") + mustRunAfter(":block:testCoverage") + mustRunAfter(":client:testCoverage") + mustRunAfter(":codegen:testCoverage") + mustRunAfter(":model:testCoverage") + mustRunAfter(":test-tools:testCoverage") +} diff --git a/gradle.properties b/gradle.properties index e8a64ae7..ca5442de 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,8 +13,9 @@ i2pCryptoEddsa=0.3.0 multihashVersion=1.3.0 googleTinkVer=1.9.0 # testing -testContainersVer=1.18.3 +testContainersVer=1.20.3 junitVersion=5.9.3 # logging logbackVer=1.2.3 org.gradle.jvmargs=-XX:MetaspaceSize=128M -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +systemProp.sonar.host.url=https://sonar.katana.soramitsu.co.jp diff --git a/modules/block/build.gradle b/modules/block/build.gradle index c5c6d01f..2df37e9a 100644 --- a/modules/block/build.gradle +++ b/modules/block/build.gradle @@ -7,3 +7,7 @@ dependencies { testImplementation "org.jetbrains.kotlin:kotlin-test-junit5:$kotlinVer" testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlinVer" } + +testCoverage { + mustRunAfter(":admin-client:testCoverage") +} diff --git a/modules/client/build.gradle b/modules/client/build.gradle index ba3d85ba..efd9b2df 100644 --- a/modules/client/build.gradle +++ b/modules/client/build.gradle @@ -31,3 +31,8 @@ dependencies { testApi project(":test-tools") } + +testCoverage { + mustRunAfter(":admin-client:testCoverage") + mustRunAfter(":block:testCoverage") +} diff --git a/modules/codegen/build.gradle b/modules/codegen/build.gradle index e4338a43..d4943aa4 100644 --- a/modules/codegen/build.gradle +++ b/modules/codegen/build.gradle @@ -20,3 +20,9 @@ task generate(type: JavaExec) { args "schemaFileName=schema.json" finalizedBy ':model:formatKotlin' } + +testCoverage { + mustRunAfter(":admin-client:testCoverage") + mustRunAfter(":block:testCoverage") + mustRunAfter(":client:testCoverage") +} diff --git a/modules/model/build.gradle b/modules/model/build.gradle index e69de29b..4cdb4bf6 100644 --- a/modules/model/build.gradle +++ b/modules/model/build.gradle @@ -0,0 +1,6 @@ +testCoverage { + mustRunAfter(":admin-client:testCoverage") + mustRunAfter(":block:testCoverage") + mustRunAfter(":client:testCoverage") + mustRunAfter(":codegen:testCoverage") +} diff --git a/modules/test-tools/build.gradle b/modules/test-tools/build.gradle index 70caa3d8..09f8a4bc 100644 --- a/modules/test-tools/build.gradle +++ b/modules/test-tools/build.gradle @@ -18,6 +18,10 @@ dependencies { testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlinVer" } -test { - useJUnitPlatform() +testCoverage { + mustRunAfter(":admin-client:testCoverage") + mustRunAfter(":block:testCoverage") + mustRunAfter(":client:testCoverage") + mustRunAfter(":codegen:testCoverage") + mustRunAfter(":model:testCoverage") }