【问题标题】:Adding quality gate to Jenkins maven project's build section将质量门添加到 Jenkins Maven 项目的构建部分
【发布时间】:2020-11-13 12:10:02
【问题描述】:

我有一个 Jenkins Maven 项目,它为我的构建运行 SonarQube 分析。我想添加质量门,以便在质量门失败时我的构建失败。我也想在没有 Jenkinsfile 的情况下这样做(所以只使用 Jenkins 项目配置)。目前,我使用构建部分来执行 SonarQube 分析。 “目标和选项”字段包含以下代码:

clean package -Dmaven.test.skip=true sonar:sonar -Dsonar.projectKey=someName -Dsonar.sources=src/main/java

我希望在这里定义和实施质量门:

我尝试将 Quality Gate 添加到“构建后”部分,但没有可用的选项对我有用(我正在考虑尝试使“使用 Maven 的 SonarQube 分析”选项起作用,但现在已弃用)。我还发现 Jenkins 可以使用“Quality Gate”插件,但它有一个我不想拥有的漏洞(但想知道是否有其他插件可以替代)。

我认为“Pre-Steps”部分中的“Execute SonarQube Scanner”选项可能会做到这一点,但我找不到需要添加到 sonar-project.properties 文件中的正确行(是否有类似的行sonar.qualityGateFailBuild = true 选项?)

This 此处的问题提到 Maven 版本是一个问题。想知道是否有可能解决它? (我的maven版本是3.8.0,不能改)

更新

找到允许配置 sonar.property 文件的“后步骤”部分。目前,它如下所示,但 Quality Gate 仍然没有使我的构建失败。我还需要添加哪些其他参数?:

【问题讨论】:

  • 你想达到什么目的??目前还不清楚。你能在 cmets 中写下你想要的吗?
  • @SouravAtta 我想要一个质量门,这样当 QG 失败时我的构建就会失败。我在 Jenkins 中有一个 Maven 项目,它使用“配置”选项允许我从所述“配置”选项的“构建”部分执行我的项目。目前,它只扫描我的项目并生成分析,但当 QG 失败时会停止我的构建
  • @SouravAtta 添加了一张图片,希望能阐明我的目标
  • 如果没有声纳分析,您将无法根据质量门使您的管道失败。您可以使用Quality Gate Plugin。在您的管道配置中,在 Post Build Actions 下,选择 Wait for QualityGate 选项。这将有助于根据 QualityGate 状态使管道失败。
  • @SouravAtta 这是我最初的计划,但它有漏洞,不幸的是,这不是我可以容忍的。是否可以在其中一个前置步骤中同时运行 SQ 分析和 QG?例如,是否可以配置“执行 SonarQube 扫描仪”选项来完成所有工作?还是需要先构建部分?

标签: jenkins sonarqube maven-plugin


【解决方案1】:

这是实现这一目标的最可靠方法。

您可以使用自定义脚本来实现此目的,使用 sonar web api 获取 QualityGate 状态并将作业设置为失败和成功。

当您使用maven sonar:sonar 运行声纳分析时,分析完成后report-task.txt 将在工作区文件夹中创建。

注意:report-task.txt 文件的位置取决于用于生成它的工具(在您的情况下是 gradle)。例如。 “mvn sonar:sonar”任务默认为“target/sonar”。此位置由“sonar.scanner.metadataFilePath”属性控制

您将在 report-task.txt 中获得 ceTaskUrlceTaskId。现在,您可以使用该 ceTaskUrl 来获取 analysisId

您可以使用以下 web api 通过 analysisId 获取质量门状态。

http://localhost:9000/sonarqube/api/qualitygates/project_status?analysisId=$ANALYSIS_ID

【讨论】:

  • 是的,在我使用 Jenkinsfile 的项目中,我曾经使用过它(我通过 JsonSlurper 从所述 API 中提取了价值)。如果我理解正确,有一个名为“自定义脚本”的选项,我可以使用它来编写 groovy 脚本以使用 API?或者你的意思是 sonar.property 文件(在这种情况下,我的脚本是什么?不确定我是否可以在那里使用 groovy 命令,sonar.scanner.metadataFilePath 只会给我 report-task.txt 文件的内容。我需要类似的东西吗? sonar.qualitygate.wait)?
  • 另外,更新了我的帖子以显示我一直在尝试的内容
【解决方案2】:

经过反复试验,我发现this 的帖子可以挽救生命。我在尝试使用 Nanotron 的代码时遇到了一些错误(最后一个答案),所以我添加了一些调整。这对我有用(我使用了 Jenkins 项目的“发布步骤”->“执行 shell 命令”部分):

if [ -e tmp.txt ];
then
rm tmp.txt
rm error.txt
rm task.json
fi


url=$(cat $WORKSPACE/[your pathway here]/target/sonar/report-task.txt | grep ceTaskUrl | cut -c11- )
echo ${url}
pswd=${SONAR_AUTH_TOKEN} // env variable that fetches sonar token
curl -s -X GET -u "${pswd}" "$url" | python -m json.tool

stsCheck=1

while [ $stsCheck = 1 ]
do
sleep 10
curl -s -X GET -u "${pswd}" "$url" -o task.json
status=$(python -m json.tool < task.json | grep -i "status" | cut --delimiter=: --fields=2 | sed 's/"//g' | sed 's/,//g' )
echo ${status}

if [ $status = SUCCESS ]; then
analysisID=$(python -m json.tool < task.json | grep -i "analysisId" | cut -c24- | sed 's/"//g' | sed 's/,//g')
analysisUrl="http://my-sonar-server/api/qualitygates/project_status?analysisId=${analysisID}"
echo ${analysisID}
echo ${analysisUrl}

stsCheck=0
fi
done

curl -s -X GET -u "${pswd}" -L $analysisUrl | python -m json.tool
curl -s -X GET -u "${pswd}" -L $analysisUrl | python -m json.tool | grep -i "status" | cut -c28- | sed 's/.$//' >> tmp.txt
cat tmp.txt
sed -n '/ERROR/p' tmp.txt >> error.txt
cat error.txt
if [ $(cat error.txt | wc -l) -eq 0 ]; then
echo "Quality Gate Passed ! Setting up SonarQube Job Status to Success ! "
else
echo "Quality Gate Failed ! Setting up SonarQube Job Status to Failure ! "
exit 1
fi

【讨论】:

    猜你喜欢
    • 2016-07-20
    • 2021-02-06
    • 2016-01-12
    • 2015-09-10
    • 2013-02-21
    • 1970-01-01
    • 2011-12-16
    • 2020-02-19
    • 1970-01-01
    相关资源
    最近更新 更多