等待质量门返回 401

Posted

技术标签:

【中文标题】等待质量门返回 401【英文标题】:waitForQualityGate return 401 【发布时间】:2021-09-05 15:03:11 【问题描述】:

我的服务器上有一个 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
                
            
        
    

为了生成 &lt;scanner-user-token&gt;,我在我的 SonarQube 中创建了一个新用户 (scanner-user) 并为其生成了一个令牌。

到目前为止我已经尝试过什么

在我的 Jenkins 实例中添加 &lt;scanner-user-token&gt; 作为全局机密文本 + 在质量门步骤中添加 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 中设置,如 this

我用来进行分析的用户在项目上有正确的permissions

版本

詹金斯 2.289.1 SonarQube 8.9.1 SonarScanner 4.6.2

谢谢!

【问题讨论】:

【参考方案1】:

我设法解决了这样的问题:

    从 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 点设置的全局机密。同时检查环境变量

【讨论】:

以上是关于等待质量门返回 401的主要内容,如果未能解决你的问题,请参考以下文章

在主线程上启动对话框等待工作线程的结果

在 Angular 错误拦截器中等待模态承诺

如何让另一个异步调用等待?

Angular 7:拦截器中的等待函数

如何在调用WS之前等待某事

异步/等待不等待返回值