Jenkins SonarQube扫描:未找到LCOV文件

sdnqo3pr  于 2024-01-07  发布在  Jenkins
关注(0)|答案(1)|浏览(145)

我正在实现一个Jenkins作业,它克隆了一个源代码库,并对该库运行SonarQube扫描。我的Jenkinsfile看起来像这样。

#!/usr/bin/env groovy
library identifier: '[email protected]', retriever: modernSCM([
    $class: 'GitSCMSource',
    credentialsId: 'AAA'
    remote: "https://github.com/scm/XX/SHAREDPIPELINE.git"
])

node('SOME_NODE') {
    try {
        stage('Main Stage') {
            deleteDir()
            checkout scm
            checkout changelog: false, poll: false, scm: [$class: 'GitSCM', branches: [[name: "master"]], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'SOURCE_REPO']], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/scm/YY/ZZZ.git', credentialsId: 'AAA']]]

            // Update WORKSPACE temporarily so that SonarQube scan can be run against the source repository
            OLD_WORKSPACE = WORKSPACE
            WORKSPACE = WORKSPACE + "/SOURCE_REPO"
            env.WORKSPACE = WORKSPACE

            // Call shared pipeline to run SonarQube scan in the source repository
            dir ("$WORKSPACE") {
                SHAREDPIPELINE([
                    path: "${WORKSPACE}",
                    command: 'npm run prepare-ci-unit-test && npm run unit-test',
                ])

                // For testing
                sh '''#!/bin/bash
                    echo "=====path to coverage/lcov.info"
                    readlink -f coverage/lcov.info

                    echo "=====read lcov.info"
                    cat coverage/lcov.info
                '''
            }

            // Reset WORKSPACE
            env.WORKSPACE = OLD_WORKSPACE
            WORKSPACE = OLD_WORKSPACE
        }
    } catch (e) {
        echo "ERROR:"
        echo e.toString()
    } finally {
        echo 'Cleaning Workspace'
        deleteDir()
    }
}

字符串
SHAREDPIPELINE的剧本是

def call(opts = [:]) {
    pipeline {
        agent {
            node { label SOMENODE }
        }
        stages {
            stage('Package.json verification') {
                steps {
                    script {
                        nodePath = "${opts['path']}"
                        echo "package.json values:"
                        packageJson = readJSON file: "${nodePath}/package.json"
                        echo packageJson
                    }
                }
            }
            stage('Unit Test') {
                steps {
                    script {
                        dir("${nodePath}") {
                            sh(UNITTEST_SCRIPT)
                        }                            
                        lcovFilePath = "${nodePath}/coverage/lcov.info"
                        def lcov = readFile "${lcovFilePath}"
                        echo lcov
                    }
                }
            }
            stage('SonarQube scan') {
                steps {
                    script {
                        def SonarQubeResult = sh (
                            script: """
                                set +x
                                docker run \
                                    --rm \
                                    -e SONAR_HOST_URL="${URL}" \
                                    -e SONAR_SCANNER_OPTS="${OPTS}" \
                                    -e SONAR_LOGIN="${LOGIN}" \
                                    --user="${USER}:${GROUP}" \
                                    -v "$WORKSPACE:/usr/src" \
                                    sonarsource/sonar-scanner-cli
                                set -x
                            """,
                            returnStdout: true
                        ).trim()
                        echo "Result:"
                        echo "${SonarQubeResult}"
                    }
                }
            }
        }
    }
}


作业成功检测到package.json文件,运行单元测试,并生成报告文件lcov.info

INFO: No LCOV files were found using /var/lib/jenkins/workspace/FOLDER/PIPELINE/SOURCE_REPO/coverage/lcov.info
WARN: No coverage information will be saved because all LCOV files cannot be found.


但是,当我打印lcov.info文件的绝对路径时,它返回的路径与SonarQube正在查找的路径相同。

=====path to coverage/lcov.info
/var/lib/jenkins/workspace/FOLDER/PIPELINE/SOURCE_REPO/coverage/lcov.info


一切正常,除了SonarQube没有检测到lcov.info文件。SHARED-PIPELINE能够读取源代码库中的package.json文件,它可以运行单元测试并读取lcov.info文件,SonarQube扫描正常运行,并在SonarQube控制台中显示结果。作为工作的最后一部分,我想让SonarQube检测通过运行单元测试创建的lcov.info文件。关于为什么会发生这种情况有什么建议吗?

holgip5t

holgip5t1#

有什么建议可以解释为什么会这样吗?
对于这样一个任务,你的设置看起来相当复杂。有很多地方可能会出错(我不确定是否是完整的列表):

  1. SOMENODE不是一个变量,所以实际上管道可以在不同的机器上执行。
    1.即使它是一个变量,也有可能有几个代理具有相同的标签,这将导致前一个问题,或者在同一个节点上有多个执行器,因此它们的值是不同的。
  2. -v "$WORKSPACE:/usr/src"可能使用了不正确的路径(特别是当$WORKSPACE包含空格时)。
  3. --user="${USER}:${GROUP}"中用户/组不正确时的文件权限问题
    1.重新分配WORKSPACE环境变量是一件危险的事情。更不用说Jenkins可能会根据管道类型(脚本/声明/声明但多分支)不同地对待WORKSPACEenv.WORKSPACE
    1.运行单元测试的命令作为command参数传递到共享管道,但它没有传播到UNITTEST_SCRIPT变量。这可能意味着单元测试实际上没有执行,或者由其他命令执行,因此没有计算覆盖率,因此SonarQube无法找到它
    1.在管道中使用try-catch实际上可以隐藏问题的根本原因,因为不是每个失败都是带有有用消息的Java/Groovy异常。
    我建议确保没有列出的潜在问题。

相关问题