Wir verwenden TeamCity mit Subversion und MSBuild und wir haben ein Problem mit dem kontinuierlichen Build, der durch Subversion Commits ausgelöst wird.Ist inkrementelles Bauen in Kombination mit Continuous Integration möglich?
Der fortlaufende Build ist so eingerichtet, dass inkrementelle Builds durchgeführt werden (der nächtliche Build ist voll und sauber).
Das Problem tritt auf, wenn ein Entwickler die Datei zum zweiten Mal ändert und festlegt, nachdem der Build gestartet wurde (Festschreibung ausgelöst), aber bevor das Objekt erstellt wird, das die Datei verwendet. Jetzt erhält die Objektdatei einen Zeitstempel nach dem Zeitstempel des zweiten Commits. Dies führt dazu, dass alle späteren inkrementellen Builds die Änderungen an der Datei überspringen.
Für zusätzliche Klarheit hier ist die Zeitlinie:
T1: Hersteller verpflichtet file.cpp (file.cpp hat T1 Zeit)
T2: Erster inkrementellen beginnt auf dem Build-Server
T3: Build-Server ruft die Dateien für die letzte Änderung ab (file.cpp bei T1)
T4: Entwickler schreibt file.cpp zum zweiten Mal (Datei.cpp hat T4)
T5: Buildserver kompiliert file.cpp von T1 in file.obj (jetzt file.obj hat Zeit T5)
T6: Erste Build endet (Ergebnis ist gut)
T7: Zweite inkrementelle beginnt auf dem Build-Server
T8: Build-Server die Dateien für die letzte Änderung wird (file.cpp bei T4)
Und jetzt dem Problem:
T9: Build-Server kompiliert file.cpp (von T4) nicht in file.obj, da file.obj T5 ist, daher denkt der Compiler, dass er neuer ist als die Quelldatei.
Das Problem ist leicht mit einem vollständigen Build behoben, aber die dauern sehr lange (30 Minuten ohne Unit-Tests).
Ist inkrementelles Bauen in Kombination mit Continuous Integration möglich?
Edit: Dieses Problem scheint nur bei Verwendung des serverseitigen Checkout-Modus zu passieren. Mit Build-Agent-Seite Checkout-Modus erhalten geänderte Dateien den Zeitstempel des Zeitpunkts des Abrufs, während sie beim serverseitigen Checkout die Commit-Zeit als Zeitstempel erhalten.
Ihr CI-Server könnte Ihr VCS über Codeänderungen befragen. – jfs
Es tut es. Das Problem ist das Timing. Wenn eine Datei geändert wird, nachdem der CI-Server den prev. Version, aber bevor es tatsächlich im Build verwendet wird, scheint es ein Problem zu geben. – Halt
@Halt: Ich meine dein VCS kann sagen, welche Dateien wirklich geändert wurden, also kannst du sie berühren, damit dein Build-System korrekt funktioniert. Etwas wie 'svn diff -r PREV: HEAD --summize | awk '{print $ 2}' | xargs touch' – jfs