直接在jenkins管道中执行powershell命令

时间:2017-02-24 10:31:59

标签: powershell jenkins jenkins-plugins jenkins-pipeline

是否可以直接在管道groovy脚本中调用PowerShell命令?在Jenkins中使用自定义作业时,我可以使用PowerShell插件调用该命令。但是在groovy脚本中没有使用它的代码片段。

我也尝试了sh()但似乎这个命令不允许在命令中包含多行和注释。

4 个答案:

答案 0 :(得分:22)

从Groovy-Script调用PowerShell脚本:

  • 您必须使用bat命令。
  • 之后,您必须确保正确返回错误代码(errorlevel)变量(EXIT 1应该导致FAILED作业。
  • 最后,为了与PowerShell-Plugin兼容,您必须确保考虑$LastExitCode
  • 我注意到'powershell'现已上线,但由于它有几个问题,我更喜欢这个变种。还在等待它稳定下来。

对于那个porpuse,我写了一个groovy方法,可以集成在任何管道脚本中:

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:适用于Server 2016和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插件更好。
  • 使用.推迟您的脚本,以确保当脚本返回错误代码(应该首选)时您的步骤失败,如果您不关心它,请使用&

答案 1 :(得分:12)

powershell上宣布的USER node 步骤现在支持调用PowerShell脚本。

Jenkins blog提到它支持多行脚本。

答案 2 :(得分:0)

从2.28版的管道节点和流程插件开始,我们可以直接使用'powershell'。

Eg: powershell(". '.Test.ps1'") 

答案 3 :(得分:-4)

您可以使用sh命令,如下所示:

sh """
    echo 'foo'
    # bar
    echo 'hello'
"""

这里支持评论。