【问题标题】:How To Correctly Use Jenkins PowerShell step to call Web API using Invoke-WebRequest or Invoke-RestMethod如何正确使用 Jenkins PowerShell 步骤使用 Invoke-WebRequest 或 Invoke-RestMethod 调用 Web API
【发布时间】:2021-11-19 18:35:36
【问题描述】:

我在 PowerShell 命令步骤中使用 Jenkins 来调用 Web API 服务。我正在使用Invoke-WebRequest 调用服务。

此服务调用必须在 Jenkins 中进行,因为只有在其他 Jenkins 作业成功完成时我才需要这样做。

服务可以运行几个小时。如果我没有 TimeoutSec 参数,则该步骤会在 Web API 完成之前以超时完成。如果我的参数值很大,比如 36000,那么 Web API 会正常完成,但步骤会持续 10 小时。其他参数与此问题无关。

我正在寻找一种在 Web API 完成后立即完成 Jenkins 步骤的好方法,而不是更早更晚。

try
{ 
    $url = "https://ourserver.com/modules/OurService"
    $response = Invoke-WebRequest -Uri $url -UseDefaultCredentials -Method Get -TimeoutSec 36000 -UseBasicParsing  
}
catch 
{    
    $err=$_.Exception  
    Write-Host '-----------------------'
    Write-Host $err        
    Write-Host '-----------------------'  
    exit -1
}
exit 0

【问题讨论】:

  • 您能否在 Jenkins 中添加有关您的工作定义的更多信息?也许尝试设置MaxServicePointIdleTimestackoverflow.com/a/34139528/7411885
  • 如何判断“Web API正常完成”?也许它只是完成了它的工作,但实际上并没有返回响应?
  • Cpt.Whale - 此作业仅包含两个步骤:构建触发器和构建。我没有问题定义一个固定的时间段,之后发生超时。我只是不知道如何在 Web API 完成时(而不是之前)准确退出。
  • zett42 - 我的 Web API 在成功时返回 200(OK)(我非常有信心这样做,因为 PostMan 指出了这一点)。我应该以某种方式检查 $response 中的 200 值吗?这似乎是对 Invoke-WebRequest 的同步调用,完成后永远不会到达“exit 0”。
  • 如果 $response 设置为 200,那么接下来应该已经是 exit。如果请求确实占用了整个超时时间,那么该命令应该抛出一个超时错误而不是正常退出。

标签: powershell jenkins webapi invoke-webrequest invoke-restmethod


【解决方案1】:

我尝试了不同的方法,我认为我离现在想要的位置更近了......

我决定使用 Invoke-RestMethod

一个奇怪的问题仍然存在:当我的长时间运行的服务被调用并且该服务完成时,我陷入了困境,但异常中没有任何内容。根据我的服务日志,我知道服务已成功完成。所以,在这一点上,我认为它是成功的。

try
{
  $url = "https://ourserver.com/modules/OurService"
  $response = Invoke-RestMethod -Uri $url -UseDefaultCredentials -Method Get -TimeoutSec 18000
  $response  
  Write-Host 'Exit with success'
  exit 0
}
catch
{
  if (($_.Exception) -and ($_.Exception.Response))
  {
    $respStream = $_.Exception.Response.GetResponseStream()
    $reader = New-Object System.IO.StreamReader($respStream)
    $reader.BaseStream.Position = 0
    $responseBody = $reader.ReadToEnd() | ConvertFrom-Json
    '------------------------------------------------------------------------------------------------------------------------' 
    'Error Message:'
    $responseBody.Message
    $_.Exception
    '------------------------------------------------------------------------------------------------------------------------'
    exit -1
  }
  else
  {
    '------------------------------------------------------------------------------------------------------------------------' 
    'Got to catch, but no exception (we should not have gotten to "catch" area, possible PowerShell bug)'  
    '------------------------------------------------------------------------------------------------------------------------'
    exit 0
  }
  
}

【讨论】:

    猜你喜欢
    • 2017-07-26
    • 2019-01-09
    • 2016-06-21
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多