postgresql SonarQube不计算代码覆盖率

wljmcqd8  于 2023-02-08  发布在  PostgreSQL
关注(0)|答案(1)|浏览(118)

我正在使用postgres sql作为我的springboot应用程序中的DB。
我的SonarQube无法计算代码覆盖率。有人能指导我吗

    • 生成分级**
plugins {
    id 'org.springframework.boot' version "${springBootVersion}"
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
    id 'java'
    id 'eclipse'
    id 'jacoco'
    id 'org.sonarqube' version "3.3"
    id 'com.google.cloud.tools.jib' version "${jibVersion}"
}

group = 'com.vsi.postgrestoattentive'

if (!project.hasProperty('buildName')) {
    throw new GradleException("Usage for CLI:" 
        + System.getProperty("line.separator") 
        + "gradlew <taskName> -Dorg.gradle.java.home=<java-home-dir> -PbuildName=<major>.<minor>.<buildNumber> -PgcpProject=<gcloudProject>"
        + System.getProperty("line.separator")
        + "<org.gradle.java.home> - OPTIONAL if available in PATH"
        + System.getProperty("line.separator")
        + "<buildName> - MANDATORY, example 0.1.23")
        + System.getProperty("line.separator")
        + "<gcpProject> - OPTIONAL, project name in GCP";
}

project.ext {
    buildName = project.property('buildName');
}

version = "${project.ext.buildName}"

sourceCompatibility = '1.8'

apply from: 'gradle/sonar.gradle'
apply from: 'gradle/tests.gradle'
apply from: 'gradle/image-build-gcp.gradle'

repositories {
    mavenCentral()
    
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web:${springBootVersion}")
    implementation("org.springframework.boot:spring-boot-starter-actuator:${springBootVersion}")
    implementation 'org.springframework.boot:spring-boot-starter-web:2.7.0'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    testImplementation 'org.springframework.integration:spring-integration-test'
    testImplementation 'org.springframework.batch:spring-batch-test:4.3.0'
    implementation("org.springframework.boot:spring-boot-starter-data-jpa:${springBootVersion}")
    implementation 'org.postgresql:postgresql:42.2.16'
    implementation 'org.springframework.batch:spring-batch-core:4.1.1.RELEASE'
    implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.14.1'
    implementation group: 'io.micrometer', name: 'micrometer-registry-datadog', version: '1.7.0'
    
    implementation 'com.google.cloud:libraries-bom:26.3.0'
    implementation 'com.google.cloud:google-cloud-storage:2.16.0'
    
    testImplementation('org.mockito:mockito-core:3.7.7')
    
    //Below 4 dependencies should be commented in local
    implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-client-all:2.0.4'
    implementation 'io.kubernetes:client-java:12.0.0'
    
    implementation("org.springframework.cloud:spring-cloud-gcp-starter-metrics:${gcpSpringCloudVersion}")
    implementation 'org.springframework.cloud:spring-cloud-gcp-logging:1.2.8.RELEASE'

    testImplementation('org.mockito:mockito-core:3.7.7')
    testImplementation 'org.springframework.boot:spring-boot-test'
    testImplementation 'org.springframework:spring-test'
    testImplementation 'org.assertj:assertj-core:3.21.0'

    testImplementation("org.springframework.boot:spring-boot-starter-test:${springBootVersion}") {
        exclude group: "org.junit.vintage", module: "junit-vintage-engine"
    }
}

bootJar {
    archiveFileName = "${project.name}.${archiveExtension.get()}"
}

springBoot {
    buildInfo()
}

test {
    finalizedBy jacocoTestReport
}

jacoco {
    toolVersion = "0.8.8"
}

jacocoTestReport {
    dependsOn test
}

//: Code to make build check code coverage ratio
project.tasks["bootJar"].dependsOn "jacocoTestReport","jacocoTestCoverageVerification"
    • 分级测试**
