2012-07-13 37 views
10

Tôi hầu như không bắt đầu sử dụng Jenkins và đây là vấn đề đầu tiên tôi đã có cho đến nay. Về cơ bản công việc jenkins của tôi luôn thành công ngay cả khi một lỗi xảy ra trong một số bài kiểm tra. Đây là những gì tôi đang chạy trong cấu hình shell:Jenkins thành công khi kiểm tra đơn vị thất bại (Rails)

bundle install 
rake db:migrate:reset 
rake test:units 
rake spec:models 

Thing là Jenkins chỉ báo cáo thất bại khi tác vụ thất bại là tác vụ cuối cùng. Ví dụ, nếu tôi đặt "kiểm tra rake: đơn vị" nhiệm vụ cuối cùng nó sẽ thông báo lỗi nếu có điều gì đó sai. Sử dụng cấu hình này, tôi chỉ nhận được các báo cáo lỗi cho các thử nghiệm rspec nhưng không nhận được các bài kiểm tra đơn vị.

Bất cứ ai tự hỏi tại sao tôi không chỉ sử dụng thử nghiệm rspec hoặc đơn vị, chúng tôi hiện đang chuyển sang rspec nhưng vấn đề này vẫn còn đau đớn.

Đây là một phần của nhật ký từ Jenkinsm vì bạn có thể thấy một trong các thử nghiệm đơn vị không thành công nhưng jenkins vẫn kết thúc với thành công.

314 tests, 1781 assertions, 1 failures, 0 errors, 0 skips 
rake aborted! 
Command failed with status (1): [/var/lib/jenkins/.rvm/rubies/ruby-1.9.3-p1...] 

Tasks: TOP => test:units 
(See full trace by running task with --trace) 
Lot of rspec tests here.... 
Finished in 3.84 seconds 
88 examples, 0 failures, 42 pending 
Pushing HEAD to branch master of origin repository 
Pushing HEAD to branch master at repo origin 
Finished: SUCCESS 

Trả lời

18

Jenkins thực hiện các lệnh bạn nhập vào hộp Xây dựng bước bằng cách viết chúng vào tệp tạm thời và sau đó chạy tập lệnh bằng cách sử dụng /bin/sh -xe.

Thông thường điều này tạo ra hiệu ứng mong muốn: Lệnh được thực thi theo thứ tự (và được in) và tập lệnh hủy ngay lập tức khi lệnh không thành công, tức là thoát với mã thoát khác 0.

Nếu điều này không xảy ra với bạn, lý do duy nhất có thể là bạn đã ghi đè hành vi này. Bạn có thể ghi đè lên bằng cách bắt đầu dòng đầu tiên của Bước xây dựng với hai ký tự sau: #!.

Ví dụ, nếu xây dựng Bước của bạn trông như thế này:

#!/bin/bash 
bundle install 
rake db:migrate:reset 
rake test:units 
rake spec:models 

Sau đó, nó có nghĩa là Jenkins sẽ viết kịch bản cho một tập tin tạm thời và nó sẽ được thực hiện với /bin/bash. Khi được gọi như vậy, bash sẽ thực hiện các lệnh một-by-một và không quan tâm nếu chúng thành công. Mã thoát của quá trình bash sẽ là mã thoát của lệnh cuối cùng trong tập lệnh và sẽ được Jenkins nhìn thấy khi tập lệnh kết thúc.

Vì vậy, hãy quan tâm đến những gì bạn đặt trên dòng đầu tiên của Bước tạo. Nếu bạn không biết shell hoạt động như thế nào, đừng đặt một hash-bang nào cả và cho phép Jenkins quyết định cách chạy script.

Nếu bạn cần kiểm soát nhiều hơn cách Bước xây dựng được thực hiện, bạn nên nghiên cứu trang người dùng của trình bao mà bạn sử dụng để tìm hiểu cách thực hiện theo cách bạn muốn. Jenkins không có nhiều vai trò ở đây. Nó chỉ thực thi vỏ mà bạn muốn theo cách bạn muốn.

+1

Bạn đã thực sự đúng, tôi đã có "#!/Bin/bash" là dòng đầu tiên :) –

+1

nếu bạn thêm '#!/Bin/bash -x', bạn có thể nhận được phần mà Jenkins hiển thị lệnh đó chạy trong đầu ra tập lệnh. Thực sự nó chỉ là '-e' mà bạn không muốn từ mặc định của Jenkins' -xe' – ZombieDev

5

Jenkins chỉ có thể xem mã kết quả của lệnh cuối cùng để không biết kết quả của rake test:units là gì.

Điều đơn giản nhất có thể là có mỗi lệnh của các lệnh đó dưới dạng bước xây dựng jenkins riêng biệt.

+0

Tôi không biết điều đó, nó hoạt động ngay bây giờ, thx! –

+0

Câu trả lời này đúng 100%, nhưng tôi không nghĩ rằng mọi người nên nghĩ mọi lệnh như là một bước xây dựng riêng biệt là cách thực hành tốt nhất trong Jenkins. Xem câu trả lời của tôi dưới đây. – sti

+0

Có một bước phụ cho mỗi phần có thể chia tách của công việc không phải là một ý tưởng tồi, miễn là rõ ràng là mỗi bước phụ chạy độc lập. Một tùy chọn khác là kiểm tra kết quả của từng bước phụ trong quá trình xây dựng và thoát với lỗi, nếu cần. – Gonen

5

Một giải pháp thay thế là thay đổi dòng đầu tiên của bạn như sau:

#!/bin/bash -e 

này cho kịch bản của bạn thất bại nếu bất kỳ của các lệnh trong kịch bản trả về một lỗi.

Xem: Automatic exit from bash shell script on error

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