Teamcity exécute des étapes de construction même en cas d'échec des tests

j'ai des problèmes avec Teamcity , où il est en train d'exécuter des étapes de construction même si les précédentes ont échoué.

la dernière étape de ma configuration de construction déploie mon site, ce que je ne veux pas qu'il fasse si l'un de mes tests échoue.

chaque étape de construction est définie pour exécuter seulement si toutes les étapes précédentes ont été réussies.

dans L'onglet conditions de défaillance de la construction, j'ai vérifié les options suivantes sous Fail construire si:

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

cela ne fonctionne pas - même lorsque les tests échouent TeamCity déploie mon site, pourquoi?

j'ai même essayé d'ajouter une condition de défaillance de construction supplémentaire qui va chercher un texte spécifique dans le journal de construction (à savoir" essai échoué.")

lors de l'affichage d'un test terminé dans la page d'aperçu, vous pouvez voir le message d'erreur par rapport à la dernière version:

" Échec De L'Essai."texte paru dans le journal de l'

mais il le déploie quand même.

est-ce que quelqu'un sait comment réparer ça? Il semble que la question soit en cours depuis longtemps, ici .

apparemment, il y a une solution:

jusqu'à présent, nous ne considérons pas cette caractéristique aussi important qu'il y a une solution évidente: le script peut vérifier la condition nécessaire et ne produisez pas les artefacts comme configuré dans TeamCity.

par exemple, un script peut déplacer les artefacts d'un répertoire temporaire vers le répertoire spécifié dans le TeamCity comme publier des artéfacts de just avant l'arrivée et au cas où les opérations de construction ont été réussies.

Mais ce n'est pas clair pour moi sur exactement comment le faire, et ne sonne pas comme la meilleure solution. Toute aide appréciée.

Modifier : Je j'ai aussi été capable de contourner le problème avec une dépendance de snapshot, où j'aurais une construction "deploy" séparée qui dépendait de la construction du test, et maintenant elle ne fonctionne pas si les tests échouent.

ce était utile pour définir la dépendance.

25
demandé sur JumpingJezza 2013-03-06 21:57:32

5 réponses

il s'agit d'un problème connu sous le nom de TeamCity 7.1 (cf. http://youtrack.jetbrains.com/issue/TW-17002 ) qui a été fixé dans TeamCity 8.x+ (voir cette réponse ).

TeamCity distingue entre un échec build et un échec build step . Alors qu'un test unité défaillant échouera la construction dans son ensemble, malheureusement TeamCity considère toujours l'étape de test elle-même réussi parce qu'il n'a pas retourné un code d'erreur non-zéro . Par conséquent, les étapes suivantes se poursuivront.

une variété de solutions de rechange ont été proposées, mais j'ai trouvé qu'elles nécessitent soit une configuration non triviale ou un compromis sur l'expérience de test dans TeamCity.

cependant, après avoir examiné une suggestion de de @arex1337 , nous avons trouvé un moyen facile d'obtenir TeamCity pour faire ce que nous voulons. Il suffit d'ajouter le étape de construction Powershell supplémentaire après votre étape de test existante qui contient le script en ligne suivant (remplaçant YOUR_TEAMCITY_HOSTNAME par votre hôte/domaine TeamCity réel):

$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"
}

ce script PowerShell en ligne utilise simplement L'API TeamCity REST pour demander si la construction elle-même, dans son ensemble, est considérée comme ayant échoué (la variable %teamcity.build.id%" sera remplacée par TeamCity avec l'identifiant de construction réel lorsque l'étape est exécutée). Si la construction dans son ensemble est considérée échoué (disons, en raison d'une défaillance de test), puis ce script PowerShell envoie une erreur, provoquant le processus de retourner un code d'erreur non-zéro qui se traduit par l'étape de construction individuelle elle-même à être considérée comme infructueuse . À ce moment, les étapes suivantes peuvent être empêchées de s'exécuter.

notez que ce script utilise guestAuth, ce qui nécessite l'activation du compte client TeamCity. Alternativement, vous pouvez utiliser httpAuth à la place, mais vous aurez besoin de mettre à jour le script doit inclure un nom d'utilisateur et un mot de passe TeamCity (par exemple http://USERNAME:PASSWORD@YOUR_TEAMCITY_HOSTNAME/httpAuth/app/rest/builds/%teamcity.build.id% ).

donc, avec cette étape supplémentaire en place, toutes les étapes subséquentes définies pour exécuter" seulement si toutes les étapes précédentes ont été réussies " seront sautées s'il y a des échecs antérieurs de l'essai de l'unité. Nous l'utilisons pour empêcher le déploiement automatisé si L'un de nos tests NUnit ne réussit pas jusqu'à ce que JetBrains règle le problème.

merci à @arex1337 pour l'idée.

27
répondu adamjcooper 2017-05-23 11:54:55

juste pour éviter la confusion, ce problème est corrigé dans Team City v8.x, on n'a pas besoin de ces solutions maintenant.

vous pouvez spécifier la Politique d'exécution par étapes via L'option Execute step:

seulement si l'état de construction est réussi - avant de commencer l'étape, l'agent de construction demande l'état de construction du serveur, et saute l'étape si l'état est échoué.

https://confluence.jetbrains.com/display/TCD8/Configuring+Construire+Étapes

bien sûr, vous devez échouer la construction si au moins un test de l'unité a échoué:

https://confluence.jetbrains.com/display/TCD8/Build+défaillance+Conditions

sur la page Build Failure Conditions, la zone Fail build if, spécifie quand TeamCity va fail builds:

au moins un essai échec : Cochez cette option pour marquer la compilation comme ayant échoué si la compilation échoue au moins un test.

23
répondu AHMED EL-HAROUNY 2014-10-20 10:40:43

il s'agit (comme vous l'avez constaté) d'un problème connu avec TeamCity, il y a un ensemble de problèmes liés dans leur suivi des problèmes. Ce problème devrait être résolu dans la prochaine version de TeamCity (version 8).x)

entre-temps, la façon dont nous avons résolu le problème (pour la version 6.5.5) était de télécharger le fichier des résultats d'essai dans le cadre des étapes suivantes. Ce test a ensuite été analysé pour vérifier s'il y avait eu des échecs, en retournant une erreur. code et donc casser la construction correctement (effectuer tout nettoyage dont nous avions besoin dans le cadre de cette défaillance) qui fonctionnerait probablement pour vous.

3
répondu Rawrgramming 2013-03-07 13:46:11

TeamCity build failure ne signifie pas qu'il arrêtera la construction et il publiera les artéfacts si votre construction fournit les fichiers de sortie de construction comme requis par TeamCity. Il ne mettra à jour l'état de construction que correctement.

mais, vous pouvez très bien arrêter le processus de construction en modifiant votre script de construction pour arrêter l'échec de la construction sur le cas de test. Si vous utilisez MSBuild ,alors ContinueOnError="false" le fera.

1
répondu RinoTom 2013-03-06 19:52:33

à la fin, j'ai pu résoudre le problème avec une dépendance de snapshot, où j'aurais une construction 'deploy' séparée qui dépendait de la construction du test, et maintenant il ne fonctionne pas si les tests échouent.

ce était utile pour définir la dépendance.

0
répondu DevDave 2013-03-08 10:24:19