2015-12-18 17 views
9

Tôi đang sử dụng plugin Jenkins PowerShell để tạo dự án.Plugin Jenkins powershell luôn xây dựng thành công

Tuy nhiên, tôi thấy rằng Jenkins luôn xem xét xây dựng thành công của tôi bất kể tôi nhập gì bên trong lệnh Windows PowerShell.

Dưới đây là một ví dụ:

enter image description here

Như bạn thấy, asdf không phải là một lệnh hợp pháp. Jenkins nên cho tôi FAILURE sau khi xây dựng.

Nhưng giao diện điều khiển đầu ra mang lại cho tôi:

Started by user admin 
Building in workspace C:\Users\Administrator\.jenkins\jobs\Test\workspace 
[workspace] $ powershell.exe -NonInteractive -ExecutionPolicy ByPass "& 'C:\Users\ADMINI~1\AppData\Local\Temp\hudson2092642221832331776.ps1'" 
The term 'asdf' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. 
At C:\Users\ADMINI~1\AppData\Local\Temp\hudson2092642221832331776.ps1:1 char:5 
+ asdf <<<< 
    + CategoryInfo   : ObjectNotFound: (asdf:String) [], CommandNotFoundException 
    + FullyQualifiedErrorId : CommandNotFoundException 

Finished: SUCCESS 

Tôi nghĩ rằng việc thực hiện kết quả của PowerShell nên phụ thuộc vào $lastexitcode.

Đây có phải là lỗi của plugin PowerShell không?

+1

Trong tập lệnh PowerShell của bạn khi xảy ra lỗi, hãy sử dụng "exit x" trong đó x là số khác 0. Xem nếu Jenkins xem xét nó không thành công sau đó. – DanL

+0

Có, Jenkins coi 'thoát 1' là không thành công. – Brian

+1

Sau đó, thay đổi tập lệnh của bạn để thoát với mã lỗi khác 0 nếu xảy ra lỗi. Nếu bạn muốn nó chỉ phụ thuộc vào $ lastexitcode thì ở cuối kịch bản của bạn kiểm tra $ lastexitcode và sử dụng exit 1 nếu có. – DanL

Trả lời

1

Mỗi phiên bản mới nhất của plugin (Version 1.3 Sept 18 2015), bạn phải sử dụng $ LastExitCode để không xây dựng.

Phiên bản 1.3 (tháng chín 18 2015)

  • PowerShell bây giờ chạy trong chế độ không tương tác để ngăn chặn nhắc nhở tương tác từ treo xây dựng
  • PowerShell bây giờ chạy với ExcecutionPolicy thiết lập để "Bypass" để tránh chính sách thực thi vấn đề
  • Scripts tại lối ra với $ LastExitCode, khiến mã thoát khác không để đánh dấu một xây dựng như thất bại
  • Bổ sung trợ giúp và danh sách các biến môi trường có sẵn (bao gồm cả tiếng Anh và bản dịch tiếng Pháp)
+0

Câu trả lời này chỉ phản ánh các ghi chú phát hành từ plugin mà dường như không phản ánh chính xác hoạt động của plugin. Các ghi chú cho biết "các kịch bản hiện tại thoát với $ LastExitCode" mà tôi đọc là "Khi plugin sao chép các lệnh của bạn vào tệp' .ps1' để thực thi, nó thêm 'exit $ LastExitCode' vào cuối tập lệnh được tạo để Jenkins sẽ nắm bắt và phản ứng với thất bại. " Đây là chính xác những gì xảy ra để tự thêm dòng 'thoát' là không cần thiết. Tuy nhiên, không một lệnh không hợp lệ nào gây ra việc xây dựng thất bại, ngay cả với 'thoát' được tạo ra tại chỗ. –

+0

@ChrisNelson Từ liên kết bạn đã đăng .... _ "Để bẫy mã thoát này sử dụng biến $ LastExitCode PowerShell." _ Và, tuy nhiên, phản hồi của tôi đã được chấp nhận làm câu trả lời. Tôi không đồng ý với sự cần thiết phải thêm lệnh 'thoát'. – rrirower

+0

Tôi không đồng ý với việc cần thêm 'thoát' nữa. Plugin này thực hiện điều đó. OP tự hỏi làm thế nào để xử lý 'asdf' và tôi lưu ý rằng một lệnh mà không thể được tìm thấy không đặt' $ LastExitCode', nó ném một ngoại lệ. –

5

Tính đến 1.3, các plugin sẽ không xử lý trường hợp ngoại lệ như những người từ lệnh mất tích. Bạn có thể tự làm điều này với try/catch:

try 
{ 
    asdf 
} 
catch 
{ 
    write-host "Caught an exception" 
    exit 1 
} 

Xem MSDN để biết thêm.

5

Đối với tôi, tôi muốn tập lệnh dừng và thất bại trong Jenkins ngay sau khi nó gặp lỗi. Điều này đã được thực hiện bằng cách thêm này khi bắt đầu của kịch bản:

$ ErrorActionPreference = "Stop"

này được thảo luận ở đây: How to stop a PowerShell script on the first error?

+0

Đây là giải pháp duy nhất có hiệu quả đối với tôi. Tôi đang tiêm biến vào kịch bản và có mọi thứ hoạt động ngoại trừ lỗi. Điều này cuối cùng đánh dấu việc xây dựng là thất bại khi có lỗi trong tập lệnh PS. Cảm ơn bạn! – rspring1975

0

Đây là cách tôi thực hiện giải pháp RRIROWER của. Hy vọng nó giúp.

<yourscript>.ps1; exit $lastexitcode 

Đảm bảo tập lệnh PowerShell của bạn thoát với giá trị mong muốn.
Chạy "exit <value>" làm dòng cuối cùng.

0

Cuối cùng, Tôi phải sử dụng cấu hình sau đây trong Jenkins vì không có giải pháp nào ở đây phù hợp với tôi. Câu trả lời của Chris Nelson đã giúp tôi đi đúng hướng. Chúng tôi đang gọi đầu bếp-khách hàng từ xa vì vậy chúng tôi đã phải làm một chút phép thuật để có được phiên PS từ xa để nói chuyện địa phương và sau đó vượt qua trạng thái trên để Jenkins.

  • $ res cho đầu ra của đầu bếp-khách hàng.
  • $ lastsuccess là đúng hoặc sai theo quy tắc cam kết của PS.

Tất nhiên, bạn sẽ phải cung cấp các biến môi trường của riêng mình! :)

Write-host "Deploying $env:Computer with $env:Databag data bag... " 
$secstr = ConvertTo-SecureString $env:Password -AsPlainText -Force 
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $env:User, $secstr 
$s = New-PSSession -ComputerName $env:Computer -Credential $cred 
$res = Invoke-Command -Session $s -ScriptBlock { try {chef-client} catch {exit 1}} 
$lastsuccess = Invoke-Command -Session $s -ScriptBlock {$?} 
Remove-PSSession $s 
write-host " --- " 
write-host $res 
write-host " --- " 
if($lastsuccess) 
{ 
    write-host "chef deployment completed" 
    exit 0 
} 
write-host "chef deployment had errors" 
exit 1 
Các vấn đề liên quan