Rod Kimble
Rod Kimble

Reputation: 1364

Executing powershell command directly in jenkins pipeline

Is it possible to call a PowerShell command directly in the pipelines groovy script? While using custom jobs in Jenkins I am able to call the command with the PowerShell Plugin. But there is no snippet to use this in the groovy script.

I also tried sh() but it seems that this command does not allow multiple lines and comments inside the command.

Upvotes: 26

Views: 90326

Answers (4)

elou
elou

Reputation: 1282

To call a PowerShell script from the Groovy-Script:

  • you have to use the bat command.
  • After that, you have to be sure that the Error Code (errorlevel) variable will be correctly returned (EXIT 1 should resulting in a FAILED job).
  • Last, to be compatible with the PowerShell-Plugin, you have to be sure that $LastExitCode will be considered.
  • I have notice that the 'powershell' is now available in pipeline, but since it have several issues I prefer this variant. Still waiting it works stabil. I actually have an issue with the 'dontKillMe' behavior.

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. Note that you must predent \$ErrorActionPreference='Stop'; to your Script if you want it to abort on Write-Error because of an Issue with the powershell plugin.

For that porpuse I have written a little groovy method which could be integrate in any pipeline-script:

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\""
}

[EDIT] I have added the UTF8 OutputEncoding: works great with Server 2016 and Win10.[/EDIT] [EDIT] I have added the '%' mask[/EDIT]

In your Pipeline-Script you could then call your Script like this:

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

The best thing with that method, is that you may call CmdLet without having to do this in the Script, which is best-praxis.

Call ps1 to define CmdLet, an then call the CmdLet

PowerShell(". '.\\disk-usage.ps1'; du -Verbose")
  • Do not forget to use withEnv() an then you are better than fully compatible with the Powershell plugin.
  • postpone your Script with . to be sure your step failed when the script return an error code (should be preferred), use & if you don't care about it.

Upvotes: 35

Chinthaka
Chinthaka

Reputation: 988

From version 2.28 of Pipeline Nodes and Processes Plugin, we can directly use 'powershell'.

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

Upvotes: 2

Ludovic Ronsin
Ludovic Ronsin

Reputation: 812

Calling PowerShell scripts is now supported with powershell step as announced on Jenkins blog.

The documentation mentions it supports multiple lines scripts.

Upvotes: 29

Christopher
Christopher

Reputation: 1193

You can use the sh command like this:

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

Comments are supported in here.

Upvotes: -9

Related Questions