Teamcity ejecuta pasos de compilación incluso cuando las pruebas fallan


Estoy teniendo problemas con Teamcity, donde se procede a ejecutar pasos de compilación incluso si los anteriores no tuvieron éxito.

El paso final de mi configuración de Compilación despliega mi sitio, lo cual no quiero que haga si alguna de mis pruebas falla.

Cada paso de compilación está configurado para ejecutarse solo si todos los pasos anteriores tuvieron éxito.

En la pestaña Build Failure Conditions, he comprobado las siguientes opciones en Fail build if:

-build process exit code is not zero
-at least one test failed
-an out-of-memory or crash is detected (Java only)

Esto no funciona, incluso cuando TeamCity implementa mi sitio, ¿por qué?

Incluso traté de agregar una condición de error de compilación adicional que buscará texto específico en el registro de compilación (a saber, "Prueba de ejecución fallida.")

Al ver una prueba completada en la página de información general, puede ver el mensaje de error contra la última compilación:

"La Ejecución de Prueba Falló."el texto apareció en el registro de compilación

Pero todavía lo despliega de todos modos.

¿Alguien sabe cómo arreglar esto? Parece que el problema se ha estado ejecutando durante mucho tiempo, aquí.

Aparentemente hay una solución:

Hasta ahora no consideramos esta característica tan importante como lo es una solución obvia: el script puede verificar la condición necesaria y no produzca los artefactos configurados en TeamCity.

Por ejemplo, un script puede mover los artefactos de un directorio temporal a la directorio especificado en TeamCity como publish artifacts from just antes del final y en caso de que la construcción las operaciones tuvieron éxito.

Pero eso no me queda claro exactamente cómo hacerlo, y tampoco suena como la mejor solución. Cualquier ayuda apreciada.

Edit : También pude solucionar el problema con una dependencia de instantáneas, donde tendría una compilación 'deploy' separada que dependía de la compilación de prueba, y ahora no se ejecuta si las pruebas fallan.

Esto fue útil para configurar la dependencia.

Author: JumpingJezza, 2013-03-06

5 answers

Este es un problema conocido en TeamCity 7.1 (cf. http://youtrack.jetbrains.com/issue/TW-17002 ) que se ha corregido en TeamCity 8.x+ (ver esta respuesta).

TeamCity distingue entre una compilación fallida y una compilación fallida . Si bien una prueba unitaria fallida fallará la compilación en su conjunto, desafortunadamente TeamCity todavía considera que el paso de prueba en sí tuvo éxito porque no devolvió un código de error distinto de cero. Como resultado, posterior los pasos continuarán corriendo.

Se han propuesto una variedad de soluciones, pero he encontrado que requieren una configuración no trivial o un compromiso en la experiencia de prueba en TeamCity.

Sin embargo, después de revisar una sugerencia de @arex1337, encontramos una manera fácil de conseguir que TeamCity haga lo que queremos. Simplemente agregue un paso adicional de compilación de Powershell después del paso de prueba existente que contenga el siguiente script en línea (reemplazando YOUR_TEAMCITY_HOSTNAME con su TeamCity real host / dominio):

$request = [System.Net.WebRequest]::Create("http://YOUR_TEAMCITY_HOSTNAME/guestAuth/app/rest/builds/%teamcity.build.id%")
$xml = [xml](new-object System.IO.StreamReader $request.GetResponse().GetResponseStream()).ReadToEnd()
Microsoft.PowerShell.Utility\Select-Xml $xml -XPath "/build" | % { $status = $_.Node.status }

if ($status -eq "FAILURE") {
    throw "Failing this step because the build itself is considered failed. This is our way to workaround the fact that TeamCity incorrectly considers a test step to be successful even if there are test failures. See http://youtrack.jetbrains.com/issue/TW-17002"
}

Este script inline de PowerShell solo usa la API REST de TeamCity para preguntar si la compilación en sí, como un todo, se considera fallida (la variable %teamcity.build.id%" será reemplazada por TeamCity con el id de compilación real cuando se ejecute el paso). Si la compilación en su conjunto se considera fallida (por ejemplo, debido a un error de prueba), este script de PowerShell genera un error, lo que hace que el proceso devuelva un código de error distinto de cero que da lugar al paso de compilación individual en sí mismo para ser considerado infructuoso . En ese momento, se puede evitar que se ejecuten los pasos posteriores.

Tenga en cuenta que este script utiliza guestAuth, que requiere que la cuenta de invitado de TeamCity esté habilitada. Alternativamente, puede usar httpAuth en su lugar, pero necesitará actualizar el script para incluir un nombre de usuario y contraseña de TeamCity (por ejemplo, http://USERNAME:PASSWORD@YOUR_TEAMCITY_HOSTNAME/httpAuth/app/rest/builds/%teamcity.build.id%).

Por lo tanto, con este paso adicional en su lugar, todos los pasos posteriores configurados para ejecutarse "Solo si todos los pasos anteriores fueron exitosos" se omitirán si hay algún fallo de la prueba unitaria anterior. Estamos usando esto para evitar la implementación automatizada si alguna de nuestras pruebas de NUnit no tiene éxito hasta que JetBrains solucione el problema.

Gracias a @arex1337 por la idea.

 27
Author: adamjcooper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:55

Solo para evitar confusiones, este problema se ha solucionado en Team City v8.x, no necesitamos esas soluciones ahora.

Puede especificar la directiva de ejecución por pasos a través de la opción Ejecutar paso:

Solo si el estado de compilación es exitoso - antes de comenzar el paso, el agente de compilación solicita el estado de compilación del servidor y omite el paso si el estado falla.

Https://confluence.jetbrains.com/display/TCD8/Configuring + Build + Steps

Por supuesto que necesita fallar la compilación si al menos una prueba unitaria falló:

Https://confluence.jetbrains.com/display/TCD8/Build + Fallo + Condiciones

En la página Condiciones de error de compilación, el área de Error de compilación if, especifique cuándo TeamCity fallará en las compilaciones:

Al menos una prueba falló: Marque esta opción para marcar la compilación como fallida si la compilación falla al menos una prueba.

 23
Author: AHMED EL-HAROUNY,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-20 10:40:43

Este es (como ha encontrado) un problema conocido con TeamCity, hay un conjunto de problemas vinculados en su Rastreador de problemas. Se espera que este problema se resuelva en la próxima versión de TeamCity (versión 8.x)

Mientras tanto, la forma en que nos identificamos para resolver el problema (para la versión 6.5.5) fue descargar el archivo de resultados de la prueba como parte de los pasos posteriores. Esto se analizó para comprobar si había errores de prueba, devolviendo un código de error y, por lo tanto, rompiendo la compilación correctamente (realizar cualquier limpieza que necesitáramos como parte de ese fracaso) que probablemente funcionaría para usted.

 3
Author: Rawrgramming,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-07 13:46:11

El error de compilación de TeamCity no significa que detendrá la compilación y publicará los artefactos si su compilación proporciona los archivos de salida de compilación según lo requiera TeamCity. Solo actualizará el estado de compilación correctamente.

Pero, puede muy bien detener el proceso de compilación modificando su script de compilación para detener el error de compilación en el caso de prueba. Si está usando MSBuild, entonces ContinueOnError="false" lo hará.

 1
Author: RinoTom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-06 19:52:33

Al final, pude resolver el problema con una dependencia de instantáneas, donde tendría una compilación 'deploy' separada que dependía de la compilación de prueba, y ahora no se ejecuta si las pruebas fallan.

Esto fue útil para configurar la dependencia.

 0
Author: DevDave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-08 10:24:19