{"id":27,"date":"2009-01-02T21:45:27","date_gmt":"2009-01-02T20:45:27","guid":{"rendered":"http:\/\/www.axelirriger.de\/blog\/?p=27"},"modified":"2012-09-26T19:09:19","modified_gmt":"2012-09-26T19:09:19","slug":"software-deployments-problemflle-der-softwareentwicklung","status":"publish","type":"post","link":"https:\/\/www.axelirriger.de\/index.php\/2009\/01\/02\/software-deployments-problemflle-der-softwareentwicklung\/","title":{"rendered":"Software Deployments \u2013 Problemf\u00e4lle der Softwareentwicklung"},"content":{"rendered":"<div class=\"shariff\" data-title=\"Software Deployments \u2013 Problemf\u00e4lle der Softwareentwicklung\" data-info-url=\"http:\/\/ct.de\/-2467514\" data-backend-url=\"https:\/\/www.axelirriger.de\/wp-content\/plugins\/shariff-sharing\/backend\/index.php\" data-temp=\"\/tmp\" data-ttl=\"60\" data-service=\"gftr\" data-services='[\"googleplus\",\"facebook\",\"twitter\",\"reddit\",\"info\"]' data-image=\"\" data-url=\"https:\/\/www.axelirriger.de\/index.php\/2009\/01\/02\/software-deployments-problemflle-der-softwareentwicklung\/\" data-lang=\"en\" data-theme=\"colored\" data-orientation=\"horizontal\"><\/div><p>Bei <a href=\"http:\/\/www.wired-space.de\/?p=3\">Wired Space<\/a> hat der Kollege Erfahrungen aus dem Entwicklerleben publiziert: diverse Probleme im Umfeld von Software-Deployments. Die gefundenen Schwierigkeiten waren:<\/p>\n<ul>\n<li><strong><\/strong><em>\u201cBut it ran fine on my machine.\u201d<\/em><\/li>\n<li><em>\u201cManual deployment steps are prone to errors.<\/em>\u201c<\/li>\n<li>Kommunikationsschwierigkeiten im Team<\/li>\n<\/ul>\n<p>Dabei ist letzterer Punkt, der immer wieder zu Problemen f\u00fchrt, noch nicht breit ausgef\u00fchrt &#8211; aber das kommt wohl noch. Nichts desto trotz sind Deployments an sich schon komplex genug, sodass man sich auch alleine dar\u00fcber schon lange genug auslassen kann.<!--more--><\/p>\n<h3>\u00dcbersicht Deploymentprozess<\/h3>\n<p>Um die Probleme besser verstehen zu k\u00f6nnen, vorab eine kurze Beschreibung, was alles zum Thema Deployment geh\u00f6rt. Allgemein spricht man von Deployment, wenn eine Software(-komponente) auf eine Umgebung ausgeliefert wird. Das kann sowohl eine Anwendung\/Applikation sein, als auch serverseitige Komponenten. Ferner kann es eine Voll- als auch Teilinstallation im Zuge von Aktualisierungen sein.<\/p>\n<p>Neben dem reinen Aufspielen auf die Umgebung fallen ferner alle Prozessschritte darunter, die sich um die Anpassung der Komponente f\u00fcr die jeweilige Laufzeitumgebung beinhalten. Dazu geh\u00f6ren (ohne Erhebung auf Vollst\u00e4ndigkeit):<\/p>\n<ul>\n<li>Einspielen von Konfigurationen in Datenbanken<\/li>\n<li>Kopieren von Konfigurationsdateien<\/li>\n<li>Migration von Konfigurationen<\/li>\n<li>Erstellung und Anbindung von Datenbanken und Queueing Architekturen<\/li>\n<\/ul>\n<p>Teilweise handelt es sich um Schritte, die bei jeder erneuten Installation wieder durchgef\u00fchrt werden m\u00fcssen. Teilweise handelt es sich um einmalige Prozeduren (im Falle von Versionsaktualisierungen). Das ganze nochmal als Bild:<\/p>\n<p><a href=\"http:\/\/www.axelirriger.de\/blog\/wp-content\/uploads\/2009\/01\/mm-softwaredeployments.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;\" title=\"MM_SoftwareDeployments\" src=\"http:\/\/www.axelirriger.de\/blog\/wp-content\/uploads\/2009\/01\/mm-softwaredeployments-thumb.jpg\" alt=\"MM_SoftwareDeployments\" width=\"488\" height=\"189\" border=\"0\" \/><\/a><\/p>\n<p>Doch nun zu den Problemen.<\/p>\n<h3>Problem 1 &#8211; \u201c<em>But it ran fine on my machine\u201d<\/em><\/h3>\n<p>Das Team hat das Problem gehabt, dass die entwickelte Anwendung auf den jeweiligen Entwicklermaschinen sauber funktionierte, auf der Auslieferungsumgebung jedoch nicht. Es wurden folgende Beobachtungen gemacht:<\/p>\n<ul>\n<li>lokal installierte Bibliotheken sind nicht in die Entwicklung zur\u00fcckgeflossen<\/li>\n<li>Es wurden teilweise &#8222;Debug Builds&#8220; verwendet<\/li>\n<\/ul>\n<p>Das klassische Ph\u00e4nomen dahinter ist, dass die Software nicht immer so gebaut wird, wie sie sp\u00e4ter verwendet bzw. ausgeliefert wird. Das ist an sich verst\u00e4ndlich, da man f\u00fcr die Fehlersuche einen Debug-Build ben\u00f6tigt. Wenn jedoch nicht die korrekte Funktionsweise anhand eines &#8222;Delivery builds&#8220; \u00fcberpr\u00fcft wird, ist die ganze Fehlersuche am Ende leider trotzdem f\u00fcr die Katz&#8216;.<\/p>\n<p>Aus diesem Grunde m\u00fcssen immer zwei Konfigurationen ber\u00fccksichtigt werden:<\/p>\n<ul>\n<li>\u201cDebug builds\u201d f\u00fcr die Fehlersuche w\u00e4hrend der Entwicklung<\/li>\n<li>\u201cDelivery builds\u201d f\u00fcr die Auslieferung<\/li>\n<\/ul>\n<p>Dabei mu\u00df sichergestellt werden, dass Tests grunds\u00e4tzlich immer gegen die \u201cDelivery builds\u201d stattfinden, also die Versionen, die tats\u00e4chlich beim Kunden eingesetzt werden sollen.<\/p>\n<p><a href=\"http:\/\/www.axelirriger.de\/blog\/wp-content\/uploads\/2009\/01\/winklogo.gif\"><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; margin: 0px 10px 0px 0px; border: 0px;\" title=\"winklogo\" src=\"http:\/\/www.axelirriger.de\/blog\/wp-content\/uploads\/2009\/01\/winklogo-thumb.gif\" alt=\"winklogo\" width=\"149\" height=\"50\" align=\"left\" border=\"0\" \/><\/a> Dabei ist das Verhalten bzw. die Testf\u00e4lle zu protokollieren (im Falle von grafischen Anwendungen eignet sich dabei <a href=\"http:\/\/www.debugmode.com\/wink\/\">Wink<\/a> sehr gut und ist zudem kostenfrei).<\/p>\n<p>Um das Problem zu umgehen, hat das Team auf Basis einer virtuellen Umgebung (VMWare, VirtualBox, Parallels Desktop, et cetera) eine Referenzumgebung aufgebaut, die immer wieder zur\u00fcckgesetzt wurde.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; margin: 0px 10px 0px 0px;\" src=\"http:\/\/www.virtualbox.org\/graphics\/vbox_logo2_gradient.png\" alt=\"\" width=\"49\" height=\"63\" align=\"left\" \/> Die Virtualisierung bietet den Vorteil in einer definierten Umgebung arbeiten zu k\u00f6nnen. Dabei kann man sich die Umgebung so aufbauen, wie man es ben\u00f6tigt oder wie es beim Kunden im Einsatz ist. Mittlerweile beherrschen alle Systeme auch die M\u00f6glichkeit, Snapshots zu erzeugen. Damit wird der Zustand einer virtuellen Umgebung eingefroren und man kann zu einem vorherigen Zustand zur\u00fcckkehren.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; margin: 0px 10px 0px 0px;\" src=\"http:\/\/www.methodsandtools.com\/archive\/CI1.jpg\" alt=\"\" width=\"169\" height=\"127\" align=\"left\" \/> Neben der Virtualisierung bietet zudem das \u201cContinuous Integration\u201d eine gute M\u00f6glichkeit, Fehler sehr fr\u00fch zu finden. Hierbei wird auf einer separaten Umgebung der bestehende Quellcode regelm\u00e4\u00dfig (im Idealfall: bei jeder \u00c4nderung) neu gebaut. Hierbei wird immer wieder frisch aufgesetzt, sodass fehlende Bibliotheken oder sonstige \u00c4nderungen unmittelbar auffallen.<\/p>\n<h3>Problem 2 &#8211; <em>Manual deployment steps are prone to errors<\/em><\/h3>\n<p>Hier liegt der Hase im Pfeffer bei der manuellen Durchf\u00fchrung. Normalerweise vergisst man manchmal Dinge im Eifer des Gefechts, oder es werden manuell noch &#8222;eben kurz&#8220; Dinge nachgebessert. Dies f\u00fchrt dazu, dass jeder Installationsprozess &#8222;einzigartig&#8220; ist und damit keine Wiederholbarkeit im Sinne einer Qualit\u00e4tssicherung durchgef\u00fchrt werden kann.<\/p>\n<p>Um diesem Problem entgegen zu wirken, hat sich das Team dazu entschieden, <a href=\"http:\/\/ant.apache.org\">Apache Ant<\/a> einzusetzen.<\/p>\n<p>Mit dem Tool k\u00f6nnen prinzipiell alle Schritte eines Installationsprozess automatisiert werden:<\/p>\n<ul>\n<li>Auspacken von Archiven<\/li>\n<li>Kopieren von Dateien<\/li>\n<li>Ausf\u00fchren von SQL Skripten<\/li>\n<\/ul>\n<p>Durch die M\u00f6glichkeit, Profile zu verwenden, kann man diese Skripte wiederum auf unterschiedlichen Umgebungen mit unterschiedlichen Konfigurationen ablaufen lassen.<\/p>\n<p>Wie kann man aber anhand eines solchen Werkzeugs ein Verfahren entwickeln, mit dem sowohl Update- als auch Neuinstallationen geleistet werden k\u00f6nnen? Das Ziel eines jeden Prozesses ist es ja, f\u00fcr jeden Fall das gleiche Verfahren anzuwenden und nicht wieder von Fall zu Fall entscheiden zu m\u00fcssen, wie eine Aktualisierung zu erfolgen hat. Nun, Ant bietet die M\u00f6glichkeit, anhand von Variablen bestimmte Verarbeitungsschritte zu \u00fcberspringen. Ferner k\u00f6nnen ebenfalls externe Skripte eingebunden werden.<\/p>\n<h3>Variablen und \u201cintelligente\u201d Skripte f\u00fcr das \u201cOne Size Fits All\u201d Verfahren<\/h3>\n<p>Hiermit ist es sehr elegant m\u00f6glich, ein solches Verfahren zu realisieren. F\u00fcr jede Installation wird das Installationsskript erweitert. Dabei werden diejenigen Teile, die f\u00fcr jede Installation notwendig sind, in allgemeine Sektionen (\u201cGoals\u201d im Ant-Jargon) zusammengefasst. Zudem werden nach dem allgemeinen Teil auch spezielle Sektionen durchgef\u00fchrt, die jeweils nur f\u00fcr ein Versionsupdate gelten (1.0 \u2013&gt; 1.1, et cetera). Das Skript wird anschlie\u00dfend mit der installierten Version aufgerufen. Das Skript pr\u00fcft dann bei jedem Spezialschritt gepr\u00fcft, ob f\u00fcr den Schritt von der vorhandenen Installation zu der neuen Installation dieser Schritt notwendig ist und ggf. ausgef\u00fchrt.<\/p>\n<p>Das Ganze habe ich in folgender Grafik nochmal zusammengefasst:<\/p>\n<p><a href=\"http:\/\/www.axelirriger.de\/blog\/wp-content\/uploads\/2009\/01\/mm-softwaredeployments2.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;\" title=\"MM_SoftwareDeployments2\" src=\"http:\/\/www.axelirriger.de\/blog\/wp-content\/uploads\/2009\/01\/mm-softwaredeployments2-thumb.jpg\" alt=\"MM_SoftwareDeployments2\" width=\"489\" height=\"149\" border=\"0\" \/><\/a><\/p>\n<h3>Fazit<\/h3>\n<p>Man kann in relativ wenigen Spiegelstrichen zusammenfassen, was man aus den Erfahrungen lernen kann:<\/p>\n<ul>\n<li><em>Deploymentprozesse sind mehr als &#8222;Copy to directory&#8220;<\/em><\/li>\n<li>Manuelle &#8222;Fertigungstiefe&#8220; muss reduziert werden, um Qualit\u00e4t zu erh\u00f6hen<\/li>\n<li>Wiederholbarkeit erh\u00f6ht Sicherheit<\/li>\n<li>\u201cContinuous Integration\u201d unterst\u00fctzt<\/li>\n<li>Virtualisierung erg\u00e4nzt bestehende Infrastrukturen durch hohe Wiederholbarkeit und Verl\u00e4sslichkeit der erzielbaren Ergebnisse<\/li>\n<\/ul>\n<p>Gerade der erste Punkt sollte nicht au\u00dfer Acht gelassen werden, denn es wird \u00fcblicherweise au\u00dfer Acht gelassen, an was man alles denken muss \ud83d\ude42<\/p>\n<div id=\"scid:0767317B-992E-4b12-91E0-4F059A8CECA8:498ec905-4405-45f6-a04c-1d4c5336be85\" class=\"wlWriterEditableSmartContent\" style=\"display: inline; float: none; margin: 0px; padding: 0px;\">Technorati-Tags: <a href=\"http:\/\/technorati.com\/tags\/Deployment\" rel=\"tag\">Deployment<\/a>,<a href=\"http:\/\/technorati.com\/tags\/Ant\" rel=\"tag\">Ant<\/a>,<a href=\"http:\/\/technorati.com\/tags\/Apache+Ant\" rel=\"tag\">Apache Ant<\/a>,<a href=\"http:\/\/technorati.com\/tags\/Software+Deployment\" rel=\"tag\">Software Deployment<\/a>,<a href=\"http:\/\/technorati.com\/tags\/Automation\" rel=\"tag\">Automation<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bei Wired Space hat der Kollege Erfahrungen aus dem Entwicklerleben publiziert: diverse Probleme im Umfeld von Software-Deployments. Die gefundenen Schwierigkeiten waren: \u201cBut it ran fine on my machine.\u201d \u201cManual deployment steps are prone to errors.\u201c Kommunikationsschwierigkeiten im Team Dabei ist letzterer Punkt, der immer wieder zu Problemen f\u00fchrt, noch nicht breit ausgef\u00fchrt &#8211; aber das &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.axelirriger.de\/index.php\/2009\/01\/02\/software-deployments-problemflle-der-softwareentwicklung\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eSoftware Deployments \u2013 Problemf\u00e4lle der Softwareentwicklung\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[7],"tags":[],"class_list":["post-27","post","type-post","status-publish","format-standard","hentry","category-software-entwicklung"],"_links":{"self":[{"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/posts\/27","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/comments?post=27"}],"version-history":[{"count":1,"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/posts\/27\/revisions"}],"predecessor-version":[{"id":137,"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/posts\/27\/revisions\/137"}],"wp:attachment":[{"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/media?parent=27"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/categories?post=27"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/tags?post=27"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}