test {

    
    finalizedBy jacocoTestReport
    useJUnitPlatform()
    
    testLogging {
        exceptionFormat = 'full'
    }
    
    afterSuite { desc, result ->
        if (!desc.parent) {
            println "Results: (${result.testCount} tests, ${result.successfulTestCount} successes, ${result.failedTestCount} failures, ${result.skippedTestCount} skipped)"
            boolean skipTests = Boolean.parseBoolean(project.findProperty('SKIP_TESTS') ?: "false")
            if (result.testCount == 0 && !skipTests) {
                throw new IllegalStateException("No tests were found. Failing the build")
            }
        }
    }
    
jacocoTestCoverageVerification {
    dependsOn test
    violationRules {
        rule{
            limit {
            //SMS-28: Since project is in nascent stage setting code coverage ratio limit to 1%
                minimum = 0.5
            }
        }
    }
}

}
    • 声纳、分级仪**
apply plugin: "org.sonarqube"
apply plugin: 'jacoco'

jacoco {
    toolVersion = "0.8.5"
    reportsDir = file("$buildDir/jacoco")
}

jacocoTestReport {
    reports {
        xml.enabled true
        html.enabled true
        csv.enabled false
    }
}
    • Jenkins构建文件**
pipeline {

    agent any

    environment {
        // TODO: Remove this
        GIT_BRANCH_LOCAL = sh (
                    script: "echo $GIT_BRANCH | sed -e 's|origin/||g'",
                    returnStdout: true
                ).trim()
        CURRENT_BUILD_DISPLAY="0.1.${BUILD_NUMBER}"
        PROJECT_FOLDER="."
        PROJECT_NAME="xyz"
    
        //Adding default values for env variables that sometimes get erased from GCP Jenkins
        GRADLE_JAVA_HOME="/opt/java/openjdk"
        GCP_SA="abc"
        GCP_PROJECT="efg"
        
        SONAR_JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"
        SONAR_HOST="http://sonar-sonarqube:9000/sonar"  
        
    }

    stages {
        stage('Clean Workspace') {
            steps {
                echo "Setting current build to ${CURRENT_BUILD_DISPLAY}"
                script {
                    currentBuild.displayName = "${CURRENT_BUILD_DISPLAY}"

                    currentBuild.description = """Branch - ${GIT_BRANCH_LOCAL}"""
                }
                dir("${PROJECT_FOLDER}") {
                    echo "Changed directory to ${PROJECT_FOLDER}"
                    echo 'Cleaning up Work Dir...'
                    // Had to add below chmod command as Jenkins build was failing stating gradlew permission denied
                    sh 'chmod +x gradlew'
                    //gradlew clean means deletion of the build directory.
                    sh './gradlew clean -PbuildName=${CURRENT_BUILD_DISPLAY} -Dorg.gradle.java.home=${GRADLE_JAVA_HOME}'
                    //mkdir -p creates subdirectories
                    //touch creates new empty file
                    sh 'mkdir -p build/libs && touch build/libs/${PROJECT_NAME}-${CURRENT_BUILD_DISPLAY}.jar'
                }
            }
        }

        stage('Tests And Code Quality') {
            steps {
                dir("${PROJECT_FOLDER}") {
                    echo 'Running Tests and SonarQube Analysis'
                     withCredentials([string(credentialsId: 'sonar_key', variable: 'SONAR_KEY')]) {
                        sh '''
                          ./gradlew -i sonarqube -Dorg.gradle.java.home=${SONAR_JAVA_HOME}  \
                                                 -Dsonar.host.url=${SONAR_HOST}  \
                                                 -PbuildName=${CURRENT_BUILD_DISPLAY} \
                                                 -Dsonar.login=$SONAR_KEY \
                                                 -DprojectVersion=${CURRENT_BUILD_DISPLAY}
                        '''
                     }
                    echo 'Ran SonarQube Analysis successfully'
                }
            }
        }       
  

        stage('ECRContainerRegistry') {
            steps {
         withCredentials([file(credentialsId: 'vsi-ops-gcr', variable: 'SECRET_JSON')]) {
                    echo 'Activating gcloud SDK Service Account...'
                    sh 'gcloud auth activate-service-account $GCP_SA --key-file $SECRET_JSON --project=$GCP_PROJECT'
                    sh 'gcloud auth configure-docker'
                    echo 'Activated gcloud SDK Service Account'
                    dir("${PROJECT_FOLDER}") {
                        echo "Pushing image to GCR with tag ${CURRENT_BUILD_DISPLAY}..."
                        sh './gradlew jib -PbuildName=${CURRENT_BUILD_DISPLAY} -PgcpProject=${GCP_PROJECT} -Dorg.gradle.java.home=${GRADLE_JAVA_HOME}'
                        echo "Pushed image to GCR with tag ${CURRENT_BUILD_DISPLAY} successfully"
                    }
                    echo 'Revoking gcloud SDK Service Account...'
                    sh "gcloud auth revoke ${GCP_SA}"
                    echo 'Revoked gcloud SDK Service Account'
                }
            }
        }
    
    }

    post {
        /*
            TODO: use cleanup block
            deleteDir is explicit in failure because always block is run
            before success causing archive failure. Also cleanup block is not
            available in this version on Jenkins ver. 2.164.2
        */
        success {
            dir("${PROJECT_FOLDER}") {
                echo 'Archiving build artifacts...'
                archiveArtifacts artifacts: "build/libs/*.jar, config/**/*", fingerprint: true, onlyIfSuccessful: true
                echo 'Archived build artifacts successfully'
                echo 'Publising Jacoco Reports...'
                jacoco( 
                    execPattern: 'build/jacoco/*.exec',
                    classPattern: 'build/classes',
                    sourcePattern: 'src/main/java',
                    exclusionPattern: 'src/test*'
                )
                echo 'Published Jacoco Reports successfully'
            }
            echo 'Cleaning up workspace...'
            deleteDir()
        }
        failure {
            echo 'Cleaning up workspace...'
            deleteDir()
        }
        aborted {
            echo 'Cleaning up workspace...'
            deleteDir()
        }
    }
}

