2017-02-24 142 views
7

是否有可能直接在管道groovy脚本中调用PowerShell命令?在Jenkins中使用自定义作业时,我可以使用PowerShell插件调用该命令。但是在groovy脚本中没有使用这个片段。直接在jenkins管道中执行powershell命令

我也试过sh(),但看起来这个命令不允许在命令里面有多行和注释。

回答

13

要从Groovy的脚本调用的PowerScript:

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

对于porpuse我写这可以在任何管道,脚本集成一个小常规方法:

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:与服务器2016的伟大工程Win10 [/编辑] [编辑]我已经添加了 '%' 面具[/编辑]

在您的管道脚本,那么你可以打电话给你的脚本是这样的:。

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

与方法的最好的事情是,你可以拨打CmdLet而不必为此在脚本,这是最好的实践。

呼叫PS1定义CmdLet中,然后调用CmdLet

PowerShell(". '.\\disk-usage.ps1'; du -Verbose") 
  • 不要忘记使用withEnv()的,那么你是不是与PowerShell的插件完全兼容更好。
  • .延迟您的脚本,以确保您的脚本在脚本返回错误代码(应该是首选)时失败,如果您不关心它,请使用&
-2

可以使用sh命令是这样的:

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

评论在这里的支持。

+0

在我的一个窗口节点上工作,但不在另一个窗口节点上。有什么你需要做的操作系统来启用它? –

+0

sh命令将启动一个bash会话,也可以使用不属于PowerShell环境的windows slave。 您可以尝试'sh',其中ps.exe''或'sh'在您的管道中回显$ SHELL''。 请参阅:[链接](https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#code-sh-code-shell-script) 请注意'ps.exe'必须安装在windows slave上。 – elou

6

调用PowerShell脚本现在支持powershell步骤,如Jenkins blog所公布的那样。

documentation提到它支持多行脚本。

+0

嗨,不知道如果我在这个问题上迟了一点,我注意到默认情况下powershell支持使用-NoProfile插件,你知道有没有办法解决这个问题?我似乎无法运行我的管道,因为我需要访问PowerShell配置文件。 – jacmurphy50