2010-11-18 10 views
4

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.

+0

Ihr CI-Server könnte Ihr VCS über Codeänderungen befragen. – jfs

+0

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

+0

@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

Antwort

2

Ja, Sie haben definitiv eine Race Condition. Ich nehme an, du könntest versuchen, clever zu werden, indem du das Änderungsprotokoll abfragst und alle darin aufgelisteten Dateien berührst - oder besser gesagt, wenn Subversion die Dateiänderungszeiten nicht beibehalten hat, solltest du lieber den Datumsstempel der Dateien als Datum haben aktualisiert lokalisiert.

Einer der Kludges, die ich gesehen habe, ist, nur inkrementelle Builds die meiste Zeit zu laufen, aber ein Bruchteil der Builds laufen sauber (vielleicht nächtlich). Sie werden vielleicht regelmäßig in diesen Wettlauf geraten, aber Sie werden regelmäßig ausbrechen. Abhängig davon, wie häufig dies auftritt, kann dieser Kludn gut genug sein.

+0

Ich dachte darüber nach, regelmäßig zu putzen, entschied mich aber dagegen, denn nachdem das Problem passiert ist und der Build durchbricht (so wie wir es herausgefunden haben), bricht es jeden Build danach. Und wenn es den Build nicht bricht, kannst du nicht darauf vertrauen, dass es deine Änderung mit einschließt, so dass der folgende Test nicht viel bis zum nächsten Clean bedeutet. – Halt

+1

"Wenn Subversion die Dateiänderungszeiten nicht beibehalten hat, muss der Datumsstempel der Dateien das Datum sein, an dem sie aktualisiert wurden" Dies ist das Standardverhalten von subversion, es sei denn, Sie haben die Option "use-commit-times" explizit festgelegt die Konfigurationsdatei (http://svnbook.red-bean.com/nightly/en/svn.advanced.confarea.html#svn.advanced.confarea.opts.config) – slowdog

Verwandte Themen