web-dev-qa-db-fra.com

Jenkins Powershell plugin construit toujours avec succès

J'utilise le plugin Jenkins PowerShell pour construire un projet. 

Cependant, j’ai trouvé que Jenkins considère toujours que ma construction est réussie, peu importe ce que je tape dans la commande Windows PowerShell.

Voici un exemple:

 enter image description here

Comme vous pouvez le constater, asdf n'est pas une commande légale. Jenkins devrait me donner FAILURE après la construction.

Mais la sortie de la console me donne:

Started by user admin
Building in workspace C:\Users\Administrator\.jenkins\jobs\Test\workspace
[workspace] $ powershell.exe -NonInteractive -ExecutionPolicy ByPass "& 'C:\Users\ADMINI~1\AppData\Local\Temp\hudson2092642221832331776.ps1'"
The term 'asdf' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\Users\ADMINI~1\AppData\Local\Temp\hudson2092642221832331776.ps1:1 char:5
+ asdf <<<< 
    + CategoryInfo          : ObjectNotFound: (asdf:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Finished: SUCCESS

Je pense que le résultat d'exécution de PowerShell devrait dépendre de $lastexitcode.

Est-ce un bug du plugin PowerShell?

13
Brian

Selon la dernière version du plugin ( Version 1.3 du 18 sept. 2015 ), vous devez utiliser $ LastExitCode pour faire échouer une construction.

Version 1.3 (18 septembre 2015)

  • PowerShell s'exécute désormais en mode non interactif pour empêcher les invites interactives de suspendre la construction.
  • PowerShell s'exécute maintenant avec ExcecutionPolicy défini sur "Contournement" pour éviter les problèmes de stratégie d'exécution
  • Les scripts se terminent maintenant avec $ LastExitCode, ce qui force les codes de sortie non nuls à marquer une construction comme ayant échoué
  • Ajout de l'aide et de la liste des variables d'environnement disponibles (y compris les traductions anglaise et française)
4
rrirower

Pour moi, je voulais que le script s'arrête et échoue dans Jenkins dès qu'il rencontre une erreur. Ceci a été accompli en ajoutant ceci au début du script:

$ ErrorActionPreference = "Stop"

Ceci est discuté ici: Comment arrêter un script PowerShell à la première erreur?

9
Robert Patterson

À partir de la version 1.3, le plugin ne gérera pas les exceptions telles que celles des commandes manquantes. Vous pouvez le faire vous-même avec try/catch:

try
{
    asdf
}
catch
{
    write-Host "Caught an exception"
    exit 1
}

Voir MSDN pour plus d'informations.

9
Chris Nelson

Voici comment j'ai implémenté la solution RRIROWER. J'espère que ça aide. 

<yourscript>.ps1; exit $lastexitcode

Assurez-vous que vos scripts Powershell se terminent avec la valeur souhaitée.
Exécutez "exit <value>" à la dernière ligne.

0
algo mas

En fin de compte, J’ai eu recours à la configuration suivante à Jenkins car aucune des solutions ici ne fonctionnait pour moi. La réponse de Chris Nelson m'a mis sur la bonne voie. Nous appelons le chef-client à distance et nous avons donc dû faire un peu de magie pour que la session PS à distance parle au local, puis transmette le statut à Jenkins. 

  • $ res donne la sortie de chef-client. 
  • $ lastsuccess est vrai ou faux selon les règles d'engagement de PS. 

Bien sûr, vous devrez fournir vos propres variables d’environnement! :)

 Write-Host "Deploying $env:Computer with $env:Databag data bag... "
 $secstr = ConvertTo-SecureString $env:Password -AsPlainText -Force 
 $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $env:User, $secstr
 $s = New-PSSession -ComputerName $env:Computer  -Credential $cred
 $res = Invoke-Command -Session $s -ScriptBlock { try {chef-client} catch {exit 1}}
 $lastsuccess = Invoke-Command -Session $s -ScriptBlock {$?}
 Remove-PSSession $s
 write-Host " --- "
 write-Host $res
 write-Host " --- "
 if($lastsuccess)
 {
  write-Host "chef deployment completed"
  exit 0
 }
 write-Host "chef deployment had errors"
 exit 1
0
neoscribe