-
Bug
-
Resolution: Unresolved
-
Major
-
None
After updating the global SonarQube installations (for example change the hostname / URL, some job pages would not display and the Jenkins logs are spammed with:
WARNING h.p.s.client.SQProjectResolver#resolve: Error fetching project information
java.net.SocketTimeoutException: connect timed out
at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:412)
at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:255)
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:237)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.base/java.net.Socket.connect(Socket.java:609)
at okhttp3.internal.platform.Platform.connectSocket(Platform.java:124)
at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:221)
at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:147)
at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:192)
at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:121)
at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:100)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:120)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:185)
at okhttp3.RealCall.execute(RealCall.java:69)
at org.sonarqube.ws.client.HttpConnector.doCall(HttpConnector.java:188)
Caused: java.lang.IllegalStateException: Fail to request ${OLD_URL}/api/ce/task?id=XXXXXXXXXXXXXXX
at org.sonarqube.ws.client.HttpConnector.doCall(HttpConnector.java:190)
at org.sonarqube.ws.client.HttpConnector.get(HttpConnector.java:124)
at org.sonarqube.ws.client.HttpConnector.call(HttpConnector.java:111)
at hudson.plugins.sonar.client.HttpClient.getHttp(HttpClient.java:37)
at hudson.plugins.sonar.client.WsClient.getCETask(WsClient.java:51)
at hudson.plugins.sonar.client.SQProjectResolver.requestCETaskDetails(SQProjectResolver.java:98)
at hudson.plugins.sonar.client.SQProjectResolver.resolve(SQProjectResolver.java:75)
at hudson.plugins.sonar.action.SonarCacheAction.get(SonarCacheAction.java:76)
at hudson.plugins.sonar.action.SonarCacheAction.get(SonarCacheAction.java:52)
at hudson.plugins.sonar.action.SonarProjectActionFactory.createProjectPage(SonarProjectActionFactory.java:117)
at hudson.plugins.sonar.action.SonarProjectActionFactory.createFor(SonarProjectActionFactory.java:83)
at hudson.plugins.sonar.action.SonarProjectActionFactory.createFor(SonarProjectActionFactory.java:42)
at hudson.model.Actionable.createFor(Actionable.java:115)
at hudson.model.Actionable.getAction(Actionable.java:330)
at jenkins.branch.ItemColumn.isPrimary(ItemColumn.java:67)
Quickly checking into this, it looks like the transient action is created based on the last completed build information: https://github.com/jenkinsci/sonarqube-plugin/blob/sonar-2.15/src/main/java/hudson/plugins/sonar/action/SonarProjectActionFactory.java#L65-L66. And builds that have been completed before the change still have reference to the old details:
[...]
<hudson.plugins.sonar.action.SonarAnalysisAction plugin="sonar@2.15">
<installationName>my-sonar-install</installationName>
<installationUrl>https://old.url</installationUrl>
<ceTaskId>XXXXXXXXXXXXX</ceTaskId>
<url>https://old.url/dashboard?id=com.acme.myapp%3Amyapp</url>
<serverUrl>https://old.url</serverUrl>
<isNew>true</isNew>
<isSkipped>false</isSkipped>
</hudson.plugins.sonar.action.SonarAnalysisAction>
[...]
The action should probably not persist URLs but lookup the information using the installationName..