下面是我在Jenkins控制台中得到的错误

> Task :sonarqube
JaCoCo report task detected, but XML report is not enabled or it was not produced. Coverage for this task will not be reported.
Caching disabled for task ':sonarqube' because:
  Build cache is disabled
Task ':sonarqube' is not up-to-date because:
  Task has not declared any outputs despite executing actions.
JaCoCo report task detected, but XML report is not enabled or it was not produced. Coverage for this task will not be reported.
User cache: /var/jenkins_home/.sonar/cache
Default locale: "en", source code encoding: "UTF-8"
Load global settings
Load global settings (done) | time=101ms
Server id: 4AE86E0C-AX63D7IJvl7jEHIL9nIz
User cache: /var/jenkins_home/.sonar/cache
Load/download plugins
Load plugins index
Load plugins index (done) | time=48ms
Load/download plugins (done) | time=91ms
Process project properties
Process project properties (done) | time=9ms
Execute project builders
Execute project builders (done) | time=1ms

Java "Test" source files AST scan (done) | time=779ms
No "Generated" source files to scan.
Sensor JavaSensor [java] (done) | time=8057ms
Sensor JaCoCo XML Report Importer [jacoco]
'sonar.coverage.jacoco.xmlReportPaths' is not defined. Using default locations: target/site/jacoco/jacoco.xml,target/site/jacoco-it/jacoco.xml,build/reports/jacoco/test/jacocoTestReport.xml
No report imported, no coverage information will be imported by JaCoCo XML Report Importer
Sensor JaCoCo XML Report Importer [jacoco] (done) | time=4ms

有人能指导我如何解决声纳不计算代码覆盖的问题吗

pn9klfpd

pn9klfpd1#

虽然它可能是由许多事情引起的,但从日志来看,它似乎找不到报告。
正如第一条注解所说,检查以验证报告是否正在生成(但没有找到),如果已经生成,则可能SQ找不到XML Jacoco报告。
注意靠近末尾的错误行:
未定义“sonar.coverage.jacoco.xmlReportPaths”。使用默认位置:目标/站点/jacoco/jacoco. xml、目标/站点/jacoco-it/jacoco.xml、构建/报告/jacoco/测试/jacocoTestReport.xml
定义此位置的示例是将此行放入sonar-project.properties中:
sonar.coverage.jacoco.xmlReportsPaths=build/reports/jacoco.xml
它也可以直接在*.gradle文件中定义:

sonarqube {
    properties {
        property "sonar.coverage.jacoco.xmlReportsPaths", "build/reports/jacoco.xml"
    }
}

相关问题