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

标签 powershell jenkins jenkins-plugins jenkins-pipeline

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

我也尝试了sh(),但似乎此命令不允许命令内包含多行和注释。

最佳答案

要从Groovy脚本调用PowerShell脚本,请执行以下操作:

  • 您必须使用bat命令。
  • 之后,您必须确保将正确返回错误代码(errorlevel)变量(EXIT 1应导致FAILED作业)。
  • 最后,要与PowerShell-Plugin兼容,您必须确保将考虑$LastExitCode
  • 我注意到,“powershell”现在可以在管道中使用,但是由于存在多个问题,因此我更喜欢此变体。仍在等待它稳定。我实际上对“dontKillMe”行为有疑问。

  • Since Jenkins 2.207 with Powershell plugin 1.4, I have replace all my calls with the official powershell pipeline command. I do now recommend to use it.



    对于那个波峰,我写了一些时髦的方法,可以将其集成到任何管道脚本中:
    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一起使用效果很好。
    [编辑]我添加了'%'掩码[/编辑]

    然后,您可以在管道脚本中像这样调用脚本:
    stage ('Call Powershell Script')
    {
        node ('MyWindowsSlave') {
            PowerShell(". '.\\disk-usage.ps1'") 
        }
    }
    

    该方法的最好之处在于,您可以调用CmdLet,而不必在脚本中执行此操作(这是最佳实践)。

    调用ps1定义CmdLet,然后调用CmdLet
    PowerShell(". '.\\disk-usage.ps1'; du -Verbose")
    
  • 不要忘了使用withEnv(),那么比完全兼容Powershell插件要好。
  • 使用.延迟脚本,以确保当脚本返回错误代码时,您的步骤失败(应该首选),如果您不在乎,请使用&
  • 关于powershell - 直接在jenkins管道中执行powershell命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42436370/

    相关文章:

    powershell - 使用 powershell 进行 Azure 发布

    email - 如何获取当前 Jenkins 用户的电子邮件地址以在 groovy 脚本中使用

    php - 为什么 Jenkins "BUILD SUCCESSFUL",但 "Finished: FAILURE"?

    github - Jenkins ⇔ 多个存储库的 Github-Webhook 设置

    jenkins - Jenkins 中的配置文件管理插件

    powershell - Powershell错误陷阱

    linux - 是否可以避免在命令行中重复名称?

    git - 带有 Git 轮询的 Jenkins 管道无法运行

    git - 带有 https 的 Jenkins Git 插件

    vba - 远程过程调用失败,无法调用空值表达式上的方法 - 重新启动后有效