powershell error-handling teamcity

¿Cómo puedo obtener errores para propagar en el corredor de TeamCity PowerShell?



error-handling (9)

Estás pensando demasiado en cosas. Prueba esto:

  • Guión

    File

  • Archivo de comandos

    Script.ps1

    No es necesario que proporcione una ruta: de manera predeterminada, es relativa al directorio de finalización de compra.

  • Modo de ejecución de scripts

    Put script into PowerShell stdin with "-Command -" arguments

Esto es exactamente lo que uso para ejecutar un conjunto de scripts de PowerShell dentro de Teamcity.

Actualizar

Perdí el bit en la publicación original sobre fallas en el script de powershell. Disculpas!

He resuelto esa parte del rompecabezas de dos maneras diferentes.

Para scripts regulares de PowerShell

Ajustar el bloque de código principal en un try...catch ; si se produce una excepción, devuelve un valor entero distinto de cero. Para una ejecución exitosa, devuelve 0.

Esta convención de devolver cero para el éxito data de un largo camino en la historia: es utilizada por sistemas Unix / Linux, DOS, CP / M y más.

Para los scripts de construcción de PSake

Utilice una secuencia de comandos de PowerShell envoltorio para invocar psake y establecer directamente el resultado de la compilación de teamcity escribiendo un mensaje de respuesta a stdout.

Al comienzo de la secuencia de comandos, defina un mensaje de estado que representa la falla:

$global:buildResult = "#teamcity[buildStatus status=''FAILURE'' text=''It died.'']

Dentro del script psake, actualice $global:buildResult para indicar el éxito en una tarea dedicada que se ejecuta al final de todo.

$global:buildResult = "#teamcity[buildStatus status=''SUCCESS'' text=''It lives.'']

Al final de la secuencia de comandos contenedora, muestra el mensaje de estado

write-host $global:buildResult

Si algo en el script de construcción falla, esa última tarea no se ejecutará, y se emitirá el mensaje predeterminado (que indica falla).

De cualquier manera, Teamcity recogerá el mensaje y establecerá el estado de compilación de manera apropiada.

Tengo una configuración de compilación de TeamCity 7 que es más o menos una invocación de un script .ps1 usando varios parámetros de TeamCity.

Tenía la esperanza de que podría ser una simple cuestión de configuración:

  • Guión

    Archivo

  • Archivo de comandos

    % system.teamcity.build.workingDir% / Script.ps1

  • Modo de ejecución de scripts

    Ejecute la secuencia de comandos .ps1 con el argumento "-File"

  • Argumentos

    % system.teamcity.build.workingDir% -OptionB% BuildConfigArgument%% BuildConfigArg2%

Y entonces esperaría:

  • si desordeno mis argumentos y el script no se inicia, la compilación falla
  • si mi script Script.ps1 arroja, la construcción falla
  • Si el script exit con un nivel de error no 0 , quiero que Build for Fail (quizás esto no sea una gestión idiomática de errores PS; ¿debería un .ps1 solo informar el éxito por la ausencia de excepciones?)

La pregunta: simplemente no funciona. Como se supone que funciona? ¿Hay algo que estoy haciendo drásticamente mal que pueda solucionar eligiendo diferentes opciones?


Hay un error conocido en TeamCity que causa el comportamiento que notó el cartel original.

Sin embargo, es fácil evitarlo.

Al final de su secuencia de comandos de PowerShell, agregue un resultado que indique que se ha alcanzado el final del script:

Echo "Packaging complete (end of script reached)"

Luego, configure una nueva Condición de falla de compilación en su compilación para que falle si el texto que está repitiendo NO está presente en la salida.


Powershell v2 al menos tenía un problema con la opción -File que arruinaba los códigos de error. Hay algunos detalles sobre cómo se estropea y esas cosas.

La respuesta es cambiar a la opción -Command y / o envolverlo con un archivo bat que comprueba el código LastErrorCode y devuelve 1+ si se supone que falla.

http://zduck.com/2012/powershell-batch-files-exit-codes/


Usa algo como esto:

echo "##teamcity[buildStatus status=''FAILURE'' text=''Something went wrong while executing the script...'']";

Como referencia, eche un vistazo a Informes de estado de generación de Teamcity


Si las nuevas versiones de TeamCity están a su alcance, entonces vale la pena echarle un vistazo a algunas de las mejoras de compilación de PowerShell .

En particular, puede error interesante cambiar la Error Output de la warning predeterminada a error .


Solo alabe al legislador que no necesita trabajar con Jenkins. No puede usar el paso de PowerShell para problemas similares. En su lugar, necesitamos usar un paso "cmd" que invoque el siguiente contenedor mágico que no pasará al paso de los códigos de excepción y de salida:

