Visual Studio und Umbraco (Teil 2)

Dieser Artikel wurde von Do, Hoang Viet am Montag, 5. November 2012 verfasst. Aktualisiert: 28.01.2014 18:46:04

Im zweiten Teil von "Visual Studio und Umbraco" zeigen wir euch wie das Webprojekt über den Team System Build automatisch bei jedem Commit deploy wird.

Der Team System Build (ff. als TSB bezeichnet) ist eine Funktionalität des Team Foundation Server. Dabei wird serverseitig ein Prozess veranlasst, der den Source Code in der Repository kompiliert und ggf. weitere Aufgaben durchführt. In unserem Fall ist es das Deployment.

Damit er zur Verfügung steht, muss er zuvor serverseitig eingerichtet sein. Hierzu müssen Build Agent und Buid Controller über das Team Foundation Management serverseitig eingerichtet werden. Das ist aber nicht Thema dieses Tutorials und wird daher nicht behandelt. Für alle Interessierten sind im Bereich Weiterführende Links einige Links zu dem Thema zusammengestellt.

Unsere Lösung baut auf das Web Deployment Tool von Microsoft und den TSB auf. Wir gehen im Weiteren davon aus, dass ihr beide Systeme zum Laufen gebracht habt.

Build Definition erstellen

Um einen Build zu erstellen, klickt ihr im Visual Studio 2012 auf "New Build Definition..." im Menü "Project". Im darauffolgenden Formular gebt ihr einen Namen im Feld "Build definion name" an.

build.new.png 

Anschließend wechselt ihr zum Bereich "Trigger". Dort wählt ihr "Continuous Integration - Build each check-in" aus. Falls ihr nicht wollt, dass bei jedem Check-in das Deployment durchgeführt wird, könnt ihr auch eine der anderen Optionen auswählen. Beispielsweise "Manual" oder "Gated Check-in". Letzteres bedeutet, dass eure Commit abgelehnt wird, wenn der Build (also das Deployment) fehltgeschlagen ist.

build.new.trigger.png 

Im Bereich "Build Defaults" wählt ihr bei Staging location die Option "This build does not copy output files to a drop folder". Das TSB nutzt den Drop Ordner um den Output jedes ausgeführten Builds zu speichern. Das ist für eine Webseite eigentlich nicht nötig.

build.new.builddesfaults.png 

Abschließend wechselt ihr noch zum Bereich "Process" und fügt beim Feld "MSBuild Arguments" Folgendes hinzu:

/p:DeployOnBuild=True /p:DeployTarget=MsDeployPublish /p:MSDeployPublishMethod=InProc
/p:CreatePackageOnPublish=True /p:DeployIisAppPath=<IISPath>
/p:MsDeployServiceUrl=<ServiceURL>

Für IISPath tragt ihr den Namen eurer Webseite ein. Gemeint ist hier der Name, der dem IIS Manger bekannt ist, nicht etwa der im <title>-Tag der Page oder die Domain.

 build.new.process.png

Anschließend sollte die Webseite mit jedem Check-in automatisch auf dem Server deploy werden. Auf eventuelle Probleme gehen wir im nachfolgenden Abschnitt ein.

Eventuelle Probleme

Es handelt sich bei den Lösungen hauptsächlich um pragmatische Lösungen. Bevor ihr sie ausprobiert, sollte ihr euch die alten Werte irgendwo aufschreiben und für die betroffenen Dateien Backups erstellen.

Insufficient Permissions

Bei diesem Fehler werdet ihr beim Build folgende Meldungen bekommen:

<Path> (3481): Web deployment task failed. (An error occurred when reading the IIS Configuration File 'MACHINE/REDIRECTION'. The identity performing the operation was <Identity>.)  An error occurred when reading the IIS Configuration File 'MACHINE/REDIRECTION'. The identity performing the operation was <Identity>. Filename: \\?\C:\Windows\system32\inetsrv\config\redirection.config Error: Cannot read configuration file due to insufficient permissions

Es handelt sich hierbei um einen Zugriffsfehler. Der Benutzeraccount, mit dem der Build auf dem Server ausgeführt wird, hat keine Leserechte für die Konfigurationsdateien.

