Spring boot 在JENKINS管道中使用HTTP请求插件的HTTP GET调用失败,出现NoHttpResponseException

Spring boot 在JENKINS管道中使用HTTP请求插件的HTTP GET调用失败,出现NoHttpResponseException,spring-boot,groovy,jenkins-pipeline,httprequest,jenkins-plugins,Spring Boot,Groovy,Jenkins Pipeline,Httprequest,Jenkins Plugins,我正在创建一个JENKINS管道,该管道从注册表中提取Spring Boot应用程序的Docker映像,然后将其部署到Windows 10笔记本电脑上本地运行的Docker Demon上 Spring Boot应用程序公开运行状况检查API,该API生成一个JSON响应为“{”status:“UP”}”。在我的管道代码中,我使用安装在本地运行的JENKINS服务器上的JENKINS上可用的HTTP请求插件调用GET。 此调用失败,出现NoHttpResponseException。下面是一些设置

我正在创建一个JENKINS管道,该管道从注册表中提取Spring Boot应用程序的Docker映像,然后将其部署到Windows 10笔记本电脑上本地运行的Docker Demon上

Spring Boot应用程序公开运行状况检查API,该API生成一个JSON响应为“{”status:“UP”}”。在我的管道代码中,我使用安装在本地运行的JENKINS服务器上的JENKINS上可用的HTTP请求插件调用GET。 此调用失败,出现NoHttpResponseException。下面是一些设置信息

HealthCheck URL:

JENKINS服务器URL:

Groovy管道脚本成功地在本地部署了Docker映像。我能够使用POSTMAN应用程序测试healthcheck调用,该应用程序返回了期望的结果。但是,在映像部署之后使用管道调用运行状况检查URL的代码会导致失败

我在网上查阅了有关NoHttpResponseException的信息,这似乎是在使用陈旧连接发送HTTP调用时发生的。但不知道如何在管道脚本中执行与打开和关闭连接相关的任务,也不知道是否支持在HTTP请求JENKINS插件上执行该操作

非常感谢您的帮助

下面是我进行HTTP GET调用的管道代码片段

stage("Health Check"){

 def responseGetAll = httpRequest consoleLogResponseBody: true,
 contentType: 'APPLICATION_JSON',
 httpMode: 'GET',
 url: "http://localhost:8088/actuator/health",
 validResponseCodes: '200')

}
预期结果应该是被调用的URL,并返回HTTP响应代码200和响应内容,如下所示 { “状态”:“向上” }

但是,HTTP GET调用有一个异常,如下所示:-

[Pipeline] httpRequest
HttpMethod: GET
URL: http://localhost:8088/actuator/health
Sending request to url: http://localhost:8088/actuator/health
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
org.apache.http.NoHttpResponseException: localhost:8088 failed to respond
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:141)
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
    at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
    at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:165)
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
    at jenkins.plugins.http_request.util.HttpClientUtil.execute(HttpClientUtil.java:132)
    at jenkins.plugins.http_request.HttpRequestExecution.executeRequest(HttpRequestExecution.java:331)
    at jenkins.plugins.http_request.HttpRequestExecution.authAndRequest(HttpRequestExecution.java:278)
    at jenkins.plugins.http_request.HttpRequestExecution.call(HttpRequestExecution.java:215)
Caused: java.lang.IllegalStateException
    at jenkins.plugins.http_request.HttpRequestExecution.call(HttpRequestExecution.java:218)
    at jenkins.plugins.http_request.HttpRequestExecution.call(HttpRequestExecution.java:75)
    at hudson.remoting.LocalChannel.call(LocalChannel.java:45)
    at jenkins.plugins.http_request.HttpRequestStep$Execution.run(HttpRequestStep.java:336)
    at jenkins.plugins.http_request.HttpRequestStep$Execution.run(HttpRequestStep.java:318)
    at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1$1.call(AbstractSynchronousNonBlockingStepExecution.java:47)
    at hudson.security.ACL.impersonate(ACL.java:290)
    at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1.run(AbstractSynchronousNonBlockingStepExecution.java:44)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Finished: FAILURE



必须将端口从运行SpringBoot应用程序的容器映射到本地主机&该主机必须与运行http请求的主机相同

例如:

docker.image('your-image:version').withRun('--publish 8088:8088 ') {
  // wait for the container to spin up your app
  // run your test(s)
}

必须将端口从运行SpringBoot应用程序的容器映射到本地主机&该主机必须与运行http请求的主机相同

例如:

docker.image('your-image:version').withRun('--publish 8088:8088 ') {
  // wait for the container to spin up your app
  // run your test(s)
}

感谢@Rich Duncan,感谢您的回复。我已经成功地公开了docker映像,只是我通过docker命令公开了它,如下所示
docker run-d-p 8088:8088--name=inventory service inventory service docker:1.2
,而不是通过docker Plugin(您建议的插件)。正如我在文章中提到的,我能够通过邮递员成功地测试这个应用程序。问题似乎是没有调用使用HTTP请求插件的HTTP GET调用,也没有暴露Docker映像。因此,我可以更好地了解配置问题-Docker运行是否在同一管道中发生?需要记住的其他事项#1在健康检查完成之前,您需要保持容器运行#2在运行运行运行状况检查之前,您需要确保应用程序已启动并正在运行是的,Docker运行来自同一管道。但看起来我走错了方向。我这么说是因为,我删除了HTTP请求插件的代码,并使用了URL调用(尽管JENKINS docs不推荐使用)作为
newURL(“http://localhost:8088/actuator/health”).openConnection(),即使此代码返回时也有错误。看起来由于某种原因,我在本地安装的JENKINS无法与本地运行的Docker通信。虽然这只是对POC的本地测试,但在PROD中,Docker和JENKINS将在Linux上的不同主机上运行,而CURL将在这些主机上正常工作。谢谢@Rich Duncan的回复。我已经成功地公开了docker映像,只是我通过docker命令公开了它,如下所示
docker run-d-p 8088:8088--name=inventory service inventory service docker:1.2
,而不是通过docker Plugin(您建议的插件)。正如我在文章中提到的,我能够通过邮递员成功地测试这个应用程序。问题似乎是没有调用使用HTTP请求插件的HTTP GET调用,也没有暴露Docker映像。因此,我可以更好地了解配置问题-Docker运行是否在同一管道中发生?需要记住的其他事项#1在健康检查完成之前,您需要保持容器运行#2在运行运行运行状况检查之前,您需要确保应用程序已启动并正在运行是的,Docker运行来自同一管道。但看起来我走错了方向。我这么说是因为,我删除了HTTP请求插件的代码,并使用了URL调用(尽管JENKINS docs不推荐使用)作为
newURL(“http://localhost:8088/actuator/health”).openConnection(),即使此代码返回时也有错误。看起来由于某种原因,我在本地安装的JENKINS无法与本地运行的Docker通信。虽然这只是对POC的本地测试,但在PROD中,Docker和JENKINS将在Linux上的不同主机上运行,而CURL将在Linux上正常工作。Docker映像的
Dockerfile
s之一中的用户是否发生了更改?(命令
用户5
)。我假设用户必须是root用户(id为0)。是否在Docker映像的
Dockerfile
s中更改了用户?(命令
用户5
)。我假设用户必须是root用户(id为0)。