Jenkins powershell plugin always builds successfully

前端 未结 6 1652
攒了一身酷
攒了一身酷 2021-02-04 00:46

I\'m using Jenkins PowerShell plugin to build a project.

However, I found that Jenkins always considers my build successful no matter what I type inside Windows P

相关标签:
6条回答
  • 2021-02-04 01:26

    This is how I implemented RRIROWER's solution. Hope it helps.

    <yourscript>.ps1; exit $lastexitcode
    

    Make sure your powershell scripts does exit with the desired value.
    Run "exit <value>" as the last line.

    0 讨论(0)
  • 2021-02-04 01:32

    Per the latest version of the plugin (Version 1.3 Sept 18 2015), you must use $LastExitCode to fail a build.

    Version 1.3 (Sept 18 2015)

    • PowerShell now runs in Non-Interactive mode to prevent interactive prompts from hanging the build
    • PowerShell now runs with ExcecutionPolicy set to "Bypass" to avoid execution policy issues
    • Scripts now exit with $LastExitCode, causing non-zero exit codes to mark a build as failed
    • Added help and list of available environment variables (including English and French translations)
    0 讨论(0)
  • 2021-02-04 01:34

    I want to add here that I just ran into a quirk: you must have the powershell script end with exit and not return.

    My jenkins pipe looked like:

    script {
      result = powershell(returnStatus: true, script: '''...if(error condition) { return 1 }''')
    
      if(result) { error }
    }
    

    I was using if(error condition) { return 1 } and while the 1 was showing up as the return value in the jenkins console, it was not failing the build. When i used if(error condition) { exit 1 }, the build failed as expected.

    I think this is a helpful addition to this thread - the need to use exit and not return. But I don't understand this part: the pipe is checking for result to be non-zero. What is the difference between exit and return in a powershell directive that makes if(result) { error } not work as expected when using return?

    0 讨论(0)
  • 2021-02-04 01:38

    As of 1.3, the plugin will not handle exceptions such as those from missing commands. You can do this yourself with try/catch:

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

    See MSDN for more.

    0 讨论(0)
  • 2021-02-04 01:48

    Ultimately, I had to resort to the following configuration in Jenkins as none of the solutions here worked for me. Chris Nelson's answer got me on the right track. We're invoking chef-client remotely so we had to do a little magic to get the remote PS session to talk the local and then pass status on to Jenkins.

    • $res gives the output of chef-client.
    • $lastsuccess is true or false according to PS rules of engagment.

    Of course, you'll have to supply your own evironment variables! :)

     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 讨论(0)
  • 2021-02-04 01:51

    For me, I wanted the script to stop and fail in Jenkins soon as it hit an error. This was accomplished by adding this to the start of the script:

    $ErrorActionPreference = "Stop"

    This is discussed here: How to stop a PowerShell script on the first error?

    0 讨论(0)
提交回复
热议问题