{"id":42,"date":"2009-01-04T11:21:00","date_gmt":"2009-01-04T10:21:00","guid":{"rendered":"http:\/\/www.axelirriger.de\/blog\/?p=42"},"modified":"2012-09-26T19:08:34","modified_gmt":"2012-09-26T19:08:34","slug":"software-deployments-2-probleme-werden-zu-lsungen","status":"publish","type":"post","link":"https:\/\/www.axelirriger.de\/index.php\/2009\/01\/04\/software-deployments-2-probleme-werden-zu-lsungen\/","title":{"rendered":"Software-Deployments 2 \u2013 Probleme werden zu L\u00f6sungen"},"content":{"rendered":"<div class=\"shariff\" data-title=\"Software-Deployments 2 \u2013 Probleme werden zu L\u00f6sungen\" 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\/04\/software-deployments-2-probleme-werden-zu-lsungen\/\" data-lang=\"en\" data-theme=\"colored\" data-orientation=\"horizontal\"><\/div><p><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; margin: 0px 10px 0px 0px;\" src=\"http:\/\/www.tm-mediendesign.de\/images\/hpbilder\/Zahnraeder-roetlich.jpg\" alt=\"\" width=\"108\" height=\"109\" align=\"left\" \/> In einem <a title=\"Software Deployments - Problemf\u00e4lle der Softwareentwicklung\" href=\"http:\/\/www.axelirriger.de\/blog\/?p=27\">anderen Beitrag<\/a> habe ich mir Probleme bei Software-Deployment Prozessen angeschaut. Dort habe ich als Ergebnis herausgestellt, dass eine Reduzierung der Fertigungstiefe dabei hilft, Qualit\u00e4tsschw\u00e4chen zu vermindern. Unter Fertigungstiefe habe ich dort den Grad des manuellen Eingreifens verstanden.<!--more--> Hier noch einmal die Ergebnisse in der \u00dcbersicht:<\/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>F\u00fcr einen Deployment-Prozess bedeutet dies, dass eine hohe Fertigungstiefe vorliegt, wenn alles (oder das meiste) manuell durchgef\u00fchrt wird. Demgegen\u00fcber steht eine geringe Fertigungstiefe, wenn eigentlich alles automatisiert abl\u00e4uft und eine Person lediglich zum Abschluss nochmal auf die Umgebung schaut, um zu kontrollieren, dass alles wie gew\u00fcnscht geklappt hat. In diesem Kontext w\u00e4re anstelle von \u201cFertigungsstiefe\u201d vermutlich \u201cAutomatisierung\u201d der bessere Begriff gewesen.<\/p>\n<h3>Deployment-Skripte: write once \u2013 run often<\/h3>\n<p><img decoding=\"async\" style=\"display: inline; margin: 0px 10px 0px 0px;\" src=\"http:\/\/ant.apache.org\/images\/project-logo.gif\" alt=\"\" align=\"left\" \/> Das im verlinkten Beitrag besprochene Team hat den Grad der Automatisierung dadurch erh\u00f6ht. dass automatisiert ablaufende Deploymentskripte verwendet wurden. Diese haben den entscheidenden Vorteil: <strong>write once \u2013 run often<\/strong>.<\/p>\n<blockquote><p>Der Vorteil einer skriptgesteuerten L\u00f6sung: write once \u2013 run often.<\/p><\/blockquote>\n<p>Nun bieten solche Skripte einen unsch\u00e4tzbaren Vorteil: Solange sie die Umgebung nicht ver\u00e4ndert, m\u00fcssen die Skripte nicht wieder angefasst werden, sondern sind up-to-date.<\/p>\n<p>Stehen allerdings gr\u00f6\u00dfere \u00c4nderungen (d.h. mehr als reines Bugfixing an bestehendem Code oder nur kleinere Weiterentwicklungen) an, m\u00fcssen auch die Deploymentskripte angepasst werden. Hier kommt ein neuer Fehlerfaktor ins Spiel, da die notwendigen Anpassungen nicht unbedingt korrekt durchgef\u00fchrt werden. Die m\u00f6glichen Probleme sind (unter anderem) folgende:<\/p>\n<ul>\n<li>Mitarbeiter kennen das Deploymentverfahren (noch) nicht oder nicht ausreichend \u2013&gt; Wissen<\/li>\n<li>Bei \u00c4nderungen an mehreren Stellen gehen einige verloren bzw. werden \u00fcbersehen \u2013&gt; Fl\u00fcchtigkeitsfehler<\/li>\n<\/ul>\n<p>Das Problem, gerade bei gr\u00f6\u00dferen Deploymentskripten, besteht h\u00e4ufig in der Komplexit\u00e4t, die diese entwickeln. Gerade in der h\u00e4ufigen Nutzung (oder bei h\u00e4fuigen \u00c4nderungen) gewinnen diese Skripte deutlich an Umfang. <strong>Hier ist es wichtig, die Komplexit\u00e4t weiter zu reduzieren<\/strong>.<\/p>\n<blockquote><p>Bei der Verwendung von Deployment-Skripten sollte kontinuierlich an eine Verringerung der Komplexit\u00e4t gedacht werden.<\/p><\/blockquote>\n<h3>Artefakte f\u00fcr eine reduzierte Komplexit\u00e4t<\/h3>\n<p>Es gibt viele M\u00f6glichkeiten, die Komplexit\u00e4t einer Anwendung zu reduzieren. Die einfachste M\u00f6glichkeit ist dabei, Skriptteile in separate Dateien auszulagern. Aber reduziert das tats\u00e4chlich die Komplexit\u00e4t?<\/p>\n<p>Die Komplexit\u00e4t wird, wie das Verb bereits andeutet, <em>ausgelagert<\/em> \u2013 also verschoben. Der Unterschied zwischen auslagern und verschwinden ist offenkundig: die Komplexit\u00e4t bleibt, wird aber nur an einen anderen Ort verschoben.<\/p>\n<blockquote><p>Ausgelagerte Komplexit\u00e4t ist nicht verringerte Komplexit\u00e4t<\/p><\/blockquote>\n<p><a title=\"Northants Events - Pattern Recognition exhibition\" href=\"http:\/\/www.bbc.co.uk\/northamptonshire\/content\/image_galleries\/pattern_recognition_gallery.shtml?3\"><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; margin: 0px 10px 0px 0px;\" src=\"http:\/\/www.bbc.co.uk\/northamptonshire\/content\/images\/2005\/02\/03\/textiles_exhibit_gallery_03_400x300_300x460.jpg\" alt=\"\" width=\"50\" height=\"77\" align=\"left\" \/><\/a> Ein Ausweg aus dem Dilemma stellt die Verwendung von Artefakten dar. Die Idee dabei ist, aus einem Skript Pattern heraus zu arbeiten. Ein Pattern ist ein wiederkehrendes Muster, also T\u00e4tigkeiten die immer wieder durchgef\u00fchrt werden m\u00fcssen. Alle T\u00e4tigkeiten, die zu diesem Pattern geh\u00f6ren, werden anschlie\u00dfend zu einem Artefakt zusammengefasst. Anschlie\u00dfend wird nur noch das Artefakt verwendet.<\/p>\n<blockquote><p>Ein Pattern ist ein wiederkehrendes Muster, also T\u00e4tigkeiten die immer wieder durchgef\u00fchrt werden m\u00fcssen.<\/p><\/blockquote>\n<p>F\u00fcr die konkrete Anwendung Deployment kann man zum Beispiel folgende Pattern feststellen:<\/p>\n<ul>\n<li>Dateien mit der Endung .properties werden immer ins Verzeichnis XYZ kopiert<\/li>\n<li>Dateien mit der Endung .sql werden immer gegen eine Datenbank ausgef\u00fchrt<\/li>\n<li>Dateien mit der Endung \u2013service.xml werden immer das deploy-Verzeichnis des Applikationsservers kopiert<\/li>\n<li>Dateien mit der Endung .reg werden immer in die Windows Systemregistrierung eingetragen.<\/li>\n<li>Nach jedem Deployment wird die Anwendung XYZ gestartet<\/li>\n<li>\u2026<\/li>\n<\/ul>\n<p>Die Liste erhebt, wie \u00fcblich, keinen Anspruch auf Vollst\u00e4ndigkeit und muss f\u00fcr den jeweiligen Anwendungsfall angepasst werden \u2013 aber ich denke, das Prinzip ist klar geworden.<\/p>\n<p><a href=\"http:\/\/www.axelirriger.de\/blog\/wp-content\/uploads\/2009\/01\/visio-softwaredeployments2.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"display: block; float: none; margin-left: auto; margin-right: auto; border-width: 0px;\" title=\"Visio_SoftwareDeployments2\" src=\"http:\/\/www.axelirriger.de\/blog\/wp-content\/uploads\/2009\/01\/visio-softwaredeployments2-thumb.jpg\" alt=\"Visio_SoftwareDeployments2\" width=\"295\" height=\"248\" border=\"0\" \/><\/a><\/p>\n<h3>Ein Pattern wird zu einem Ant-Task wird zu einem Artefakt<\/h3>\n<p>F\u00fcr all diese T\u00e4tigkeiten kann man nun ant-Tasks schreiben (wenn man <a href=\"http:\/\/ant.apache.org\">Apache Ant<\/a> verwendet) die diese Funktionen durchf\u00fchren und nur noch parametrisiert werden m\u00fcssen. Dabei werden dann Dateien, Pfade oder Anwendungen\/Skripte als Parameter mitgegeben, die dann in den Tasks verarbeitet werden.<\/p>\n<blockquote><p>Die Verwendung von Ant-Tasks verschleiert Komplexit\u00e4t und macht damit die Verwendung einfacher.<\/p><\/blockquote>\n<p>Werden diese Tasks verwendet, reduziert sich ein Skript auf das Aufrufen von eigenen Tasks. Jeder Task ist dabei f\u00fcr ein bestimmtes Artefakt <em>zust\u00e4ndig<\/em> und \u201c<em>wei\u00df<\/em>\u201d, wie dieses Artefakt zu behandeln ist.<\/p>\n<p>Der unsch\u00e4tzbare Vorteil f\u00fcr die Entwickler (in diesem Falle die Anwender der Software) ist dabei, dass sie nicht die ausgekl\u00fcgelten Mechanismen hinter den Tasks kennen brauchen, sondern lediglich wissen m\u00fcssen, was f\u00fcr ein Artefakt sie deployen wollen. Schon k\u00f6nnen Sie es verwenden.<\/p>\n<h3>Ant-Tasks reduzieren Komplexit\u00e4t und vereinfachen die Weiterentwicklung<\/h3>\n<p>Ein weiterer Vorteil, neben der einfacheren Verwendung ist die einfachere Wartung. Dadurch, dass man nur noch Tasks aufruft, k\u00f6nnen diese Tasks separat weiterentwickelt werden. Auf der anderen Seite m\u00fcssen aber bei Weiterentwicklungen die bestehenden Skripte nicht angepasst werden, wodurch sich der Aufwand f\u00fcr Weiterentwicklungen reduziert: <strong>eine Win-Win Situation<\/strong>.<\/p>\n<p>Die Ergebnisse habe ich nochmal in einer Mind-Map zusammengefasst:<\/p>\n<p><a href=\"http:\/\/www.axelirriger.de\/blog\/wp-content\/uploads\/2009\/01\/mm-softwaredeployments3.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"display: inline; border-width: 0px;\" title=\"MM_SoftwareDeployments3\" src=\"http:\/\/www.axelirriger.de\/blog\/wp-content\/uploads\/2009\/01\/mm-softwaredeployments3-thumb.jpg\" alt=\"MM_SoftwareDeployments3\" width=\"500\" height=\"182\" border=\"0\" \/><\/a><\/p>\n<h3>Fazit<\/h3>\n<p>Die Verwendung von Deploymentskripten ist ein gro\u00dfer Schritt in die richtige Richtung. Durch die weitergehende Abstraktion des Vorgangs \u201cDeployment\u201d k\u00f6nnen aber weitere Verbesserungen eingef\u00fchrt werden: Die Verwendung von Artefakten als Sammlung gleichartiger Arbeitsschritte vereinfacht die Verwendung dramatisch. Die M\u00f6glichkeit, diese Artefakte getrennt voneinander weiter zu entwickeln und die bestehenden Skripte nicht anpassen zu m\u00fcssen, f\u00fchren zu einer Win-Win-Situation in jedem Projektumfeld.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In einem anderen Beitrag habe ich mir Probleme bei Software-Deployment Prozessen angeschaut. Dort habe ich als Ergebnis herausgestellt, dass eine Reduzierung der Fertigungstiefe dabei hilft, Qualit\u00e4tsschw\u00e4chen zu vermindern. Unter Fertigungstiefe habe ich dort den Grad des manuellen Eingreifens verstanden.<\/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":[11,12,13,45,53,58],"class_list":["post-42","post","type-post","status-publish","format-standard","hentry","category-software-entwicklung","tag-apache-ant","tag-artefakte","tag-automatisierung","tag-pattern","tag-skripte","tag-software-deployment"],"_links":{"self":[{"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/posts\/42","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=42"}],"version-history":[{"count":1,"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/posts\/42\/revisions"}],"predecessor-version":[{"id":135,"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/posts\/42\/revisions\/135"}],"wp:attachment":[{"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/media?parent=42"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/categories?post=42"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/tags?post=42"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}