2010-10-27 9 views
5

Ich habe an dem nächsten Schritt meines fortlaufenden Integrationsprojekts gearbeitet, das lautet: TeamCity, um meine Anwendung zu erstellen, die Versionsnummer aller Assemblys automatisch zu ändern und dann ein Installationsprogramm zu erstellen .TeamCity + WiX + MSBuild Workflow-Vorschläge erforderlich

Ein wenig Hintergrund zuerst:

Ich habe erfolgreich in den letzten paar Monaten Teamcity läuft, und es baut meine Konfigurationen und läuft meine NUnit und NCover Tests gut.

Ich brauchte ein wenig Zeit für die Suche nach Installateuren - Ich habe InstallShield immer gehasst und nie für meine aktuelle Anwendung berücksichtigt. Ich mag NSIS, aber dann stieß ich zufällig auf WiX. Ich kenne keine MS-Installer-Architektur, die, wie ich finde, für komplizierte Projekte gefährlich ist. Irgendwann werde ich mehr darüber erfahren müssen. Nach ein paar Tagen des Durchwühlens von SO-Fragen, Googeln und Lesen von Blogs habe ich jedoch ein WiX-Projekt, das erfolgreich erstellt, installiert, die Anwendung ausgeführt und alles sauber deinstalliert wird. Groß!

Ich wollte auch die TeamCity Build-Konfiguration automatisch aktualisieren die Versionsnummer aller meiner Baugruppen. Ich war in der Lage, diese Funktionalität nachzubilden, indem ich die MSBuild Community Tasks auf meinem Entwicklungscomputer installierte und eine Bereitstellungskonfiguration erstellte, die ein BeforeBuild Ziel und die FileUpdate Aufgabe verwendet, um die Versionsnummer zu ändern. Das funktioniert einwandfrei, außer dass ich auf meiner Entwicklungsmaschine keine build_vcs_number_1 Umgebungsvariable ersetze.

Also das ist, wo ich jetzt bin - ich muss TeamCity das Update machen, und während es die Umgebungsvariable build_vcs_number_1 hat, kann ich nicht herausfinden, wie man die WiX MSBuild Community Tasks bekommen.

Ein Beitrag Ich lese empfohlene Einchecken der MSBuild Ziele in einen SVN-Ordner. Ich habe ein/extlib Ordner für Dinge wie diese, so dass meine Teamcity VCS Kasse Regeln wie folgt aussehen:

+:tags/2010-10-15=>src 
+:extlib=>extlib 

Wie komme ich aus einer Umgebungsvariablen extlib? Wenn ich den Build starte, klagt TeamCity (und richtigerweise), dass es c:\wix30\MSBuildCommunityTasks nicht finden kann. Der eigentliche Ordner ist C:\TeamCity\buildAgent\work\3e073d2b74226378\extlib\wix30\MSBuildCommunityTasks. Der Ordner wird automatisch erstellt, da ich eine serverseitige Überprüfung durchführe. Daher muss TeamCity eine Umgebungsvariable angeben, die ich verwenden kann, um den richtigen Pfad zu ermitteln.

Eine Sache, die ich beachten sollte, ist, dass ich in die Erstellungskonfiguration -> Eigenschaften und Umgebungsvariablen gegangen bin und die nicht intuitive Droplist mit allen vorhandenen Variablen gefunden habe, und nichts gesehen habe, das wie eine Variable klang, die auf die zeigt Arbeitsweg.

Eine mögliche Problemumgehung, die ich mir vorstellen kann, besteht darin, MSBuild Community Tasks nur auf dem Buildserver zu installieren, und dann kann ich eine Systemumgebungsvariable erstellen, auf die von <WixToolPath> zugegriffen werden kann.

Hat jemand andere Vorschläge?

+0

Ich frage mich nur, ob Sie immer noch so arbeiten. Ich habe etwas Ähnliches ungefähr zur selben Zeit gemacht, als diese Frage erstellt wurde, aber dann kamen Git und NuGet und ich bin langsam dazu übergegangen, NuGet als meine primäre Methode zur Verwaltung von Abhängigkeiten zu verwenden. TeamCity hat jetzt natürlich einen AssemblyInfo-Patcher und in der nächsten Version machen sie alles, was die MSBuild Community Tasks tun können. –

+0

Ich arbeite immer noch auf diese Weise und es ist derzeit immer noch eine gute Lösung für mich, aber wenn ich mehr Bandbreite bekomme, werde ich auf jeden Fall Änderungen prüfen. Ich wollte von den MSBuild-Community-Aufgaben weggehen, weil ich jede neue Assembly modifizieren muss und das ist unbequem. – Dave

Antwort

1

Ich kann einige Vorteile sehen, wenn ich versuche, die msbuild Community-Aufgaben in SVN zu haben (um die Anforderungen eines Build-Rechners zu reduzieren), aber ich würde sie einfach auf dem Server installieren. Wichtiger Teil: Aktualisieren Sie die Dokumentation für Ihren Build-Server, damit die Installation als Voraussetzung aufgeführt wird. Für mich verwende ich die Community-Aufgaben in praktisch jedem msbuild über mehrere Projekte hinweg und Deployment-Skripte, so dass sie alle in SVN bleiben, ist ein wenig überflüssig. Ich habe auch WiX auf dem Build-Server installiert.

ich etwas ähnliches tun, sondern eher als ein vor bauen Ziel, ich habe eine msbuild Projektdatei in etwa wie folgt aus:

<Target Name="Build"> 
    <CallTarget Targets="UpdateVersionNumbers"/> 
    <MSBuild Projects="Project.sln" Targets="Build"/> 
