2011-09-08 8 views
7

Tôi đã thêm một bước xây dựng để thực thi một tập lệnh Python.
Trong pylint tập lệnh này được gọi với lint.Run (.. args) để kiểm tra mã.
Các kịch bản làm việc nhưng cuối cùng, xây dựng thất bại với thông báo lỗi chỉ:Jenkins với pylint cho lỗi xây dựng

Build step 'Execute Python script' marked build as failure

người có một ý tưởng tại sao điều này xảy ra?

Trả lời

1

dường như pylint thực xuất cảnh của bạn với một tổ chức phi zero trạng thái (thiếu kịch bản, lựa chọn xấu ...), có thể bạn thoát khỏi kịch bản với một ngoại lệ huy động hoặc một sys.exit(something_else_than_zero)

+0

Chết tiệt thẳng. Tôi đã sửa lỗi lint.py và phát hiện ra một cuộc gọi sys.exit (self.linter.msgstatus) trong đó không thể tìm thấy msgstatus trong ngữ cảnh. Thay thế điều này bằng 0 đã làm việc và bây giờ các bản dựng đang được tăng cường. – Gobliins

11

pylint có hành vi khó chịu đến trả lại mã thoát khác 0 ngay cả khi tìm thấy một vấn đề cảnh báo nhỏ. Chỉ khi mọi thứ đều ổn, 0 được trả về (xem trang người đàn ông).

Như thường là một mã khác không biểu thị lỗi, Jenkins không thành công.

Tôi thấy hai cách để khắc phục điều này:

  • Sử dụng một kịch bản nhỏ xung quanh pylint luôn trả về 0. Sau đó, Jenkins sẽ không thất bại vì pylint. Tôi sử dụng một kịch bản python nhỏ gọi pylint với os.system() và sys.exit (0) sau hơn. Bạn có thể thấy nó là ghi đè mã lỗi của pylint.
  • Pylint bản vá. Ví dụ, trên hệ thống Linux của tôi sys.exit() gọi là trong file /usr/lib/pymodules/python2.6/pylint/lint.py
+0

Vâng, ý tưởng rất hay. Tôi sẽ cố gắng làm điều đó. – Gobliins

+0

Làm việc như bạn mong đợi! – Gobliins

+0

Tôi đã chuyển đầu ra cho con mèo và nó xuất hiện để xây dựng thành công ngay bây giờ. ví dụ. 'pylint -f html code.py | cat> report.html' – zyxue

15

Bạn cũng có thể chỉ đơn giản là đặt một

pylint || thoát 0

trong cmdline vỏ. Plugin Pylint sẽ thất bại trong quá trình xây dựng bằng cách kiểm tra kết quả của pyllint.

3

rylint gần đây có tùy chọn cho không gọi cảnh sys

lint.Run (args, exit = False, ** kwargs)

0

Tôi đồng ý với @dmeister, nhưng với mã đường ống (Jenkinsfile) Tôi đề nghị một thử/nắm bắt và sau đó phân tích lỗi. Bằng cách này bạn có thể xác định nếu bạn chỉ nhận được bit trạng thái từ pylint (xem các tài liệu pylint), cho dù pylint báo cáo một lỗi sử dụng, hoặc cho dù đó là một thảm họa thất bại:

try {  
    sh 'pylint --output-format=parseable my_module' 
} catch (pylint_rc) { 
    // pylint_rc will be of the form 
    // "hudson.AbortException: script returned exit code NN" 
    // where NN is 1-63 and represents bit field; 
    // bits 0-4 indicate lint-ish issues in analyzed code, 
    // bit 5 indicates pylint usage error 
    echo "pylint_rc= \'$pylint_rc\'" 
    String rc = "$pylint_rc" 
    String code = rc.split()[5] 
    echo "Isolated return code string value $code" 
    int value = code.toInteger() 

    // catastrophic/crash error returns a 1; else there is a pylint return code 
    int error_bits_code = value & 0x20 
    int lint_bits_code = value & 0x1f 
    echo "pylint error_bits_code=$error_bits_code ; lint_bits_code=$lint_bits_code" 
    if ((value == 1) || (error_bits_code != 0)) { 
     currentBuild.result = "FAILURE" 
     throw pylint_rc 
    } 
} 

Apologies để Groovy chủ nghĩa thuần túy - groovy không phải của tôi, vì vậy tôi chắc chắn điều này có thể được cải thiện trên - cho tôi biết. Có một lỗ đã biết: nếu pylint phát hiện chỉ các lỗi kiểu "gây tử vong" (bit 0) và không có vấn đề nào khác (bit 1-4 không được thiết lập) thì mã này sẽ ném một ngoại lệ sai. Nhưng mã của tôi gắn cờ tấn các vấn đề, vì vậy đó không phải là vấn đề đối với tôi. Bản sửa lỗi (? Parse error msg?) Có thể không quan trọng đối với người có móc xiên.