我正在实现一个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
文件。关于为什么会发生这种情况有什么建议吗?
1条答案
按热度按时间holgip5t1#
有什么建议可以解释为什么会这样吗?
对于这样一个任务,你的设置看起来相当复杂。有很多地方可能会出错(我不确定是否是完整的列表):
SOMENODE
不是一个变量,所以实际上管道可以在不同的机器上执行。1.即使它是一个变量,也有可能有几个代理具有相同的标签,这将导致前一个问题,或者在同一个节点上有多个执行器,因此它们的值是不同的。
-v "$WORKSPACE:/usr/src"
可能使用了不正确的路径(特别是当$WORKSPACE
包含空格时)。--user="${USER}:${GROUP}"
中用户/组不正确时的文件权限问题1.重新分配
WORKSPACE
环境变量是一件危险的事情。更不用说Jenkins可能会根据管道类型(脚本/声明/声明但多分支)不同地对待WORKSPACE
和env.WORKSPACE
。1.运行单元测试的命令作为
command
参数传递到共享管道,但它没有传播到UNITTEST_SCRIPT
变量。这可能意味着单元测试实际上没有执行,或者由其他命令执行,因此没有计算覆盖率,因此SonarQube无法找到它1.在管道中使用
try-catch
实际上可以隐藏问题的根本原因,因为不是每个失败都是带有有用消息的Java/Groovy异常。我建议确保没有列出的潜在问题。