jenkins - 等待质量门返回 401
问题描述
我的服务器上有一个 SonarQube 服务器 & sonar-scanner + Jenkins 设置(没有 docker)。我遇到的问题是质量门步骤总是返回 401,即使分析工作正常。我怀疑可能存在授权问题,但我不知道如何发送到 waitForQualityGate 方法。
INFO: Analysis total time: 12.972 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 14.641s
INFO: Final Memory: 13M/50M
INFO: ------------------------------------------------------------------------
[Pipeline] }
[Pipeline] // withSonarQubeEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Quality gate)
[Pipeline] waitForQualityGate
Checking status of SonarQube task 'AXoxAunUF1YE_9gTnBHP' on server 'SonarQube'
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
org.sonarqube.ws.client.HttpException: Error 401 on https://<sonar-url>/api/ce/task?id=AXoxAunUF1YE_9gTnBHP :
at org.sonarqube.ws.client.BaseResponse.failIfNotSuccessful(BaseResponse.java:36)
at hudson.plugins.sonar.client.HttpClient.getHttp(HttpClient.java:38)
at hudson.plugins.sonar.client.WsClient.getCETask(WsClient.java:51)
at org.sonarsource.scanner.jenkins.pipeline.WaitForQualityGateStep$Execution.checkTaskCompleted(WaitForQualityGateStep.java:234)
at org.sonarsource.scanner.jenkins.pipeline.WaitForQualityGateStep$Execution.start(WaitForQualityGateStep.java:171)
at org.jenkinsci.plugins.workflow.cps.DSL.invokeStep(DSL.java:319)
at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:193)
at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:122)
at jdk.internal.reflect.GeneratedMethodAccessor544.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1213)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:42)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:163)
at org.kohsuke.groovy.sandbox.GroovyInterceptor.onMethodCall(GroovyInterceptor.java:23)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:157)
at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:161)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:165)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:135)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:17)
at WorkflowScript.run(WorkflowScript:25)
我的 Jenkinsfile 看起来像这样
pipeline {
agent any
stages {
stage('Clone sources') {
steps {
git branch: 'main',
credentialsId: '<github-credentials-id>',
url: '<github-url>'
}
}
stage('SonarQube analysis') {
steps {
withSonarQubeEnv('SonarQube') {
sh "sonar-scanner \
-Dsonar.projectKey=<project-key> \
-Dsonar.sources=. \
-Dsonar.host.url=https://<sonar-url> \
-Dsonar.login=<scanner-user-token>"
}
}
}
stage("Quality gate") {
steps {
timeout(time: 1, unit: 'HOURS') {
waitForQualityGate abortPipeline: true
}
}
}
}
}
为了生成它,<scanner-user-token>
我在我的 SonarQube 中创建了一个新用户(扫描仪用户)并为其生成了一个令牌。
到目前为止我尝试过的
- 在我的 Jenkins 实例中添加
<scanner-user-token>
作为全局机密文本 +credentialsId
在质量门步骤中添加为机密文本生成的凭据 ID。
...
stage("Quality gate") {
steps {
timeout(time: 1, unit: 'HOURS') {
waitForQualityGate abortPipeline: true,
credentialsId: '<global-scanner-user-token-id>',
}
}
}
...
- 删除 SonarQube 中的强制登录。
其他配置
我认为webhook在 SonarQube 中正确设置,因为它提供得很好。
SonarQube 服务器像这样在 Jenkins 中设置
我用来进行分析的用户对项目具有适当的权限
版本
- 詹金斯 2.289.1
- SonarQube 8.9.1
- 声纳扫描仪 4.6.2
谢谢!
解决方案
我设法解决了这样的问题:
- 从 SonarQube 分析步骤中删除 -Dsonar.login
stage('SonarQube analysis') {
steps {
withSonarQubeEnv('SonarQube') {
sh "sonar-scanner \
-Dsonar.projectKey=<project-key> \
-Dsonar.sources=. \
-Dsonar.host.url=https://<sonar-url> "
}
}
}
- 在 Jenkins 中使用
- 在 Jenkins 内部转到 **Configure System -> SonarQube servers ** 并设置服务器身份验证令牌,即在第 2 点设置的全局机密。还要检查环境变量
推荐阅读
- java - 如何使用 NFCA.transceive 正确处理 IOException?
- logstash - 未为 RHEL 6.8 创建 /etc/init.d/logstash 文件
- scipy - 如果使用不同的包,为什么我会得到不同的 P 值
- javascript - javascript中的绑定是否应该在非全局上下文中使用,如果是这样,下面的代码有什么问题?
- reporting-services - 有没有办法只显示文本框的内容到文本框大小是 ssrs 报告
- mysql - 从特定时间戳数据库 laravel-api 获取数据
- javascript - 如何使用jquery在随机秒后将数字增加1?
- java - servlet [jsp] 的 Servlet.service() 在路径 [/Student_Portal_2.0] 的上下文中引发异常 [java.lang.NullPointerException],根本原因
- windows - Git安装失败
- python-3.x - 在 Python 中使用类参数作为函数装饰器