2015-10-13 16 views
8

Tôi có một dự án Jenkins được cấu hình (Tôi sẽ gọi nó là SuperJob ở đây) để chỉ cần gọi một vài dự án jenkins khác nhau theo thứ tự.Xây dựng SubProject qua Jenkins API

Tôi muốn để có thể tìm ra kết quả của tất cả các tiểu dự án cho một số xây dựng cụ thể của SuperJob này qua Jenkins API

Nhìn vào mã đăng HERE tôi có thể để có được danh sách các cụ các dự án được cấu hình trong dự án SuperJob từ mỗi bản dựng tuy nhiên tôi không thể tìm ra cách để truy vấn số xây dựng cụ thể của từng dự án này được chạy từ một bản dựng cụ thể của SuperJob.

Ví dụ: tôi muốn tìm hiểu rằng "SuperJob build # 5" đã kích hoạt "MyJob build # 3" và "OtherJob build # 20" để tôi có thể tổng hợp và kiểm tra kết quả cho tất cả chúng.

Tôi đã thử tất cả API thượng lưu và hạ lưu bao gồm việc sử dụng các dự án con làm đối số cho các dự án liên quan nhưng tất cả đều trả về trống hoặc không.

Tôi đoán điều này là có thể vì chính Jenkins có thể hiển thị thông tin đó trong ui web đến từ một plugin nhưng tôi không thể tìm hiểu cách thực hiện.

+0

Tôi thực sự là người duy nhất có vấn đề như vậy? Hoặc có lẽ nó đơn giản đến nỗi tôi đang thiếu một cái gì đó – ByteFlinger

+0

Không, vài phút trước tôi đã đối mặt với cùng một câu hỏi ..) Tôi cần lấy lại chuỗi các bản xây dựng thông qua REST API. – Nakilon

+0

Vâng Jenkins rõ ràng là có thể lấy thông tin chính xác bởi vì khi tôi cấu hình SuperJob thất bại ngay lập tức khi một trong các công việc phụ thất bại, jenkins sẽ chỉ hiển thị những cái đã chạy trong danh sách, tuy nhiên sử dụng API bạn sẽ nhận được xây dựng mà không thuộc về công việc siêu cụ thể đó xây dựng – ByteFlinger

Trả lời

2

Tôi có cùng một vấn đề và hiện tại giải pháp tôi sử dụng để tìm các bản dựng phụ là bằng cách phân tích nhật ký bảng điều khiển của mỗi bản dựng. nhật ký chứa các tên công việc được kích hoạt và các số bản dựng (sau khi hoàn thành).

import hudson.console.ConsoleNote; 
jenkins = Jenkins.getInstance() 
jobName = "root-job-name"  //just an example 
buildNumber = 123    //just an example 
job = jenkins.getItem(jobName) 
startBuild = job.getBuildByNumber(buildNumber) 

//scanning the tree using BFS 
list = [] 
visitedList = [] 
q = list as java.util.Queue 
q<<startBuild 
visitedList.add(startBuild) 
while (!q.empty){ 
    node = q.poll() 

    subjobs = getTriggeredBuildssByBuild(node) //see method bellow 
    subjobs.each{ subj -> 
     if (!(subj in visitedList)){ 
      visitedList.add(subj) 
      q<<subj 
     } 
    } 
} 

//printing results 
visitedList.each{ 
    println "Job name and build number: ${it}" 
} 


//parsing the log of the Run object to get sub builds triggered by it 
def getTriggeredBuildssByBuild(def run){ 
    list =[] 
    if (run != null && ((reader = run.getLogReader()) != null)) { 

     BufferedReader bufferedReader = new BufferedReader(reader); 

     for (String line = bufferedReader.readLine(); 
      line != null; 
      line = bufferedReader.readLine()) { 

      //strip off jenkins specific encoding 
      line = ConsoleNote.removeNotes(line); 
      matcher = line=~/Finished Build : #(\d+) of Job : (.*) with/ 
      if(matcher){ 
       foundJob = matcher[0][2] 
       foundBuildNum = Integer.parseInt(matcher[0][1]) 
       foundBuild=jenkins.getItem(foundJob).getBuildByNumber(foundBuildNum) 
       list.add(foundBuild) 
      } 
     } 
    } 
return list 
} 

Một vài lưu ý:

  1. bạn sẽ cần phải xem xét rằng việc regex tôi sử dụng là phù hợp cho tất cả các trường hợp của bạn, tất nhiên bạn có thể thay đổi nó thành một phương pháp để kiểm tra đối với một vài khác regex phù hợp.
  2. Trong trường hợp bạn sử dụng plugin multijob, và tất cả công việc của bạn là từ loại đó, nó dễ dàng hơn nhiều, vì MultijobBuild có getSubBuilds() trả về chính xác những gì bạn muốn.
  3. Tôi vẫn đang tìm cách tốt hơn để tìm các bản dựng phụ được kích hoạt bởi một bản dựng cụ thể, đặc biệt nếu nó có thể trả về các bản dựng ở tất cả các tiểu bang, hoàn thành hoặc vẫn đang xây dựng.
+0

Cảm ơn bạn đã chia sẻ.Tôi chân thành hy vọng rằng việc phân tích nhật ký không phải là cách duy nhất để truy xuất thông tin này. Nếu đây là trường hợp tôi nghĩ rằng chúng tôi có thể cần phải đưa lên một vé tăng cường với Jenkins như một API không nên thiếu – ByteFlinger

+0

Một tùy chọn khác tôi tìm thấy nó để sử dụng https://github.com/jenkinsci/downstream-buildview-plugin. plugin này thêm một DownstreamBuildViewAction vào mỗi build bằng cách sử dụng DownstreamBuildViewRunListener. sau đó bạn sử dụng get the DownstreamBuildViewAction có các phương thức như: public int getDownstreamBuildNumber (String projectName) và public List getDownstreamBuildList(). –

Các vấn đề liên quan