1. 程式人生 > >遠端觸發Jenkins的Pipeline任務的併發問題處理

遠端觸發Jenkins的Pipeline任務的併發問題處理

### 前文概述 本文是《遠端觸發Jenkins的pipeline任務》的續篇,上一篇文章實戰了如何通過Http請求遠端觸發指定的Jenkins任務,並且將引數傳遞給Jenkins任務去使用,文末提到了有個併發問題待處理,這就是本文的內容:處理上一篇文章提到的遺留問題。 ### 遠端觸發Jenkins的問題 對Jenkins服務來說,很有可能在某一時刻同時收到多個Http請求,並且這些請求都想觸發同一個任務,在實際使用中發現此時Jenkins並不對每個請求都執行一次任務,接下來的實戰,我們就來重現並解決此問題; ### 用Java程式碼實現多個併發請求 - 我們用程式碼來模擬同一時刻多個Http請求到達Jenkins的情況:寫個Java程式,一次性發送10個Http請求,都是遠端觸發上一章的Jenkins任務的,參考原始碼如下: ```java package com.bolingcavalry; import com.alibaba.fastjson.JSONObject; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; public class App { public static void main( String[] args ) throws Exception { for(int i=0;i<10;i++) { JSONObject jsonObject = new JSONObject(); jsonObject.put("ref", "ref-"+i); jsonObject.put("repositoryURL","https://github.com/zq2599/jenkinsdemo.git"); jsonObject.put("branch", "master"); CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("http://192.168.133.149:32049/generic-webhook-trigger/invoke?token=token-remote-test"); httpPost.addHeader("Content-Type", "application/json"); httpPost.setEntity(new StringEntity(jsonObject.toJSONString())); CloseableHttpResponse response = httpClient.execute(httpPost); response.close(); httpClient.close(); System.out.println("response code : " + response.getStatusLine().getStatusCode() + "\n"); } } } ``` - 執行上述Java程式碼,控制檯輸出如下圖,返回碼都是200,證明這10個請求全部成功了: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201012074159348-817690168.png) - 去Jenkins網頁上卻發現只執行了一次任務,但是10此請求的ref引數都被打印出來了,如下圖: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201012074200287-1313991453.png) - 10次請求,Jenkins只執行了一次任務,這樣的結果顯然不是我們想要的,經過摸索和嘗試,終於找到了解決此問題的辦法; - 開啟任務remote-test的設定頁面,如下圖,勾選紅框1(This project is parameterized),點選紅框2增加一個引數,再點選紅框3增加一個字串型別的引數: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201012074201063-403002794.png) - 在引數的編輯框中,Name欄位填寫ref,如下圖紅框所示,注意這個引數在上一篇文章中在Generic Webhook Trigger的引數中設定過,是個固定引數: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201012074201684-1035476869.png) - 點選底部的Save按鈕儲存設定; - 在此執行前面的Java程式,發起10個請求,這次Jenkins建立了10個任務了,如下圖: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201012074202501-998589118.png) - 點開其中的一個檢視日誌,如下圖,可見引數正確,並且任務執行成功: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201012074203447-398732633.png) 遠端觸發Jenkins任務的併發問題已經修復,如果您也遇到了型別問題,希望本文能給您一些參考。 [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blo