web-dev-qa-db-ja.com

jenkinsパイプラインでpowershellコマンドを直接実行する

パイプラインgroovyスクリプトでPowerShellコマンドを直接呼び出すことは可能ですか? Jenkinsでカスタムジョブを使用しているときに、PowerShellプラグインを使用してコマンドを呼び出すことができます。しかし、groovyスクリプトでこれを使用するスニペットはありません。

sh()も試しましたが、このコマンドはコマンド内で複数の行とコメントを許可しないようです。

12
Rod Kimble

Groovy-ScriptからPowerShellスクリプトを呼び出すには:

  • batコマンドを使用する必要があります。
  • その後、エラーコード(errorlevel)変数が正しく返されることを確認する必要があります(EXIT 1FAILEDジョブになります)。
  • 最後に、PowerShell-Pluginと互換性を持たせるには、$LastExitCodeが考慮されることを確認する必要があります。
  • 「powershell」がパイプラインで利用できるようになったことに気づきましたが、いくつかの問題があるため、このバリアントを好みます。まだそれが安定するのを待っています。実際、「dontKillMe」の動作に問題があります。

そのネズミのために、私はパイプラインスクリプトに統合できる少しグルーヴィーなメソッドを書きました。

def PowerShell(psCmd) {
    psCmd=psCmd.replaceAll("%", "%%")
    bat "powershell.exe -NonInteractive -ExecutionPolicy Bypass -Command \"\$ErrorActionPreference='Stop';[Console]::OutputEncoding=[System.Text.Encoding]::UTF8;$psCmd;EXIT \$global:LastExitCode\""
}

[編集] UTF8 OutputEncodingを追加しました。Server2016およびWin10で問題なく動作します。[/ EDIT][編集] '%'マスクを追加しました[/編集]

Pipeline-Scriptで、次のようにスクリプトを呼び出すことができます。

stage ('Call Powershell Script')
{
    node ('MyWindowsSlave') {
        PowerShell(". '.\\disk-usage.ps1'") 
    }
}

この方法の最も良い点は、スクリプトでこれを行わなくてもCmdLetを呼び出すことができるということです。これは最良の実践です。

Ps1を呼び出してCmdLetを定義し、次にCmdLetを呼び出します

PowerShell(". '.\\disk-usage.ps1'; du -Verbose")
  • withEnv() を使用することを忘れないでください。そうすれば、Powershellプラグインと完全に互換性があるよりも優れています。
  • .を使用してスクリプトを延期し、スクリプトがエラーコードを返すときにステップが失敗することを確認します(推奨)、気にしない場合は&を使用します。
22
elou

Jenkins blog で発表されたpowershellステップでPowerShellスクリプトの呼び出しがサポートされるようになりました。

documentation は、複数行のスクリプトをサポートすることを示しています。

13
Ludovic Ronsin