2015-02-24 21 views
7

Tôi đang thử nghiệm Jenkins để xem liệu nó có phù hợp với khung xây dựng và thử nghiệm của chúng tôi hay không. Tôi thấy rằng Jenkins và các plugin có sẵn của nó phù hợp với hầu hết nhu cầu của chúng tôi. Ngoại trừ việc tôi dường như không thể tìm thấy sự giúp đỡ về cách làm một loại nhiệm vụ cụ thể.Làm thế nào để chạy cùng một công việc nhiều lần song song với Jenkins?

Chúng tôi đang tạo ứng dụng cho các thiết bị được nhúng. Chúng tôi có 100 bài kiểm tra cần phải chạy trên các thiết bị này. Nếu chúng tôi chạy tất cả các thử nghiệm trên một thiết bị sau khi xây dựng thì sẽ mất vài giờ để có được kết quả. Tuy nhiên, nếu chúng tôi chạy thử nghiệm trên 100 thiết bị song song thì chúng tôi có thể nhận được kết quả trong thời gian ngắn hơn nhiều.

Tất cả các thử nghiệm sẽ có điểm xuất phát rất giống nhau. Một kịch bản thử nghiệm được gọi với địa chỉ IP của thiết bị để chạy thử nghiệm và tên người dùng/pw. Kịch bản lệnh sẽ thực hiện các kiểm tra cần thiết trên thiết bị và báo cáo trả về/thất bại cho mỗi mục kiểm tra. Tôi nghĩ rằng cách lâu dài/đau đớn của việc này là viết 100 công việc trong Jenkins, mỗi kịch bản lệnh sẽ khác nhau một cách trực tiếp (với các tham số ở trên) và chạy song song bằng cách sử dụng các plugin sẵn có. Tuy nhiên, việc duy trì tất cả các công việc này sẽ rất khó khăn trong thời gian dài. Vì vậy, cách tốt hơn để làm điều này là tạo một Job (gọi nó là child_tester) có thể lấy các tham số như: tên kịch bản lệnh thử nghiệm, địa chỉ IP của thiết bị, tên người dùng/pw, v.v. Sau đó, sử dụng một công cụ khác job (gọi nó là mother_tester) để gọi child_tester job 100 lần với các địa chỉ IP khác nhau và chạy chúng song song. Tôi sẽ cần một số cách để tích lũy tất cả các kết quả kiểm tra của mỗi lần chạy riêng lẻ của các công việc child_tester và báo cáo chúng lại cho mother_tester.

Câu hỏi của tôi là có plugin hoặc cách nào để hoàn thành điều này trong Jenkins? Tôi đã xem xét thông tin của các plugin có tên "Build Flow", "Parallel Test Executor" và "Parameterized Trigger". Tuy nhiên, chúng dường như không phù hợp với nhu cầu của tôi.

Cảm ơn sự giúp đỡ của bạn.

Trả lời

10

Tôi hiểu bạn đã xem xét plugin Trình xây dựng, nhưng tôi không chắc chắn lý do tại sao bạn đã loại bỏ nó. Có lẽ bạn có thể chỉ ra các lỗ hổng trong đề xuất của tôi.

Giả sử bạn có đủ người thi hành trong hệ thống để chạy công việc song song, tôi nghĩ rằng Build Flow pluginBuild Flow Test Aggregator plugin có thể làm những gì bạn muốn.

  • Plugin dòng xây dựng hỗ trợ running jobs in parallel. Tôi không thấy bất kỳ lý do tại sao Build Flow không thể lên lịch cho công việc "con" của bạn để chạy song song với các tham số khác nhau.

  • Trình kiểm tra lưu lượng xây dựng lấy kết quả thử nghiệm từ các bản dựng theo lịch trình của công việc Xây dựng luồng, vì vậy công việc "con" của bạn sẽ cần xuất bản kết quả thử nghiệm của riêng mình.

  • Bạn sẽ cần phải định cấu hình công việc "con" để có thể chạy song song bằng cách chọn "Thực thi các bản dựng đồng thời nếu cần" trong cấu hình công việc.

  • Bất kỳ tập hợp nô lệ nào cung cấp kết nối tới thiết bị được nhúng sẽ cần đủ trình điều khiển để chạy công việc của bạn song song.


