我想知道如何從(groovy)Jenkins工作流腳本中調用REST API。我可以執行「sh'curl -X POST ...'」 - 它可以工作,但將請求作爲curl命令構建起來很麻煩,處理響應變得複雜。我更喜歡本地的Groovy HTTP客戶端在groovy中進行編程 - 我應該從哪一個開始?由於腳本在Jenkins中運行,所以需要將所有需要的依賴關係jar複製到Jenkins上的groovy安裝中,因此輕量級的東西將值得讚賞。如何從jenkins工作流程調用REST
回答
您是否嘗試過Groovy的HTTPBuilder類? 例如:
@Grapes(
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7.1')
)
import groovyx.net.http.HTTPBuilder
import static groovyx.net.http.ContentType.*
import static groovyx.net.http.Method.*
def http = new HTTPBuilder("http://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo")
http.request(POST, JSON) { req ->
body = []
response.success = { resp, reader ->
println "$resp.statusLine Respond rec"
}
}
根據OP的要求,您可以擴展一下如何將HTTPBuilder庫安裝到Jenkins中嗎?它似乎默認情況下不可用。 –
我已經更新了示例以展示如何使用Grapes Grab來拉取相關的HttpBuilder庫,而不需要額外的步驟來包含在Jenkins類路徑中。 – pczeus
我終於開始測試這個,不幸的是它失敗了,並帶有這裏的錯誤:https://gist.github.com/strich/38e472eac507bc73e785 –
阻塞主線程I/O調用是不是一個好主意。
當前,建議將I/O操作委託給shell步驟。
另一種需要開發的方式是增加一個新的步驟。順便說一下,有一個an initiative添加了一套通用的步驟來安全地使用流水線腳本,儘管一個完整的REST客戶端擁有自己的插件。
感謝您對pipeline-utility-steps-plugin的鏈接,感興趣。 –
我在安裝HTTPBuilder庫時遇到了問題,所以我最終使用了更基本的URL類來創建HttpUrlConnection。
HttpResponse doGetHttpRequest(String requestUrl){
URL url = new URL(requestUrl);
HttpURLConnection connection = url.openConnection();
connection.setRequestMethod("GET");
//get the request
connection.connect();
//parse the response
HttpResponse resp = new HttpResponse(connection);
if(resp.isFailure()){
error("\nGET from URL: $requestUrl\n HTTP Status: $resp.statusCode\n Message: $resp.message\n Response Body: $resp.body");
}
this.printDebug("Request (GET):\n URL: $requestUrl");
this.printDebug("Response:\n HTTP Status: $resp.statusCode\n Message: $resp.message\n Response Body: $resp.body");
return resp;
}
/**
* Posts the json content to the given url and ensures a 200 or 201 status on the response.
* If a negative status is returned, an error will be raised and the pipeline will fail.
*/
HttpResponse doPostHttpRequestWithJson(String json, String requestUrl){
return doHttpRequestWithJson(json, requestUrl, "POST");
}
/**
* Posts the json content to the given url and ensures a 200 or 201 status on the response.
* If a negative status is returned, an error will be raised and the pipeline will fail.
*/
HttpResponse doPutHttpRequestWithJson(String json, String requestUrl){
return doHttpRequestWithJson(json, requestUrl, "PUT");
}
/**
* Post/Put the json content to the given url and ensures a 200 or 201 status on the response.
* If a negative status is returned, an error will be raised and the pipeline will fail.
* verb - PUT or POST
*/
HttpResponse doHttpRequestWithJson(String json, String requestUrl, String verb){
URL url = new URL(requestUrl);
HttpURLConnection connection = url.openConnection();
connection.setRequestMethod(verb);
connection.setRequestProperty("Content-Type", "application/json");
connection.doOutput = true;
//write the payload to the body of the request
def writer = new OutputStreamWriter(connection.outputStream);
writer.write(json);
writer.flush();
writer.close();
//post the request
connection.connect();
//parse the response
HttpResponse resp = new HttpResponse(connection);
if(resp.isFailure()){
error("\n$verb to URL: $requestUrl\n JSON: $json\n HTTP Status: $resp.statusCode\n Message: $resp.message\n Response Body: $resp.body");
}
this.printDebug("Request ($verb):\n URL: $requestUrl\n JSON: $json");
this.printDebug("Response:\n HTTP Status: $resp.statusCode\n Message: $resp.message\n Response Body: $resp.body");
return resp;
}
class HttpResponse {
String body;
String message;
Integer statusCode;
boolean failure = false;
public HttpResponse(HttpURLConnection connection){
this.statusCode = connection.responseCode;
this.message = connection.responseMessage;
if(statusCode == 200 || statusCode == 201){
this.body = connection.content.text;//this would fail the pipeline if there was a 400
}else{
this.failure = true;
this.body = connection.getErrorStream().text;
}
connection = null; //set connection to null for good measure, since we are done with it
}
}
,然後我可以做一個GET的東西,如: HttpResponse resp = doGetHttpRequest("http://some.url");
而且使用的東西與JSON數據的PUT,如: HttpResponse resp = this.doPutHttpRequestWithJson("{\"propA\":\"foo\"}", "http://some.url");
謝謝,這可能是要走的路。我提出了你的答案,一旦我有一些時間來測試它,我會接受它。 –
有一個內置在步驟可用的是使用Jenkins HTTP請求插件發出http請求。
插件:https://wiki.jenkins-ci.org/display/JENKINS/HTTP+Request+Plugin
步驟文檔:從插件GitHub的頁面https://jenkins.io/doc/pipeline/steps/http_request/#httprequest-perform-an-http-request-and-return-a-response-object
例子:
def response = httpRequest "http://httpbin.org/response-headers?param1=${param1}"
println('Status: '+response.status)
println('Response: '+response.content)
本地Groovy代碼而不導入任何軟件包:
// GET
def get = new URL("https://httpbin.org/get").openConnection();
def getRC = get.getResponseCode();
println(getRC);
if(getRC.equals(200)) {
println(get.getInputStream().getText());
}
// POST
def post = new URL("https://httpbin.org/post").openConnection();
def message = '{"message":"this is a message"}'
post.setRequestMethod("POST")
post.setDoOutput(true)
post.setRequestProperty("Content-Type", "application/json")
post.getOutputStream().write(message.getBytes("UTF-8"));
def postRC = post.getResponseCode();
println(postRC);
if(postRC.equals(200)) {
println(post.getInputStream().getText());
}
- 1. jenkins的工作流程
- 2. Jenkins工作流程插件:如何從groovy DSL創建作業?
- 3. 如何調用此工作流程?
- 4. 「從腳本調用」Powershell工作流程
- 5. 如何在jenkins工作流程中使用文件參數
- 6. Jenkins CI工作流程實現
- 7. Jenkins中的模板工作流程
- 8. Jenkins工作流程插件可視化
- 9. 從WSO2 BPEL工作流調用REST服務
- 10. 在工作流程中調用工作流程
- 11. 如何使用REST API在Activiti中啓動工作流程
- 12. jenkins工作流程插件的調試輸出
- 13. 如何在Jenkins工作流程中重複一個階段
- 14. Jenkins工作流程:如何獲取或設置步驟編號
- 15. PayPal Rest API Express結帳工作流程
- 16. 從Jenkins工作流程更新Jira門票(jenkinsfile)
- 17. Jenkins工作流程-filenotfound工作區文件
- 18. Knime:從Java應用程序調用Knime工作流程
- 19. AX2009:工作流程,如何使用VS遠程調試AX32SERV?
- 20. 如何使用Jenkins Workflow流程創建具有多個管道的複雜價值流工作流程
- 21. 如何暫停工作流程並恢復工作流程?
- 22. 如何使用POST-SELECT通過API調用FLOWGEAR工作流程
- 23. 從工作流調用主機方法
- 24. 在EventReceiver後調用SharePoint工作流程
- 25. 調用工作流程活動
- 26. Jenkins iLmBjh流程有什麼作用?
- 27. Jenkins工作流程檢查作業是否正在運行或調度
- 28. 從另一個工作流程中運行工作流程
- 29. 從狀態工作流程內啓動順序工作流程
- 30. 無法從工作流程
你找到了解如何將HTTPBuilder安裝到Jenkin中S' –
S.Richmond將問題中提到的所有缺少的jar複製到Groovy libs文件夾中,但這樣做使Jenkins服務器的配置過於複雜。畢竟,我認爲我堅持捲曲。 –
你介意在jenkins安裝中指出文件夾的存在位置嗎? –