13

I am trying to make a certain result in a PowerShell script fail the build process, but its not working for me. I am using the new build actions from TFS 2015 and tried the following options:

I do get red text in the log window of the step as well as marked 'Issues' in the build overview, but the build result is still Green: 'Build succeeded'

I want to use the failure in the script to fail the build and thus send an email using an alert on failed builds.

Edit: including the PS script:

Param(
  [string]$url
)

if ($url -eq '')
{
    #use default value
    $url = 'https://myurl.com'
}

$req = [system.Net.WebRequest]::Create($url)
$req.Timeout = 60000 * 5 # = 5 minutes
try
{
    Write-Host "Try to get response from url:" $url
    $res = $req.GetResponse()
    Write-Host "Closing the connection"
    $req.Close() # close the connection
} 
catch [System.Net.WebException] 
{
    Write-Host "Got an exception"    
    Write-Host "##vso[task.logissue type=error;]Exception: " $_.Exception

    if ($_.response) # try to close the connection
    {
        $_.response.Close();    
    }
    $res = $_.Exception.Response
}
$printCode=[int]$res.StatusCode

Write-Host "Result StatusCode:" $res.StatusCode "(" $printCode ")"
If ([int]$res.StatusCode -eq 200)
{
    Write-Host "##vso[task.complete result=Succeeded;]Done"
}
Else
{
    Write-Host "##vso[task.logissue type=error;]Test error: " $res
    Write-Host "##vso[task.complete result=Failed;]Error testing if demo site is up"
    exit 1
}
mhu
  • 17,720
  • 10
  • 62
  • 93
Rob Bos
  • 1,320
  • 1
  • 10
  • 25

1 Answers1

21

I've created a very simple script:

 Write-Error ("Some error")
 exit 1

Save this as a PowerShell script. Create a new Empty Build definition and only add one PowerShell task that points to your script. When I do this I get a failed build with the following error:

2015-12-30T10:27:29.4872452Z . 'C:\a\1\s\script.ps1' 
2015-12-30T10:27:29.6780242Z Executing the following powershell script. (workingFolder = C:\a\1\s)
2015-12-30T10:27:29.6790500Z C:\a\1\s\script.ps1 
2015-12-30T10:27:33.8017820Z ##[error]C:\a\1\s\script.ps1 : Some error
2015-12-30T10:27:33.8027833Z ##[error]At line:1 char:1
2015-12-30T10:27:33.8037819Z ##[error]+ . 'C:\a\1\s\script.ps1'
2015-12-30T10:27:33.8037819Z ##[error]+ ~~~~~~~~~~~~~~~~~~~~~~~
2015-12-30T10:27:33.8047816Z ##[error]    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
2015-12-30T10:27:33.8047816Z ##[error]    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,script.ps1
2015-12-30T10:27:33.8057887Z ##[error] 
2015-12-30T10:27:33.8057887Z ##[error]Process completed with exit code 1 and had 1 error(s) written to the error stream.

The main difference with your script is the usage of Write-Error in combination with an exit 1.

Wouter de Kort
  • 39,090
  • 12
  • 84
  • 103
  • Thanks Wouter, that was the simple solution I missed. After some testing I've found that you can use exit 1 **or** Write-Error to fail the task. – Rob Bos Dec 30 '15 at 12:07
  • This is *NOT* a great solution as it forces information into the log (Which may be difficult for a person to understand. The failing of a task should be independent of any requirement related to log content! – David V. Corbin Dec 29 '17 at 12:50
  • 2
    @DavidV.Corbin Rob asked to fail the build from a PowerShell script. The only reason to fail this is by returning an exit code from the script and pushing this to the log. Or don't you wan't your error to be logged? – Wouter de Kort Jan 01 '18 at 15:35