%SystemRoot%/sysnative/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -WindowStyle Hidden -Command "& { $ErrorActionPreference = ''Stop''; & ''path/to/script.ps1 -arg1 -arg2; EXIT $LASTEXITCODE }"


Una alternativa a la respuesta aceptada que funciona para mí en TeamCity 9 (No me gusta cambiar la opción ''Construir condiciones de falla'' ya que afecta a todos los pasos de construcción): -

Quería que los errores de PowerShell fallaran en el paso de compilación, pero con un bonito mensaje. Así que quería lanzar un mensaje de error Y devolver un código de error .... try / catch / finally al rescate.

Mi guión de demostración:

Try { Write-Host "Demoing the finally bit" # Make sure if anything goes wrong in the script we get an exception $ErrorActionPreference = "Stop" # This will fail and throw an exception (unless you add the file) Get-Content IDontExist.txt } Catch { # Throwing like this gives a pretty error message in the build log throw $_ # These give less pretty/helpful error messages # Write-Host $_ # Write-Host $_.Exception.Message } Finally { # 69 because it''s more funny than 1 exit(69) }


Como se hizo en el manual amistoso de TeamCity :

Establecer error de salida a Error y agregar condición de falla de compilación

En caso de que haya errores de sintaxis y excepciones, PowerShell los escribe en stderr. Para que TeamCity falle la compilación, configure la opción Error Output en Error y agregue una condición de error de compilación que fallará en la compilación de cualquier salida de error.

Las claves para hacer que esto funcione es cambiar dos valores predeterminados:

  1. En el nivel superior de las Condiciones de falla de compilación, active el corrector de compilación para activar un mensaje de error:
  2. En el paso de compilación [PowerShell], mostrar opciones avanzadas y establecer salida de error : error

En 9.1 los siguientes trabajos (no me sorprendería si funciona también para versiones anteriores):

  1. crea un paso de compilación de PowerShell con las opciones predeterminadas
  2. cambie el menú desplegable para decir Script: código fuente
  3. Agregue una trap { Write-Error "Exception $_" ; exit 98 } trap { Write-Error "Exception $_" ; exit 98 } en la parte superior del script
  4. (OMI opcional pero más correcta para el tipo de scripts apropiado para los scripts de compilación de TeamCity)

    Mostrar opciones avanzadas y activar Opciones: agregar el argumento NoProfile

  5. (Opcional, pero para mí este debería ser el predeterminado ya que se representa más claramente como lo sugiere @Jamal Mavadat )

    Mostrar opciones avanzadas y activar Salida de error : Error

    (ASIDE @JetBrains: si la etiqueta fuera "Dar formato a la salida de stderr como" sería menos engañoso)

Esto cubre los siguientes casos:

  1. Errores de análisis [aparecen como excepciones y detienen la ejecución inmediatamente]
  2. Excepciones [ throw n directa o indirectamente en su código PS mostrar y desencadenar un código de salida para TC para detener la construcción]
  3. Una exit n explícita exit n en el script se propaga a la compilación (y falla si no es cero)

Esto ha sido reemplazado por las opciones ofrecidas por 9.x , pero lo dejo aquí ya que definitivamente fue a prueba de balas en ese momento y no pude encontrar ninguna otra solución que me gustara más.

Podrías hacer algo que funciona. Lo siguiente ha sido probado con

  • errores en el bit de script
  • archivos perdidos
  • script que sale con non- 0 ERRORLEVEL

En las opciones de corredor de TeamCity Powershell, configúrelo de la siguiente manera:

  • Archivo de comandos

    Código fuente

  • Fuente de script

    $ErrorActionPreference=''Stop'' powershell -NoProfile "Invoke-Command -ScriptBlock { `$errorActionPreference=''Stop''; %system.teamcity.build.workingDir%/Script.ps1 %system.teamcity.build.workingDir% --OptionB %BuildConfigArgument% %BuildConfigArg2%; exit `$LastExitCode }"

    (versión sin envolver: powershell -NoProfile "Invoke-Command -ScriptBlock { $errorActionPreference=''Stop''; %system.teamcity.build.workingDir%/Script.ps1 %system.teamcity.build.workingDir% --OptionB %BuildConfigArgument% %BuildConfigArg2%; exit $LastExitCode }"

  • Modo de ejecución de scripts

    Colocar script en PowerShell stdin con argumentos "-Command -"

  • Parámetros de línea de comando adicionales

    -NoProfile

¡Espero contra toda esperanza que esta no sea la mejor respuesta!