2015-09-01 2 views
4

Mon script powershell s'exécute sans erreur signalée dans le fichier journal, mais l'étape de génération TFS 2015 signale une erreur. Dois-je effectuer un rappel spécial?L'étape Powershell de TFS 2015 Build signale l'échec mais n'a pas d'erreur

Il s'agit d'une nouvelle génération de style, pas basée sur XAML.

Le script n'a rien de spécial, il appelle robocopy, ce qui se passe avec succès.

est ici le script:

[CmdletBinding()] 
param (
    [string]$localWorkspace, 
    [string]$destination 
) 
begin{} 
process 
{ 
    try 
    { 
    ## Script 
    $ServiceDirs = Get-ChildItem $localWorkspace -Recurse | ?{ $_.PSIsContainer -eq $True -and $_.Name -match "^Service$" } | % { $_.FullName } 

    $serviceCollection = @{} 
    foreach ($Service in $ServiceDirs) 
    { 
     $ServiceName = Get-ChildItem $Service | ?{$_.Name -match ".*\.csproj$" } | % { $_.BaseName } 

     $binpath = ($service + "\bin\release") 
     $serviceCollection.Add($serviceName , $binpath) 
    } 

    $serviceCollection.GetEnumerator() | % { 
     Write-Verbose "Processing service: $($_.key)" 

     $currentDestination = ($destination + "\" + $_.key) 
     $output = robocopy $_.value $currentDestination /MIR /NFL /NDL /NJH /NJS /nc /ns /np 
    } 
    } 
    catch 
    { 
    write-host "Caught an exception:" 
    write-host "Exception Type: $($_.Exception.GetType().FullName)" 
    write-host "Exception Message: $($_.Exception.Message)" 
    } 
} 
end{} 

Je peux voir tous les résultats robocopy, si j'Unsilence et utilisation/DEBUG et aucun des prises dans le journal TFS construire.

Etrangement, quand je force une erreur, le catch s'exécute et l'étape rapporte le succès.

Le message d'erreur est signalée:

Tâche PowerShell a échoué. Cela a causé l'échec du travail. Regardez les journaux pour la tâche pour plus de détails.

+0

Avez-vous essayé d'activer le débogage? Ajoutez une variable "system.debug" à true ... –

Répondre

6

TL; DR Vérifiez les codes de sortie utilisés dans les appels, ou utilisez exit de quitter le script .


RoboCopy utilise une série de codes de sortie, y compris:

0 × 00 0 Pas d'erreur a eu lieu, et aucune copie a été fait. Les arborescences de répertoires source et destination sont complètement synchronisées.

0 × 01 1 Un ou plusieurs fichiers ont été copiés avec succès (c'est-à-dire que de nouveaux fichiers sont arrivés).

(Full List Here)

Parce que le script n'a pas eu une déclaration exit la valeur de $LastExitCode était 1 ce qui est logique pour Robocopy mais provoque TFS croire le script à l'échec.

L'utilisation de exit a supprimé le code de sortie de Robocopy, de sorte que TFS croyait que le script avait fonctionné. Cependant, cela signifiait que toute information Robocopy était supprimée.

Modification de la ligne finale à exit ($LastExitCode -band 24) résolu le problème correctement, selon this article.