</Target> 

Mein UpdateVersionNumbers Ziel schnappt sich die SVN Revision und verwendet dann einen regulären Ausdruck und Fileupdate Aufgabe um den vierten Teil der Versionsnummer in die SVN-Revision zu ändern.

Dann führe ich den normalen Build der Lösungsdatei, und darin enthalten, dass es erstellt. Wixproj. Ziemlich einfach, wirklich.


Um obwohl einige Ihrer Fragen zu beantworten:

  • Wenn die Angabe von Pfaden immer verwenden Pfade in Bezug auf die Wurzel Ihrer Lösung (Kasse dir). Also in diesem Fall würden Sie einfach wix30\MSBuildCommunityTasks verwenden. TeamCity führt msbuild mit dem Arbeitsverzeichnis als root aus und obendrein spielt es keine Rolle, wo Sie oder andere Entwickler das Checkout durchführen - die Pfade sind alle nur relativ.
  • Sie können Parameter in Teamcity an Msbuild über die Build Parameters -> Systemeigenschaften übergeben. Fügen Sie beispielsweise eine Eigenschaft namens agentHome mit dem Wert %system.agent.home.dir% hinzu, und Sie können dann in Ihrer msbuild-Datei als $ (agentHome) darauf verweisen. Beachten Sie, wenn Sie auch msbuild wieder wie in meinem obigen Beispiel Aufruf, dann würden Sie tun müssen:

    <MSBuild Projects="Project.sln" Properties="agentHome=$(agentHome)" Targets="Build"/> 
    

    tatsächlich diese Variable in Project.sln passieren. Ich denke, aber ich bin nicht sicher, dass Msbuild auf einer .sln-Datei läuft auch alle Eigenschaften an alle einzelnen Projekte übergeben, so dass Sie tatsächlich in Ihrem vor Build-Ereignis zugreifen können.


Exkurs auf Installateure (Ich ging vor kurzem durch die gleiche Sache, die Sie getan haben): Ich ließ sich auf WiX 3.0, und obwohl es ganz Lernkurve, um es, es funktioniert gut. Wir starteten einen neuen Entwicklungsstrom und begannen VS2010 und .NET 4 zu verwenden. Nun, WiX 3.0 ist nicht kompatibel mit VS2010, also brauchten wir WiX 3.5 (das immer noch in der Beta ist - obwohl die state of it seems much better now than it was a few months ago, aber sie sind immer noch hinken. Solch ist die Natur von Open Source, manchmal). Ich hatte einige pain getting WiX 3.0 and 3.5 to install together, aber habe es endlich herausgefunden.

Die Frustration dieser (zwischen Inkompatibilität, flockige Betas (von vor ein paar Monaten) und der insgesamt langsamen Fortschritt) hat mich wirklich WiX ausgeschaltet (nichts für die Jungs von WiX, aber ich will nur einen Installer und ich möchte das nicht einbeziehen.Beachten Sie, sie sind sehr frustrated auch). Hinzu kommt, dass das Produkt, für das ich es benötige, einen viel komplexeren Installer benötigt und WiX einfach zu viel Arbeit macht. Ich habe gerade meinen Installer mit AdvancedInstaller aufgebaut, und es dauerte nur ein paar Tage, und bisher hat es gut funktioniert (obwohl wir gerade erst in den frühen Entwicklungsstadien sind, aber mit der kontinuierlichen Bereitstellung und dem Testen beginnen). Die Preise von AI sind vernünftig (wir sind noch in der Testversion), aber ich werde in den nächsten Tagen kaufen.

Ich bin sicher, die Zeit verbrachte ich lernen KI war viel weniger als ich verbringen würde lernen WiX, und dann versuchen, es alles tun, was ich brauche. Es ist ein wenig unvermeidlich, etwas darüber zu lernen, wie Windows Installer funktioniert, aber Sie müssen nicht zu tief gehen.

+0

Danke für die großen Vorschläge - Ich lese immer noch alles, aber es sieht sehr gut. Ich werde morgen wahrscheinlich mehr Fragen für dich haben. :) – Dave

+0

Ein Kommentar, den ich über das Setzen von WiX in SVN habe, ist, dass Entwickler eine Sache weniger installieren müssten. Derzeit habe ich mein WiX-Projekt als Teil der Lösung meiner Anwendung. Ich könnte zwei Wege gehen, denke ich - ich könnte * nicht * das tun und TeamCity die App bauen lassen, dann baue den Installer (denke ich ...). Wenn ich das WiX-Projekt in der Lösung behalte, müssen die anderen Entwickler WiX auf ihren Systemen installieren, damit VS2008 das Projekt ohne störende Fehler laden kann. Aber sie müssten zumindest nicht MSBuild Community Tasks installieren. – Dave

+0

relative Pfade scheinen nicht für mich zu arbeiten - ich musste schließlich eine Umgebungsvariable 'WORK_FOLDER' auf'% system.teamcity.build.checkoutDir% 'setzen. Ich habe immer noch nicht funktioniert, aber ich komme näher. Ich spring über eine Hürde, nur um in eine andere zu kommen. :) – Dave

0

Ich hasse es, wenn das passiert ... eine lange Frage eingeben, nur um etwas zu finden, das ich Minuten später verpasste.

Ich frage mich, ob das ist es:

alt text

Ich denke, meine Frage ist nun - kann ich eigentlich% system.agent.work.dir% in meinem .wixproj verwenden? Ich werde es jetzt versuchen.

+0

um dies zu überprüfen, IIRC die Antwort ist nein - Sie legen den Namen, und dann verweisen Sie auf diesen Namen in der **. Csproj ** – Dave