将质量门添加到 Jenkins Maven 项目的构建部分

Adding quality gate to Jenkins maven project's build section

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

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

这里是我希望定义和实施质量门的地方:

我尝试将 Quality Gate 添加到 'Post Build' 部分,但没有可用的选项对我有用(我想尝试使 'SonarQube Analysis with Maven' 选项起作用,但现在已弃用)。我还发现 Jenkins 可以使用 'Quality Gate' 插件,但它有一个我不想拥有的漏洞(但想知道是否有任何替代该插件的方法)。

我认为 'Pre-Steps' 部分中的 'Execute SonarQube Scanner' 选项可以做到这一点,但我找不到我需要添加到 sonar-project.properties 文件中的正确 line/lines (有没有像sonar.qualityGateFailBuild = true这样的选项?)

This这里的问题提到Maven版本是个问题。想知道是否可以解决它? (我的maven版本是3.8.0,改不了)

更新

找到允许配置 sonar.property 文件的 'Post step' 部分。目前,它看起来如下所示,但 Quality Gate 仍然没有让我的构建失败。我还需要添加哪些参数?:

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

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

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

Note: The location of the file report-task.txt depends on the tool that was used to generate it (in your case it is gradle). For eg. like The "mvn sonar:sonar" task defaults to "target/sonar". This location is controlled by the "sonar.scanner.metadataFilePath" property

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

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

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

经过反复试验,我发现 this post 真是救命恩人。当我尝试使用 Nanotron 的代码(最后一个答案)时出现了一些错误,因此我添加了一些调整。这是对我有用的(我使用了 Jenkins 项目的 'Post Steps' --> 'Execute shell command' 部分):

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