Wir haben eine ziemlich komplexe Visual Studio-Lösung (57 Projekte, 19 davon sind Websites, die nicht fast jedes Mal erstellen, wenn durch Push-Code ausgelöst wird, aber dann manuell auslösen wir den Build und Beim Versuch, es erneut zu versuchen, baut es sich gutVisual Studio Website Build schlägt auf CI-Server intermittierend fehl
Die Lösung enthält 57 Projekte, von denen 19 Website-Projekte sind (nicht Web-Anwendungsprojekte gibt es keine .csproj-Datei.) Der Rest sind Klassenbibliotheken und Hintergrundjobs Website-Projekte sind in virtuellen IIS-Verzeichnissen in einem großen multifunktionalen Content-Management-System strukturiert
Der Build-Server ist Hudson v1.395 Der Befehl zum Erstellen ist:
"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\devenv.com" "SolutionName.sln" /rebuild Debug
Wenn der Build fehlschlägt, tut es immer so auf dem exakt gleichen Website-Projekt, mit der exakt gleichen Nachricht:
------ Rebuild All started: Project: C:\...\WebsiteName\, Configuration: Debug Any CPU ------
Validating Web Site
: Build (web): The application domain in which the thread was running has been unloaded.
Validation Complete
A Google Search for this message ist derzeit weniger als hilfreich. This link kommt dem eigentlichen Problem am nächsten, hat aber keine Lösung. Offensichtlich ändern wir keine Lösungsdateien während des Builds, da sie auf dem Build-Server auftreten.
Wenn es fehlschlägt, auslösen wir die Build manuell, und wir bekommen, wie wir erwarten (sorry, unkenntlich gemacht):
------ Rebuild All started: Project: C:\...\News2\, Configuration: Debug Any CPU ------
Validating Web Site
Building directory '/WebsiteName/Dir1/Dir2/'.
Building directory '/WebsiteName/'.
Building directory '/WebsiteName/Dir3/'.
// 22 more but you get the point
// A few warnings caused by our own use of the ObsoleteAttribute, nothing to be concerned about
Validation Complete
Was könnte diese Anwendungsdomäne verursachen Nachricht entladen?
Einige andere Hinweise:
- Wir dachten, es Hudson aus dem Speicher ausgeführt werden könnten, weil wir Java tun beobachten es durchaus ein wenig undicht. Also haben wir jeden Morgen um 6 Uhr eine Aufgabe hinzugefügt, um den Hudson-Dienst neu zu starten. Selbst mit dieser und einer vernünftigen Menge an verfügbarem Speicher, die während des Builds verfügbar war, ist es immer noch fehlgeschlagen.
- Ein Push zu demselben Repository verursacht auch die Erstellung einer viel einfacheren Lösung (nur 22 Projekte, keine Website-Projekte) zur gleichen Zeit. Das gelingt immer. Außerdem ist es möglich, beide gleichzeitig zu starten, um gleichzeitig ausgeführt zu werden.
- Ich weiß, wir sollten Hudson upgraden, aber das ist immer eines dieser Backburner-Projekte, für die wir nie Zeit zu haben scheinen. In jedem Fall fühle ich ziemlich stark, dass dies ein Visual Studio/MSBuild-Problem ist, kein Hudson-Problem.
Edit 1: MSBuild
Das Problem mit MSBuild ist, dass es so viele kleine Macken sind, die von einem Build in Visual Studio unterscheiden. Es ist extrem frustrierend, wenn eine Lösung in Visual Studio auf einem Entwicklungscomputer kompiliert wird und dann auf dem Build-Server fehlschlägt. Sogar die Ausgabe von Msbuild ist drastisch anders (viel ausführlicher für eine Sache) von dem, was unsere Entwickler in ihrem Build-Ausgabefenster sehen. Gibt es zusätzliche Befehlszeilenflags, die die MSBuild-Ausgabe mehr in die Reihe bringen, die Sie im Visual Studio-Erstellungsfenster erhalten?
Es gibt andere Dinge, die auch peinlich sind. Wenn Sie einen Projektmappen-Projektmappen-Projektmappenordner haben, gibt MSBuild einen Fehler aus, aber Visual Studio erledigt das Problem. Das sind die Macken, die dich wirklich dazu bringen, dir die Haare auszuziehen.
Bezüglich MSBuild, siehe "Edit 1", die ich an meine Frage angehängt habe. Obwohl nicht meine Lieblingsoption, werde ich es versuchen. Ich werde auch/RunExit versuchen, obwohl wir nicht beobachten, dass Devenv-Instanzen auf dem Server bleiben. Auch eine Klarstellung - obwohl beide Lösungen aus dem gleichen Repository stammen, sind beide Lösungen vollständige Klone, so dass zwischen den beiden konkurrierenden devenv-Instanzen keine gemeinsame Nutzung stattfindet. –
in Bezug auf die Protokollierungsebenen auf MSBuild, können Sie es mit dem/Ausführlichkeitsflag ändern [MSDN-Link] (http://msdn.microsoft.com/en-us/library/ms164311.aspx) –
** Diese Option ist nicht verfügbar für Visual Studio 7.0-9.0 (2003-2008) und C++ - Projekte! ** (VS 10.0 konvertierte C++ - Projekte nach Msbuild, so dass es dort möglich ist). –