2015-12-18 7 views
9

私はJenkins PowerShellプラグインを使用してプロジェクトをビルドしています。Jenkins powershellプラグインは常に正常に構築されます

しかし、私はWindows PowerShellコマンドを入力しても、ジェンキンスは常に自分のビルドを成功と見なしていることがわかりました。

enter image description here

あなたが見ることができるように、asdfは法的なコマンドではありません。

は、ここでの例です。ジェンキンスは、ビルド後に私にFAILUREを与える必要があります。

しかし、コンソール出力は、私を与える:

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 

私はPowerShellのの実行結果が$lastexitcodeに依存すべきだと思います。

これはPowerShellプラグインのバグですか?

+1

エラーが発生した場合のpowershellスクリプトでは、 "exit x"を使用してください。ここで、xはゼロ以外の数字です。それが失敗したとジェンキンスが考えるかどうかを見てください。 – DanL

+0

はい、Jenkinsは 'exit 1'を失敗とみなします。 – Brian

+1

エラーが発生した場合は、スクリプトをゼロ以外のエラーコードで終了するように変更します。 $ lastexitcodeだけに依存したい場合は、スクリプトの最後に$ lastexitcodeをチェックし、該当する場合はexit 1を使用します。 – DanL

答えて

1

プラグインの最新バージョン(Version 1.3 Sept 18 2015)では、$ LastExitCodeを使用してビルドに失敗する必要があります。

バージョン1.3(2015年9月18日)

  • PowerShellは今PowerShellは今ExcecutionPolicyを避けるために、「バイパス」に設定して実行し、ビルド
  • をぶら下げから対話型のプロンプトを防ぐために、非対話型モードで実行されます
  • を追加しましたヘルプを失敗してビルドをマークするために、ゼロ以外の終了コードを引き起こして実行ポリシーの問題
  • スクリプト$ LastExitCodeで今終了し、 (英語とフランス語の翻訳を含む)利用可能な環境変数
  • 1.3のよう
+0

この回答は、プラグインの操作を正確に反映していないような、プラグインからのリリースノートをエコーし​​ます。メモは "スクリプトは今$ LastExitCodeで終了します"と私は "プラグインがあなたのコマンドを' .ps1'ファイルにコピーして実行すると 'exit $ LastExitCode'を生成されたスクリプトの最後に追加してJenkinsが失敗に捕らえて反応する」と述べた。これは正確には何も起こらないので、手動で 'exit'行を追加する必要はありません。しかし無効なコマンドでも、生成された 'exit'がその場にあってもビルドが失敗することはありません。 –

+0

@ChrisNelson投稿したリンクから.... _ "この終了コードをトラップするには、$ LastExitCode PowerShell変数を使用してください。" _そして、私の応答は答えとして受け入れられました。私は 'exit'コマンドを追加する必要性に同意しない。 – rrirower

+0

私は 'exit'を追加する必要性にも同意しません。プラグインはそれを行います。 OPは 'asdf'をどう扱うか疑問に思っていました。見つからないコマンドは' $ LastExitCode'を設定していないので、例外がスローされます。 –

5

のリストは、このプラグインは、行方不明のコマンドからのもののように例外を処理しません。あなたはtry/catchでこれを自分で行うことができます。

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

多くのためのMSDNを参照してください。

5

私にとっては、エラーが発生したときにすぐにジェンキンスでスクリプトが停止して失敗したかったのです。これは、スクリプトの先頭にこれを追加することによって達成された:

$ ErrorActionPreference =

これは、ここで議論される「停止」:How to stop a PowerShell script on the first error?

+0

これは私のために働いた唯一の解決策です。私はスクリプトに変数を注入していますが、エラーを除いてすべてが機能していました。これは最終的に、PSスクリプトにエラーがある場合にビルドを失敗としてマークします。ありがとうございました! – rspring1975

0

これは私がRRIROWERのソリューションを実装する方法です。それが役に立てば幸い。

<yourscript>.ps1; exit $lastexitcode 

あなたのPowerShellスクリプトが目的の値で終了することを確認してください。
最後の行として"exit <value>"を実行してください。

0

最終的にはJenkinsでは以下の設定に頼らざるを得ませんでした。クリス・ネルソンの答えが私を正しい軌道に乗せた。私たちはシェフクライアントを遠隔から呼び出すので、遠隔PSセッションで現地に話をしてからJenkinsにステータスを渡すには少しマジックをしなければなりませんでした。

  • $ resはchef-clientの出力を示します。
  • $ lastsuccessは、PSの参加規則に従って真または偽です。

もちろん、あなた自身の環境変数を指定する必要があります。 :)

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 
関連する問題