Um den Fehler zu beheben, müsst ihr auf die gelistete Datei rechtsklicken, dann auf Eigentschaft (engl. Properties) => Sicherheit (engl. Security) => "Bearbeiten..." (engl. "Edit..."). Nun fügt ihr den jeweligen Account hinzu und gibt ihm die notwendigen Rechte. Es kann sein, dass der Account auf weitere Dateien Zugriff braucht.

Team Build beschleunigen

Für jeden Durchgang braucht der Teambuild ca. 3 Minuten. Das führt vor allem bei "Gated Check-in" zu Problemen. Außerdem ... ist Warten einfach nicht lustig ;).

Der Grund, warum das Deployment so lange braucht, liegt darin, dass er bei jedem Build alles löscht und komplett neu kompiliert. Zudem erstellt er noch Work Items bei Problemen, führt Tests und Analysen durch und ggf. Weiteres. Um Inkrementelle Erstellung zu aktiveren, geht ihr noch mal zurück zum Prozesstab und deaktiviert folgende Einstellungen:

  • Analyze Test Impact
  • Clean Workspaces
  • Label Sources
  • Disable Tests (ihr müsst die Option aktivieren um die Tests zu deaktivieren)

Falls ihr nicht mit den Work Items vom TFS arbeitet (Product Backlog, Sprintbacklogs, etc.). Dann könnt ihr auch folgende Optionen deaktivieren.

  • ggf. Associate Changesets and Work Items
  • ggf. Create Work Item on Failure

 build.speedup.png

Synchronisationsprobleme

Diese Lösung hat ein beachtliches Problem mit der Synchronisierung, wenn ihr sowohl lokal auf dem Rechner als auch online über das Webinterface arbeiten wollt.

Das Webdeployment versucht ein Abbild von eurem lokalen Rechner auf dem Server zu erstellen. Hierzu gehört auch, dass er den Inhalt der Ordner synchronisiert. Stark betroffen davon ist der App_Data Ordner. Aber auch media, css, masterpages und andere Ordner. Wenn ihr online ein Bild uploadet und anschließend lokal einen Build triggert, wird er das Bild auf dem Server löschen, da dieser nicht lokal enthalten ist.

Ihr solltet daher ausschließlich lokal entwickeln, Content und Packages hinzufügen. Und anschließend nur noch auf den Server über den Build uploaden. Achtet bitte auch darauf, dass ihr den Content dem Projekt hinzufügen müsst.

Weiterführende Links

Zugegeben, es ist nicht die leichtgewichtigste Lösung und evtl. auch nicht die geeigneteste. Wir wollten aber den Buildserver bei der Gelegentheit mal testen und haben uns daher hierfür entschieden. Eine Möglichkeiten wäre, einen eigenen Build Workflow über Visual Studio zu definieren, bei dem nur der Ordner rüberkopiert wird.

Hattet ihr Probleme beim Einrichten? Was sind eure Meinungen zu der Lösung? Habt ihr einen Verbesserungsvorschlag?

 
blog comments powered by Disqus

Google Anzeigen

Neusten Blogeinträgen

  • CSS: Animationen

    CSS3 bietet von Haus aus Möglichkeiten zur Definition von Animationen über die Property animation. Wie es funktioniert zeigen wir in diesem Artikel.

  • CSS: Alternierende Tabellenzeilen

    Um die Lesbarkeit von Tabellen zu steigern, bietet die CSS die Möglichkeit Tabellenzeilen alternierend zu färben. Wie das funktioniert zeigen, wir ...

  • Unity3D: Konsolenausgabe formatieren

    Die Unitykonsole ist einer der meistgenutzten Feature wenn es bei Unity um Fehlersuche und -behandlung geht. Sie wird dabei schnell voll und verli ...

  • Unity3D: Singleton für langsame Operationen

    Operationen wie Object.FindObjectOfType werden in der Dokumentation von Unity3D Entwickler selbst als sehr langsam beschrieben. Aus dem Grund wird ...

  • Unity3D: Optionale Parameter

    Unity3D (4.3.1) unterstützt keine optionale Parameter, wenn die betroffene Skriptdatei in einem Namespace definiert wird.

Popular Threads

Share it on your network