web-dev-qa-db-fra.com

Exécution de la commande PowerShell directement dans le pipeline Jenkins

Est-il possible d'appeler une commande PowerShell directement dans le script groovy des pipelines? Lors de l'utilisation de travaux personnalisés dans Jenkins, je suis en mesure d'appeler la commande avec le plugin PowerShell. Mais il n'y a pas d'extrait pour l'utiliser dans le script groovy.

J'ai également essayé sh() mais il semble que cette commande n'autorise pas plusieurs lignes et commentaires à l'intérieur de la commande.

12
Rod Kimble

Pour appeler un script PowerShell à partir du Groovy-Script:

  • vous devez utiliser la commande bat.
  • Après cela, vous devez vous assurer que la variable Code d'erreur (errorlevel) sera correctement renvoyée (EXIT 1 devrait entraîner un travail FAILED).
  • Enfin, pour être compatible avec le plugin PowerShell, vous devez être sûr que $LastExitCode seront considérées.
  • J'ai remarqué que le "powershell" est maintenant disponible en pipeline, mais comme il a plusieurs problèmes, je préfère cette variante. Toujours en attente, cela fonctionne stable. J'ai en fait un problème avec le comportement "dontKillMe".

Pour ce porpuse, j'ai écrit une petite méthode groovy qui pourrait être intégrée dans n'importe quel script de pipeline:

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] J'ai ajouté l'UTF8 OutputEncoding: fonctionne très bien avec Server 2016 et Win10. [/ EDIT] [ EDIT] J'ai ajouté le masque '%' [/ EDIT]

Dans votre Pipeline-Script, vous pouvez alors appeler votre script comme ceci:

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

La meilleure chose avec cette méthode, c'est que vous pouvez appeler CmdLet sans avoir à le faire dans le script, qui est la meilleure pratique.

Appelez ps1 pour définir CmdLet, puis appelez CmdLet

PowerShell(". '.\\disk-usage.ps1'; du -Verbose")
  • N'oubliez pas d'utiliser withEnv () an alors vous êtes mieux que totalement compatible avec le plugin Powershell.
  • reporter votre script avec . pour être sûr que votre étape a échoué lorsque le script renvoie un code d'erreur (devrait être préféré), utilisez & si vous ne vous en souciez pas.
22
elou

L'appel de scripts PowerShell est désormais pris en charge avec l'étape powershell comme annoncé sur blog Jenkins .

Le documentation mentionne qu'il prend en charge plusieurs scripts de lignes.

13
Ludovic Ronsin