Cập nhật: với định nghĩa xây dựng luồng đơn giản:

parallel (
    { build("dbacher flow child", VALUE: 1) }, 
    { build("dbacher flow child", VALUE: 2) }, 
    { build("dbacher flow child", VALUE: 3) }, 
    { build("dbacher flow child", VALUE: 4) } 
) 

tôi nhận được kết quả:

parallel { 
    Schedule job dbacher flow child 
    Schedule job dbacher flow child 
    Schedule job dbacher flow child 
    Schedule job dbacher flow child 
    Build dbacher flow child #5 started 
    Build dbacher flow child #6 started 
    Build dbacher flow child #7 started 
    Build dbacher flow child #8 started 
    dbacher flow child #6 completed 
    dbacher flow child #7 completed 
    dbacher flow child #5 completed 
    dbacher flow child #8 completed 
} 

Công việc lịch sử cho thấy rằng tất cả bốn công việc dự kiến trong vòng vài giây của nhau. Nhưng công việc xây dựng bước có chứa một sự chậm trễ nhân tạo (ngủ) mà có thể ngăn chặn bất kỳ xây dựng duy nhất từ ​​hoàn thành một cách nhanh chóng.


Cập nhật 2: Dưới đây là một ví dụ về việc tạo ra danh sách các nhiệm vụ song song tự động từ một cấu trúc dữ liệu:

// create a closure for the deploy job for each server 
def paramValues = (1..4) 
def testJobs = [] 
for (param in paramValues) { 
    def jobParams = [VALUE: param] 
    def testJob = { 
    // call build 
    build(jobParams, "dbacher flow child") 
    } 
    println jobParams 
    testJobs.add(testJob) 
} 

parallel(testJobs) 

Danh sách truyền cho song song đây là danh sách đóng cửa mà gọi xây dựng với các thông số duy nhất. Tôi đã phải chắc chắn để xác định các thông số công việc bên ngoài chức năng đóng cửa để đảm bảo các công việc sẽ được lên lịch riêng.

Tôi cribbed cú pháp từ một số khác answerthis thread trên danh sách gửi thư Jenkins.

+0

Trình cắm luồng xây dựng không hoạt động khi cùng một tên công việc được chạy song song. Ví dụ, xây dựng dòng chảy của tôi trông như thế này: song song ( {xây dựng ("FreestyleTest1")}, {xây dựng ("FreestyleTest1")} ) Tuy nhiên, trong trường hợp này kết quả có dạng: song song { Schedule việc FreestyleTest1 Lên lịch công việc FreestyleTest1 Build FreestyleTest1 # 29 bắt đầu Xây dựng FreestyleTest1 # 29 bắt đầu FreestyleTest1 # 29 hoàn FreestyleTest1 # 29 hoàn } công việc chạy một lần duy nhất. Nếu tôi đổi một công việc sang một công việc khác, thì cả hai đều chạy song song. – Ash

+0

@Ash, Thú vị. Trong Jenkins 1.580.2 với Build Flow 0.16, tôi có thể lên lịch cho cùng một công việc con với các tham số khác nhau 4 lần và công việc con chạy 4 lần riêng biệt song song. –

+0

Cảm ơn bạn về ví dụ và chi tiết. Tôi phát hiện ra rằng nếu tôi cung cấp các tham số/giá trị khác nhau cho các công việc con thì nhiều công việc con được thực thi. Nó có thể là một lỗi plugin. Tuy nhiên, công việc vẫn không chạy song song. đầu ra Ex: song song { Lên lịch công việc FreestyleTest1 Lên lịch công việc FreestyleTest1 Build FreestyleTest1 # 36 bắt đầu FreestyleTest1 # 36 hoàn Build FreestyleTest1 # 37 bắt đầu FreestyleTest1 # 37 hoàn } ..... Jenkins ban tình trạng cho thấy 37 được chờ đợi trên 36 để kết thúc, mặc dù nút có hơn 2 trình điều khiển không hoạt động. – Ash

1

Hãy đảm bảo rằng số lượng người thực hiện trong cài đặt Quản lý Jenkins -> Quản lý nút nhiều hơn số lượng công việc riêng lẻ trong dự án MultiJob. Theo mặc định tôi đoán nó là 2. Do đó chúng tôi cần phải tăng nó.

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