【发布时间】:2017-11-10 05:02:25
【问题描述】:
今天我在设置一个检查质量门的 Jenkins 流水线脚本时遇到了异常 并用任何新问题注释拉取请求。
我们的设置包含:
- SonarQube 6.2
- BitBucket 存储
- Jenkins 2(带 2 个从站)
- AmadeusITGroup 存储插件
部分流水线脚本:
node(node_label) {
stage("SonarQube analysis") {
withSonarQubeEnv('SonarQube') {
def sonarQubeCommand = "org.sonarsource.scanner.maven:sonar-maven-plugin:3.2:sonar " +
"-Dsonar.host.url=https://sonar-url " +
"-Dsonar.login=sonarqube " +
"-Dsonar.password=token " +
"-Dsonar.language=java " +
"-Dsonar.sources=. " +
"-Dsonar.inclusions=**/src/main/java/**/*"
if (pr.id != '') {
sonarQubeCommand = sonarQubeCommand +
" -Dsonar.analysis.mode=preview" +
" -Dsonar.stash.notification=true " +
" -Dsonar.stash.project=" + pr.project_key +
" -Dsonar.stash.repository=" + pr.repository_slug +
" -Dsonar.stash.pullrequest.id=" + pr.id +
" -Dsonar.stash.password=token"
}
pipeline.mvn(sonarQubeCommand)
}
}
}
stage("Check Quality Gate") {
timeout(time: 1, unit: 'HOURS') {
def qg = waitForQualityGate()
waitUntil {
// Sometimes an analysis will get the status PENDING meaning it still needs to be analysed.
if (qg.status == 'PENDING') {
qg = waitForQualityGate()
return false
} else {
return true
}
}
node(node_label) {
if (qg.status != 'OK') {
bitbucket.comment(pr, "_${env.JOB_NAME}#${env.BUILD_NUMBER}:_ **[✖ BUILD FAILURE](${build_url})**")
bitbucket.approve(pr, false)
pipeline.cleanWorkspace()
error "Pipeline aborted due to quality gate failure: ${qg.status}"
} else {
bitbucket.comment(pr, "_${env.JOB_NAME}#${env.BUILD_NUMBER}:_ **[✔ BUILD SUCCESS](${build_url})**")
bitbucket.approve(pr, true)
}
}
}
}
顺便说一句:没有 waitUntil 管道失败,因为任务状态在 SonarQube 中为 PENDING。 所以 SonarSource 博客中的示例不太适合我。
现在详细了解此管道如何失败:
当使用 sonar.analysis.mode=preview 作为 maven 命令的参数时 jenkins 作业日志将不包含 SonarQube 分析任务 ID。 这将导致命令 waitForQualityGate 上的管道脚本失败。 消息内容如下: 无法获取 SonarQube 任务 ID 和/或服务器名称。请使用“withSonarQubeEnv”包装器来运行您的分析。
一旦我删除了 sonar.analysis.mode=preview 参数,jenkins 日志就会读取如下一行:[INFO] More about the report processing at https://sonar-url/api/ce/task?id=AVyHXjcsesZZZhqzzCSf
这一行使 waitForQualityGate 命令正常成功。 然而,除了 SonarQube 中的项目对 PR 结果的污染之外,这还有一个不需要的副作用。 副作用是,当在拉取请求中添加问题时,不会在 stash 中的拉取请求中报告此问题。 它总是报告零新问题,这显然是错误的。 由于它不再是预览分析,我可以在 SonarQube 服务器上看到新问题。
所以不知何故,我现在必须在使用新问题注释的拉取请求或 检查质量门。 显然我想两者都做。 我选择让拉取请求注释正常工作,暂时跳过质量门检查。
问题仍然是我在这里做错了什么还是我必须等待新版本的扫描仪和/或存储插件才能解决这个问题?
【问题讨论】: