Was ist denn das nun schon wieder? Brauche ich das wirklich?vDas kostet mich doch nur wieder viel Zeit und Geld?! Kann nicht einfach alles so bleiben wie es ist? Solche Fragen stellen sich viele immer wieder, wenn es einen neuen Trend gibt und Unternehmen überlegen, ob man diesem Trend folgen möchte oder auch nicht. Was Continuous Testing (CT) ist, wie wir das Konzept dahinter zum Vorteil nutzen können und warum die Automation von Tests mit CT weit mehr als ein Trend ist, erläutern wir im Folgenden.
Ganz einfach formuliert, ist Continuous Testing die Integration von automatisierten Tests in den kontinuierlichen Software Delivery Prozess. Sogar die mehrfache Integration von automatisierten Tests innerhalb eines Prozesses, wie nach bestimmten Schritten eines Software Delivery Prozesses, ist nicht unüblich.
Prinzipiell eignen sich alle Arten von Tests für den Einsatz. Sowohl funktionale Tests, wie Unittests, Integrationstests, API Tests, End2End-Tests oder auch Layouttests, als auch nicht-funktionale Tests, wie Last- und Performancetests, Sicherheitstests oder Usability-Tests. Es macht meist aber keinen Sinn alle vorhandenen Tests nach jedem Schritt im Delivery Prozess durchzuführen. Soll heißen, es gibt kein Rezept oder eine klar formulierte Schritt-für-Schritt Anleitung, wie Continuous Testing ein- oder umzusetzen ist. Continuous Testing ist eher eine Art Pattern fürs kontinuierliche Testen mit kurzen Feedbackschleifen. Basis ist dabei immer, dass man sich für sein spezielles Umfeld, seine Software, seine Prozesse, seine Infrastruktur etc. überlegen muss, wie sich automatisierte Tests gemessen am Verhältnis Aufwand/Nutzen und entsprechend ihrem Aussagegehalt je Testart am effektivsten einsetzen lassen. Hierbei ist es enorm wichtig, dass sich alle Beteiligte im Vorfeld überlegen und definieren müssen, wo, wann welche Tests Sinn machen. Dies können nur alle zusammen entscheiden, da unterschiedliche Personen unterschiedlicher Rollen auch unterschiedliche Ansichten und Prioritäten haben.
Automatisierte Tests haben den Vorteil, dass sie nur einmalig implementiert werden müssen, meist schneller laufen als manuelle Testdurchführungen und immer exakt den gleichen Ablauf gewährleisten. Diese Vorteile bietet insbesondere das Continuous Testing. Einmalig implementierte automatisierte Tests werden nach jedem Change immer wieder durchgeführt in den vorhandenen Software Delivery Prozessen. Auf den ersten Blick wirkt es so, als ob sich die Prozesse nur unnötig verlängern würden, wenn Tests immer und immer wieder laufen und sich somit die Produktivsetzung der Software verzögert. Aus rein zeitlicher Sicht mag das stimmen, natürlich kosten Testdurchführungen Zeit. Aber es lohnt sich diesen Zeitaufwand in Kauf zu nehmen, denn:
Kurz gefasst, bietet Continuous Testing dem ganzen Team mehr Sicherheit und ein gutes Gefühl für erfolgreiche Deliveries.
Vom Grundgedanken her ist Continuous Testing ein wirklich sehr einfacher Ansatz. Die Komplexität liegt dabei, wie so oft, im Detail und der Umsetzung. Um zu erfahren, wie es zu diesem Ansatz kam, ist es sinnvoll sich die Entwicklung der Software Delivery Prozesse zu verdeutlichen.
Sie haben Fragen oder möchten ein Angebot?
Wir rufen Sie gerne zurück!
„Früher“ (s. Abbildung 1) wurde Software meist nach dem Wasserfallmodell entwickelt. Dies bedeutet, dass die Software zuerst geplant und die Anforderungen in Schriftform dokumentiert wurden. Anschließend fand dann die Entwicklung statt und ganz am Ende stand für alles zusammen das Testing an. Es gab meist nur wenige Releases im Jahr. Die Deployments auf die Testumgebung (Stage) und die Produktivumgebungen hingen oft noch mit viel manuellem Aufwand zusammen und die Tests, die durchgeführt wurden, waren zum großen Teil manueller Art und häufig explorativer Art. Typisch waren auch Checklisten für Tests, die von Punkt 1 bis Punkt n nach jedem Release immer und immer wieder abgearbeitet wurden. Zu der Zeit war das Thema der Unittests schon aktuell, aber noch nicht ausgereift; Integrationstests oder API Tests bildeten eher die Ausnahme. Allerdings war zu der Zeit das Thema der End2End-Tests (User-Acceptance- Tests) bereits aktuell und erfuhr im Bereich Web durch die Einführung von Selenium weiteren Aufschwung. Diese Tests zeigten sich aber auch damals schon sehr fehleranfällig und vergleichsweise langsam und träge. Teilweise gab es auch bereits Last- oder Performancetests, die nachgelagert durchgeführt wurden. Nicht selten hieß das Motto „Der Nutzer ist unser bester Tester und wird uns schon Feedback geben.“
Durch die wachsende Popularität der agilen Ansätze und Methoden, hat sich auch das Testing und die Denkweise rund um den Software Delivery Prozess angepasst und weiterentwickelt .
Die Leitsprüche „time to market“ und „potentially shippable“ führten dazu, dass Deployments zum Großteil in Form von CI/CD Pipelines automatisiert wurden. Der zeitliche Zyklus der Releases verkürzte sich so deutlich. Oft ist es aber noch so, dass es große Deployments von großen Softwarekomponenten sind, die ausgerollt werden.
Auch im Bereich Test hat es viel Optimierung gegeben. Die Bedeutung von Unittests ist weiterhin gestiegen. Integrationstests und API Tests haben an Wert gewonnen und werden häufiger automatisiert. Es gibt weiterhin oft viele End2End Tests. All diese Tests sind nun bereits schon integriert in die automatischen Deploymentprozesse. Teilweise laufen End2End Tests noch als nachgelagerte Prozesse, da sie weiterhin fehleranfälliger und langsamer sind als Unit- oder Integrationstests. Sogar nichtfunktionale Tests, wie Last- oder Performancetests, werden teilweise bereits integriert. (Abbildung 2)
Der erste Schritt in Richtung Continuous Testing ist also bereits gemacht. Und wie wird nun aus dem aktuellen Modell ein Continuous Testing Modell? Eigentlich ist die Antwort ganz einfach: Teile deine Software in Services / Microservices auf und gewährleiste, dass jeder Service unabhängig von allem anderen über einen Deployment-Prozess bereitgestellt wer-den kann. Dabei wird jeder Deployment-Schritt eines jeden Services, sofern notwendig und sinnvoll, durch zu definierende, geeignete automatisierte Tests auf Korrektheit überprüft.
Das klingt in der Theorie wirklich sehr simpel, es bedarf im Detail aber wirklich einiges an Aufwand für die Umsetzung. Jeder Service sollte hierbei seine eigene CI/CD Pipeline haben. Um Redundanzen bei der Erstellung und Wartung der Pipeline zu vermeiden und um ein einheitliches Pipelinekonstrukt zu haben, empfiehlt es sich ein Pipeline Template zu definieren, welches dann jeder Service nutzt und für sich implementiert und gegebenenfalls ausprägt (zur grafischen Verdeutlichung siehe Abbildung 3).
So lässt sich erreichen, dass automatisierte Tests, wie Unittests, Integrations- und API-Tests, End2End-Tests, Last- und Performancetests oder welche Art von Tests auch immer für jedes Deployment eines jeden definierten Service durchgeführt werden. Welche Tests dabei wann notwendig bzw. sinnvoll sind und einen Mehrwert schaffen, ist hierbei immer im Einzelfall zu definieren.
Speziell in Hinblick auf die fehleranfälligen und recht langsamen End2End-Tests sollten folgende Fragen geklärt sein, um ein richtiges Maß an Tests für die Deployment-Pipelines zu schaffen:
Die Thematik wirkt zunächst sehr theoretisch. Um das Thema aber auch praktisch näher zu verdeutlichen, soll ein Beispiel die Einführung von Continuous Testing erläutern. Die Abbildung 4 veranschaulicht das mögliche Vorgehen bei der Umsetzung dazu grafisch.
Nehmen wir an, ein Unternehmen hat sich für den Einsatz von Continuous Testing entschieden. Im eigenen Haus kann es nicht auf die dafür notwendigen Ressourcen oder Kompetenzen zurückgreifen und holt sich das entsprechende Know-how bei Consultants, die das eigene Team unterstützen.
Die Ausgangslage kennzeichnet eine webbasierte Software, die aus einem Plattform Frontend und einem Plattform Backend besteht. Sowohl das Backend als auch das Frontend basiert auf einem Service, der wiederum auf REST basiert. Weitere funktionale Webservices / Microservices werden bereitgestellt, um vom Frontend oder über eine API gesteuert zu werden (ebenfalls über REST). Einerseits gibt es manuelle Tests, die über die Web GUI der Anwendung laufen. Andererseits werden in zeitlichen Abständen die automatisierten End2End-Tests lokal auf einem Entwicklerrechner ausgeführt.
Schnittstellentests existieren nicht und auch die Durchführung von existierenden automatisierten Tests in Jenkins sind weder umgesetzt und noch geplant.
Die vorgeschlagene Lösung beinhaltet die folgenden Konstrukte:
Als Mehrwert resultiert so ein durchgehendes integriertes, automatisiertes Testing in alle Pipelines wobei die Qualität jeder Pipeline und jedes Deploymentgegenstands kontinuierlich geprüft wird. Ein entsprechendes Reporting und gegebenenfalls Abhängigkeiten zwischen Deployment-Pipelines verhindern somit das Ausrollen von bekannten und aufgedeckten Fehlern. Darüber hinaus wird das Eingreifen durch manuelle Testaktivitäten und der damit verbundene Aufwand vermieden und ein Deployment im theoretischen Rhythmus von 24/7 ermöglicht.
Die konkrete Aufteilung in unabhängige (Micro-)Services inkl. der Erstellung der Deployment- Pipelines und der Integration der Tests in diesem Prozess ist durchaus mit zeitlichem Aufwand verbunden und lässt sich nicht von heute auf morgen realisieren. Continuous Testing ist nur ein Bruchteil des gesamten Continuous Lifecycles. Das Resultat der erfolgreichen Umsetzung aber ist lohnenswert.
Continuous Testing ist ein sehr hilfreiches Konzept ist, um die Qualität der Software, sowie der Delivery Prozesse zu sichern und sogar zu steigern. Insofern ist Continuous Testing auch sicherlich mehr als nur ein Trend, der sich rasch als Konstante oder Pattern im Umfeld Continuous Integration etablieren kann.
Continuous Testing im Rahmen von Continuous Deployment / Delivery ist und bleibt ein spannendes Thema. Unternehmen werden in Zukunft wohl kaum noch auf diese Thematik verzichten können, um eine hohe Qualität beim Bereitstellen einer Software in einem quantitativen Zeitzyklus sicherzustellen. In den Zeiten, in denen möglichst alles möglichst schnell geliefert werden muss, soll und darf die Qualität nicht darunter leiden. Und genau hierfür ist Continuous Testing der korrekte Lösungsansatz.
Continuous Integration (CI) und Continuous Delivery (CD) sind grundlegende Bestandteile einer agilen Softwareentwicklung. Durch sie soll schnell gute Software entstehen. Automatisierte, zugleich flexible Prozesse sind dabei für Entwicklung und Betrieb (DevOps) essentiell. Wie aber lassen sich die Erfolgsfaktoren agiler Projekte definieren?
Messen SLAs und / oder KPIs den Erfolg? Welche Messgrößen machen wann Sinn?
Betreibt ein Unternehmen CI/CD als zentralen Service, sind für diesen Service – wie für andere Services des Unternehmens – üblicherweise SLAs vorgegeben. Diese umfassen meist Vorgaben für Verfügbarkeit, Performance oder auch Reaktionszeiten auf Incidents. SLAs stammen ursprünglich aus dem IT-Umfeld und finden insbesondere im Bereich Hosting seit längerem Einsatz. Dort sind die Rahmenbedingungen für die Bereitstellung eines Service hinreichend gut verstanden und definierbar.
Für KPIs gilt dies nicht gleichermaßen. Sie für einen Anwendungsservice zu formulieren ist generell nicht ganz so einfach. In einem agilen bzw. DevOps-Umfeld müssen sich darüber hinaus auch KPIs einem ständigen Feedback unterwerfen. Diese kontinuierliche Rückkoppelung modifiziert die zunächst gewählten KPIs fortlaufend. Über die Zeit und mit steigender Reife des CI/CD-Service treten etablierte Metriken in den Hintergrund und andere – meist „höherwertige“, komplexere – gewinnen an Bedeutung. Das ist normal und kein Grund zur Panik.
KPIs dienen dann häufig dazu, Bewertungen und/oder Boni von Mitarbeitern zu steuern. Über lange Zeit kamen diese Vorgaben aus den oberen Hierarchieebenen. Immer öfter erarbeiten aber auch DevOps Teams gemeinsam KPIs, die dann einem ständigen Feedback unterliegen, so dass sie sich im laufenden Betrieb auch ändern können.
Das oberste Mantra für DevOps ist ‚Messen‘, d. h. es wird eine Vielzahl von Metriken erfasst und mit Hilfe von geeigneten Werkzeugen ausgewertet.
Für CI/CD als Service bedeutet das, eine Vielzahl an Metriken von einer Vielzahl an Systemen zu erfassen:
Vorsystemen wie z. B. SCM, LDAP, Mail, HTTP Proxy, Ticketing
Infrastrukturen wie Build Server, Agents, Test-Maschinen
Performance-Messwerte der Anwendung in Produktion
Sind alle diese Messwerte erfasst, geht es an die Arbeit…
SLA-Definitionen müssen auf die gemessenen Daten abgebildet werden: Bedeutet „verfügbar“, ob das betreffende System überhaupt verfügbar ist, oder dass es z.B. innerhalb einer definierten maximalen Zeit auf einen definierten Request antwortet? Das entspricht der Erarbeitung einer „Definition of Done“ (DoD) aus dem agilen Umfeld.
Auch für KPIs gilt es eine Entsprechung in den erhobenen Daten zu finden. Ein „Indicator“ ist kein absoluter Messwert. Ein Indicator ist eine Aufforderung, genauer hinzuschauen. Gibt es Abweichungen (meist auf der Zeitachse), muss man sich immer den Grund anschauen und nicht einfach den Wert akzeptieren.
In größeren Unternehmen gibt es die Tendenz, aus KPIs direkt Beurteilungen oder variable Gehaltsbestandteile (Boni) abzuleiten. Das ist häufig zu kurz gesprungen. Viele der Werte aus der Übersicht unten klingen je nach Blickwinkel zunächst plausibel, offenbaren aber bei näherem Hinsehen und unter Einbeziehung der menschlichen Natur einige Schwächen.
Beispiele:
Lines of Code pro Entwickler pro Tag – kam so tatsächlich von einer hochbezahlten Beratungsfirma und wurde zum Glück wegen offensichtlichen Unfugs verworfen.
Kostenverteilung nach Nutzung – Möchte ich einen Service etablieren, sollte ich nicht für die Nutzung zahlen lassen sondern eher die Nichtnutzung strafen, also etwa die Kosten für den Service allen in Rechnung stellen. Wer den Service nicht nutzt, gerät in Rechtfertigungsprobleme.
Dauer eines Builds – Die Dauer eines Builds wird von zu vielen unterschiedlichen Faktoren beeinflusst, wie z. B. Anzahl und Gründlichkeit von Tests, Parallelisierung innerhalb des Builds, Verfügbarkeit von Ressourcen usw.
Anzahl der Fehler einer Komponente in einer Iteration – Kein guter Indikator, weil er zu stark von den Individuen und den Umgebungsbedingung abhängig ist. Eventuell aber gut, um den Prozess zu verbessern wie z. B. Commits / Pushes nur dann, wenn lokal alle Tests durchlaufen wurden.
Anzahl Tests – Die Anzahl der Tests lässt sich leicht steigern, ohne dass dadurch die Qualität steigt.
Testabdeckung – Taugt als alleiniges Kriterium nur sehr bedingt. Wichtiger ist, dass der Wert kontinuierlich besser wird. Wichtig ist aber auch eine gemeinsame Definition dessen, was wie getestet werden soll.
Durchlaufzeit eines Tickets – Führt in der Regel dazu, dass Tickets gnadenlos geschlossen werden, ohne dass das eigentliche Problem behoben ist. Besser ist eine Kombination aus Messwerten, die sowohl die Schritte innerhalb des Wokflow inklusive Schleifen als auch andere Faktoren berücksichtigen.
Gefundene Fehler in Produktion – Hier ist eine Analyse besser, warum Fehler erst in Produktion gefunden werden
Abgeschaltete Tests / Anzahl der Tests pro Release – Bei Auffälligkeiten ist es ein guter Anlass, sich die Ursachen anzuschauen: Wird der Code gerade refactored, werden neue Third-Party-Libraries verwendet, so dass einige der existierenden Tests nicht ohne weiteres anzupassen sind? Auch hier ist aber eher der Vergleich zum vorigen Release interessant.
Architectural Index / Maintainability Index (z. B. aus SonarQube) – Ein sehr guter Indikator für die Code-Qualität, aber nicht für andere Aspekte der Anwendung.
Anzahl bekannter Sicherheitslücken pro Release pro Anwendung, aufgeschlüsselt / gewichtet nach Severity. Realistisch sollte man hier nur die Verbesserung messen und nicht den absoluten Wert.
Auslastung der Infrastruktur – Je nach zur Verfügung stehenden Ressourcen macht es generell Sinn, die Auslastung zu messen. Allerdings hängt die Interpretation von vielen Details ab, z. B. muss ich eine statische Infrastruktur mit Bare Metal oder VMs in dieser Hinsicht anders bewerten als einen Kubernetes-Cluster.
Die folgenden Abbildungen zeigen Beispiele, die mit einer Kombination aus Prometheus und Grafana entstanden sind. Üblich in diesem Kontext ist auch die Nutzung des ELK-Stacks (Elasticsearch, Logstash, Kibana).
CI (Continuous Integration) bezeichnet das Übersetzen und Testen von Software nach jedem Commit / Push. Das Endresultat ist in der Regel ein binäres Artefakt, das in einem Repository zur weiteren Verwendung abgelegt wird.
CD (Continuous Delivery / Deployment), als Superset von CI, testet das Zusammenspiel der erzeugten Artefakte mit dem Ziel, Produktionsreife zu erlangen. Continuous Delivery stellt die entsprechenden binären Artefakte für das Deployment bereit, bei Continuous Deployment werden sie – entsprechend erfolgreiche Tests vorausgesetzt – automatisch produktiv gesetzt.
SLAs (Service Level Agreements) gibt es in der einen oder anderen Form bereits sehr lange aus dem Bereich Hosting. Sie bezeichnen zugesicherte Merkmale einer Leistung, auf die sich Auftraggeber und Auftragnehmer vor Erbringung der Leistung geeinigt haben. Sie haben Ähnlichkeiten mit Vertragsbedingungen oder zugesicherten technischen Eigenschaften.
KPIs (Key Performance Indicators) sind – allgemein gesprochen – Messwerte für die Erreichung von Zielen. Sie sollen Auskunft darüber geben, wie gut oder schlecht die gemessenen Werte im Vergleich zu vorgegebenen Zielen oder zu Durchschnittswerten vergleichbarer Unternehmen liegen.
DevOps (Development + Operations) bezeichnet eine Vorgehensweise aus dem agilen Umfeld, die Entwickler, Tester und Infrastruktur-Betreiber in einem Team zusammenfasst („You build it, your run it, you fix it“).
Sie haben Fragen oder möchten ein Angebot?
Wir rufen Sie gerne zurück!
Die Grafik aus Abbildung 1 ist gut geeignet für einen ersten Überblick, es gilt aber verschiedene Dinge zu hinterfragen bevor daraus KPIs ableitbar sind:
Sind die Builds homogen, d. h. machen alle Builds strukturell dasselbe oder gibt es eine bunte Mischung aus Microservices, J2EE und C#?
Wie ist das Delta zu früheren Zeitpunkten? Was ist der Erwartungswert von Seiten der Entwickler?
Auch die Grafik in Abbildung 2 eignet sich gut für einen ersten Überblick, die Ergebnisse sind aber ohne Kenntnis der Zusammenhänge nicht aussagekräftig:
Wird testgetrieben gearbeitet? Je nach Vorgabe ändert sich die Erwartungshaltung, welcher Anteil der Builds erfolgreich sein soll.
Was sind die Ursachen für fehlgeschlagene Builds? Infrastruktur- oder Programm-Probleme?
Die Builds pro Tag wie in Abbildung 3 zu sehen, bieten einen guten Einstieg für den täglichen Kontrollblick des Service-Betreibers.
Eine plötzliche Häufung von fehlgeschlagenen Builds gibt Anlass für weitere Nachforschungen.
Bleibt das Verhältnis zwischen erfolgreichen, instabilen und gescheiterten Builds einigermaßen konstant, läuft der Service im Wesentlichen rund.
Die Executor Usage pro Stunde aus Abbildung 4 bietet eine wichtige Auswertung, wobei aber auch hier der Kontext zu beachten ist:
Habe ich von einer bestimmten Sorte Exekutoren eventuell nur eine beschränkte Anzahl? Das sollte ich separat messen.
Habe ich ein Limit auf der maximalen Anzahl von Exekutoren z. B. auf Grund der Infrastruktur ? Auch das sollte ich separat messen.
Normalerweise ergibt sich bei CI eine typische Verteilung zwischen zeitgesteuerten Builds und Push- / Commit-gesteuerten Builds. Hierbei sollte man darauf achten, dass es möglichst keine Überschneidungen gibt. Die Builds aus dem Tagesgeschäft häufen sich meist vor der Mittagspause und vor dem Feierabend, also sollten zeitgesteuerte Builds in den frühen Morgen- oder späten Abendstunden stattfinden.
Queued Builds wie in Abbildung 5 zu sehen, sind ein Zeichen dafür, dass nicht genug Exekutoren zur Verfügung stehen.
In diesem Fall ist es ein Nightly Build, der viele Komponenten baut. Nachts dürfte das niemanden stören, aber am Tage wären wertvolle Ressourcen blockiert.
Queue Peaks können auch dadurch entstehen, dass alle Master gleichzeitig auf den Agent Pool zugreifen wollen.
Eine weitere Ursache kann sein, dass von einer bestimmten Sorte Agents nicht genügend viele vorhanden sind.
Worin besteht denn aber das eigentliche Ziel von CI/CD? Hält man sich diese Frage vor Augen, so lautet die Antwort in der Regel, Software in guter Qualität und hoher Geschwindigkeit zu produzieren. Zu guter Qualität gehören z. B. Wartbarkeit, Performance, Ausschluss von bekannten, kritischen Sicherheitslücken, Einhaltung von Standards aus dem Umfeld Governance, Risk und Compliance.
Für jeden einzelnen dieser Begriffe müssen sich alle Beteiligten – ob Betreiber, Nutzer, Service-Sponsoren oder andere – im Vorfeld auf eine gemeinsame Sicht verständigen und im Zweifel im Laufe des Projekts diese Sicht anpassen.
Um Software unter dieser Prämisse entwickeln zu können, braucht es das Zusammenspiel mehrerer Tools:
Ticketing (z.B. Jira)
Build (z. B. Jenkins)
Code-Analyse und Test-Auswertung (z. B. SonarQube)
Schwachstellenanalyse (z.B. Nexus Lifecycle, Nessus)
Unit Tests, Integration Tests, User Acceptance Tests, Performance Tests, Regressions-Tests
Application Performance Monitoring
Als Teile eines zentralen CI/CD Service liefern alle diese Systeme Messwerte, die für KPIs und die Kontrolle von SLAs genutzt werden können.
Welche dieser Messwerte tatsächlich relevant sind, hängt von vielen spezifischen Details ab. Meist ist es sinnvoll, mit einer Handvoll einfacher Werte zu starten und diese dann weiter zu verfeinern, wenn man die ersten Auswertungen mit echten Daten gesehen hat. Wichtig ist auch festzulegen, was man messen möchte
Es gibt nicht den einen Satz von KPIs, der auf jedes beliebige Setup passt. Vielmehr ist es so, dass je nach Kunde, verwendeten Tools und verwendeter Technologie spezifische KPIs ermittelt werden müssen. Am besten ist es, mit einigen einfachen KPIs zu beginnen und sie mit steigender Erfahrung so zu modifizieren, dass sie zum Einsatzzweck passen.
Aus Sicht des Business gibt es zwei zentrale KPIs:
1. „Idea to Production“ oder auch „Time to Market“ – die Zeit zwischen der Formulierung einer Idee als Ticket und dem Going-Live des Features. Hier fließen mehrere Faktoren ein:
Wie präzise die Idee im Ticket festgehalten wurde (Beschreibung, Akzeptanzkriterien)
„Dicke“ des Tickets (kleine Änderung / Ergänzung vs. Wechsel der Architektur)
Priorisierung / Auslastung der Entwickler
Geschwindigkeit der CD-Strecke
2. „Hotfix deployment“ oder auch „MTTR (Mean Time To Repair)/ MTTF (Mean Time To Fix)“ – die Zeit zwischen der (Analyse eines Problems und der) Erstellung eines Hotfixes und dem Going Live. Auch hier gibt es mehrere Faktoren:
Qualität und Umfang der vorhergegangenen Analyse
Geschwindigkeit der CD-Strecke vs. Vollständigkeit der Tests
Erfahrungsgemäß ist es sehr sinnvoll, sich bereits frühzeitig Gedanken um das Hotfix Deployment zu machen (Auf welche Tests verzichte ich? Spezielle Pipeline oder spezielle Parameter der „normalen“ Pipeline?), damit man im Ernstfall nicht in Panik verfällt und Fehler macht.
Weitere Messwerte, die für den Betrieb eines zentralen Service relevant sein können:
Change Success Rate
Die Anzahl erfolgreicher Builds / Deployments im Verhältnis zur Gesamtzahl aller Builds / Deployments. Ist die Change Success Rate zu gering, sollte man analysieren, wo in der Pipeline der Fehler liegt. Können Sourcen nicht kompiliert werden, liegt die Schuld in der Regel beim Committer. Scheitert die Pipeline beim integrativen Testen, braucht man eventuell bessere Mocks, um solche Fehler bereits früher abzufangen. Scheitert die Pipeline an Quality Gates, sind deren Daten evtl. nicht in der IDE des Entwicklers verfügbar oder er weiß nicht, was er mit der vorhandenen Information anfangen soll.
Deployments pro Monat pro Pipeline / Anwendung
Ermöglicht die Vergleichbarkeit unterschiedlicher Anwendungen und Technologien, sofern die Rahmenbedingungen einigermaßen gleich ausfallen.
„Lead time for change“
Wie lange braucht ein Commit bis er PROD erreicht (Minimum, Maximum, Average)? Ist verwandt mit 1. und 2.
„Batch size“
Wieviele Story Points pro Deployment (Minimum, Maximum, Average)? Das hängt fallweise mit der Velocity aus Scrum zusammen.
Code-Qualität
Auswertung von Testabdeckung, Maintainability Index, Architectural Index usw., in der Regel als Delta über die Zeit oder gegen gesetzte Standards. Abgeleitete Indices wie z. B. Maintainability oder Architectural Index sind weniger anfällig gegenüber Manipulationen als die einfachen Metriken wie etwa Testabdeckung. Auf jeden Fall muss zuerst das Messverfahren abgestimmt werden – sollen z. B. Getter/Setter getestet werden, wie sieht es aus mit generiertem Code?
Kritische Security-Bugs
Gesamtzahl bzw. Anzahl in neuem / geändertem Code eines bestimmten Levels. Hier kann auch die Unternehmenssicherheit bestimmte einzelne Fehler besonders herausheben.
Performance-Abweichungen
Sind immer mit Vorsicht zu genießen, sollten aber auf jeden Fall beobachtet werden. Gibt es unerwartete Abweichungen zu früheren Messwerten, sollte auf jeden Fall die Ursache ermittelt werden.
Verfügbarkeit
Zu wie viel Prozent steht der Service zu den vorher vereinbarten Zeiten zur Verfügung (7 x 24 vs. 5 x 9)? Gibt es vorher definierte Wartungszeiträume auf Seiten der Infrastruktur oder des Service?
Fehlerhafte vs. erfolgreiche Aufrufe
Wann liefert der Service Fehler? Das kann z.B. bei Session Timeout oder Deep Links passieren. Bei manchen Anwendungen funktionieren Deep Links nicht gut, dann gilt es andere Wege zu finden, um die gewünschte Funktionalität bereitzustellen.
Queue Wait Time (Minimum, Maximum, Average)
Wie lange muss ein Job durchschnittlich / maximal warten, bis er „dran“ ist? Wenn Wartezeiten entstehen, was ist die Ursache? Gibt es generell zu wenige Agents, gibt es zu wenige Agents einer bestimmten Sorte, starten alle Nightly Builds zum selben Zeitpunkt?
Builds/Deployments pro Tag/Woche
Tatsächliche, sinnvolle Werte sind abhängig von der Applikation und der Art des Deployments. Auch hier ist – je nach Ziel – hauptsächlich das Delta über die Zeit interessant; in der Regel ist das Ziel, mehr Deployments pro Zeiteinheit zu schaffen.
Auslastungsgrad der Build Agents
Da unterscheiden sich Setups mit statischen Maschinen grundsätzlich von dynamischen Infrastrukturen wie z. B. Docker / OpenShift / Kubernetes / AWS / Azure / usw. Für statische Maschinen strebe ich eine möglichst gleichverteilte Auslastung an. Beim Arbeiten mit dynamisch bereitgestellter Infrastruktur geht es eher um Limitierung bzw. Kappung der Kosten.
Prozessbezogene KPIs sind Indikatoren dafür, wie gut Prozesse gelebt werden:
WTFs pro Tag/Woche
Wie oft erlebt das Team WTF ( „What the fuck“ ) – Momente? Wie oft tauchen Dinge auf, mit denen vorher niemand gerechnet hatte?
Impediments pro Sprint
Wie viele Impediments kommen pro Sprint ans Licht?
Impediment Removement Time
Wie lange dauert es, bis ein Impediment beseitigt wird?
Nichtverfügbarkeit des Product Owners
Ein häufiges Problem, wenn Agiles Arbeiten eingeführt wird: Projektmanager werden zu Product Ownern umgewidmet, aber ansonsten ändert sich nur wenig. Das führt automatisch dazu, dass sie der Aufgabe eines Product Owners nicht gerecht werden können – weder aus Sicht des Unternehmens noch aus Sicht des / der Teams.
SLAs sollte man vor jeder Inbetriebnahme eines Services zwischen Betreiber und Nutzer vereinbaren, damit es später keine Missverständnisse wegen völlig unterschiedlicher Erwartungen gibt.
KPIs sind Indikatoren, bei deren Veränderung in der Regel genaueres Hinschauen erforderlich ist. Sie eignen sich nur schlecht 1:1 zur Messung von Qualität, meist ist die Differenz zu einem vorigen Zeitpunkt der bessere Ansatz. Sie sollten regelmäßig reevaluiert und überarbeitet werden.
Es gibt unterschiedliche Arten von KPIs, je nach Blickwinkel; jeder dieser Blickwinkel hat seine Berechtigung. Häufig besteht die Gefahr, sich zu sehr auf die rein technischen Messgrößen einzulassen. Erfahrungsgemäß bringen aber gerade die Anwendungs- und Prozess-KPIs am meisten Erkenntnisgewinn, obwohl ihre Ermittlung mit mehr Aufwand verbunden ist. Die technischen KPIs helfen eher bei der Diagnose und Beseitigung von Schwächen.
Atlassian Jira hat wohl den höchsten Marktanteil unter den Projektmanagement-Werkzeugen, die bei Firmen und Organisationen, die Software entwickeln im Einsatz sind. Dabei geht die Verwendung immer wieder über Softwareentwicklungsprojekte hinaus und das Tool wird auch für die Verwaltung von Projekten eingesetzt, die nichts mit Software zu tun haben. Das Werkzeug stellt nicht selten das Zentrum der täglichen Arbeitsorganisation dar und ist damit enorm wichtig. Wie die meisten Projektmanagement-Tools ist Atlassian Jira jedoch für einzelne Projekte optimiert. Oft hängen Aufgaben verschiedener Teams aber voneinander ab.
Atlassian Jira organisiert die Verwaltung von Aufgaben in sogenannten Projekten, egal ob es um echte Projekte geht oder nur um die Zusammenfassung der Arbeit eines Teams. Wie die meisten Projektmanagement-Werkzeuge ist die Anwendung für die Planung und das Management einzelner Projekte optimiert.
Im Alltag der Softwareentwicklung arbeiten Projekte oder Teams allerdings meist nicht isoliert,so erleben es unsere ASERVO Consultants vor Ort bei Kunden immer wieder. Oft hängen Aufgaben verschiedener Teams voneinander ab oder sie arbeiten sogar an einem gemeinsamen Produkt bzw. Ergebnis im Rahmen eines Produktportfolios zusammen. Beispielsweise könnte pro Team eine Softwarekomponente bearbeitet werden, die in einem Automodell mit anderen Softwarekomponenten zum Einsatz kommt und auch mit diesen kommuniziert. Dann gibt es womöglich gemeinsame Releasetermine und eine Multiprojekt- bzw. Portfolioplanung wird notwendig. Auch auf Ebene der Ressourcenplanung, was die Anzahl und Kompetenzen verfügbarer Mitarbeiter angeht, ist eine Multiprojektplanung absolut notwendig, um deren gesamte Arbeitslast in der Planung zu berücksichtigen.
Im Folgenden geht es um die Möglichkeiten, die Atlassian Jira alleine und erweitert um AddOns für das Multiprojektmanagement bietet.
Der Abgleich von Aufgaben zwischen Projekten auf mündlicher Basis, z. B. in regelmäßigen teamübergreifenden Meetings gehört zum empfehlenswerten, natürlichen Weg und Prozedere in Arbeitsalltag. Dazu bietet das Werkzeug als Ergänzung stand-alone schon einige interessante Möglichkeiten der Multiprojektverwaltung von Aufgaben.
Multiprojekt- oder Portfolio Jira Boards
Mit Scrum- (siehe Abb. 1 und Abb. 2) bzw. Kanban-Boards von Jira Software hat man die Möglichkeit die Abarbeitung auf graphischer Ebene zu verfolgen und zu verändern. Dabei ist die Menge der Aufgaben, die in diesem Board dargestellt werden, über eine Abfrage frei definierbar. Das können auch mehrere Projekte sein, wie in Abb. 1 bzw. Abb. 2 dargestellt (Projekte PJA und PJB). Auf diese Weise kann man sich sehr einfach eine Multiprojekt- oder Portfolio-Sicht auf die Abarbeitung verschaffen.
Dokumentation zu agilen Jira Boards
Abb. 1: Multi Project Scrum Backlog mit teamübergreifendem Epic „Enhanced Entertainment“ und Stories aus verschiedenen Projekten (Projekte PJA und PJB)
Abb. 2: Multi Project Scrum Board mit Stories aus verschiedenen Projekten (Projekte PJA und PJB)
Ebenso ist es möglich projektübergreifende Auswertungen – sogenannte Filter – zu definieren, um eine Liste von Aufgaben zu bekommen.
Neben der direkten Nutzung der Liste im Werkzeug, wie in Abb. 3 dargestellt, kann diese auch in eine CSV Datei exportiert werden. Darüber hinaus kann die Liste die Aufgaben definieren, die in einem Report, oder in einer anderen graphischen Auswertung genutzt werden.
Abb. 3: Filter mit Ergebnisliste über drei Projekte (Projekte POM, PJA, PJB)
Ohne weiteres AddOn ist es bereits gut möglich, den Stand der Abarbeitung projektübergreifend zu verfolgen. Es gibt aber praktisch kaum Möglichkeiten, die Aufgaben oder Ressourcen projektübergreifend vorab zu planen. Außerdem bestehen Einschränkungen. So sind keine projektübergreifenden Releaseversionen möglich. Dafür sind weitere Werkzeuge notwendig, entweder außerhalb von Jira oder mittels AddOn.
Ohne direkte Integration erfolgt ein Datenaustausch mit externen Werkzeugen üblicherweise über den Export und Import von CSV Dateien. Die gewünschte Menge von Aufgaben und Feldern kann über Filter definiert hinterlegt werden. Aber Vorsicht! Ein wiederholter Import, der existierende Aufgaben aktualisiert, ist nur über die CSV Importfunktion im Administrator-Menü möglich. Die Einstellungen des CSV Imports (insbesondere das Mapping der Felder) werden zur Wiederverwendung am besten in einer Datei gespeichert.
Der einfachste Fall eines externen Werkzeugs wäre die weitere Bearbeitung mit MS Excel. Der Austausch der Daten erfolgt aber nicht sofort bei jeder Änderung, sondern erst durch einen Export. Das bedeutet, die Aktualität der Aufgaben im externen Werkzeug ist nicht jederzeit gewährleistet.
Nach unserer Erfahrung ist dieses Vorgehen kaum praxistauglich, der Datenaustausch wird aufgrund der großen Mühe immer seltener stattfinden, so dass die Daten nicht aktuell und zuverlässig sind. Ausnahmen bilden einfache Auswertungen mit einem Export nach MS Excel und der weiteren Bearbeitung dort. Dabei gilt es zu beachten, dass alle Schätzwerte in Sekunden exportiert werden, auch wenn sie in Jira z. B. in Tagen oder Stunden dargestellt werden.
Portfolio for Jira Beschreibung
Ein Jira AddOn namens „Portfolio for Jira“ bietet Atlassian selbst zur Multiprojekt- bzw. Portfolioplanung und Fortschrittsverfolgung an. Portfolio for Jira ist insbesondere für agile Vorgehensweisen ausgelegt. Dabei werden immer automatisch die aktuellen Jira Daten verwendet. Änderungen können problemlos in Portfolio selbst ausprobiert werden, bis sie bewusst in Jira zurückgeschrieben werden.
Das AddOn bietet eine eigene Projekt- und teamübergreifende Sicht auch mit graphischer Darstellung. Dieser Überblick kann auf verschiedener hierarchischer Ebene erfolgen wie in Abb. 4 für Stories und in Abb. 5 für Epics zu sehen. Die graphische Planung erfolgt inklusive Projekt-Releases wie „PJA V1“ und projektübergreifenden Releases wie „Common Release 1“ (projektübergreifende Releases sind nur mit Portfolio for Jira möglich!). Im Beispiel wurden alle Stories von Portfolio for Jira automatisch dem „Common Release 1“ zugeordnet, da die Berechnung zeigte, dass sie bis zum fixen Releasetermin alle abgearbeitet werden können.
Abb. 4: Portfolio for Jira Story Plan für drei Projekte (Projekte POM, PJA, PJB)
Vorgänge von POM sind in dieser Story Ansicht nicht zu sehen, da POM nur Epics hat. Es gibt aber auch eine eigene Epic Ansicht:
Abb. 5: Portfolio for Jira Epic Plan für 3 Projekte (Projekte POM, PJA, PJB)
Die Features von Portfolio for Jira sind vor allem auf projektübergreifender Ebene für das Multiprojekt- oder Portfoliomanagement, aber auch bei der Arbeit in oder unter den Projekten für die Projektleiter und Anforderungsmanager nutzbar, wie im Folgenden aufgezeigt wird.
Projektübergreifende Features
Abb. 6: Zusammensetzung eines Teams nach Skills und Kapazitäten
Projektspezifische Features
Im Praxiseinsatz sehen wir die Stärken des AddOns in der umfangreichen Erweiterung der Multiprojekt- bzw. Portfolioplanung (auch Ressourcenplanung), die hier geboten wird und der direkten Integration sowie optimaler Datensynchronisation mit Jira. Extra Pluspunkte verdienen aus unserer Sicht auch die graphische Darstellungen der Planung und die Handhabung übergreifender Releases.
Als eine Einschränkung empfinden wir die nicht ausgereiften Optionen, Anpassungen oder eine eigene Gestaltung vorzunehmen. So lässt sich beispielsweise keine eigene Berechnung einfügen oder Graphiken sind nur bedingt zu beeinflussen. Zwar gibt es seit kurzem eine offizielle API zur eigenen Erweiterung, im Umfang kann sich Portfolio for Jira jedoch (noch) nicht mit den marktführenden Werkzeugen zur Planung eines Portfolios vergleichen.
Hersteller: Teamlead
Erweiterung von Portfolio for Jira um wenige Features
Hersteller: ALM Works
Eigene hierarchische Strukturierung von Jira Vorgängen, projektübergreifende Betrachtung
Hersteller: SoftwarePlant
Gantt Chart Planung mit Abhängigkeiten und etwas Portfolio Funktionalität. Entspricht einem klassischen Projektmanagement-Werkzeug mit Berücksichtigung agiler Vorgehensweisen.
Hersteller: SoftwarePlant
Projekt Portfolio Management, Ressourcen Management, Risiko Management mit Gantt Charts.
Agilefant Business Execution for Jira
Hersteller: Agilefant Ltd
Verknüpft High Level Initiativen mit Jira Epics und Aufgaben. Erlaubt damit die Planung und Verfolgung des Fortschritts aus Business-Sicht.
Wenn es um den Einsatz von Open-Source-Komponenten bei der Herstellung moderne Software geht, lautet die Quintessenz eindeutig: Genaue Informationen sind unerlässlich. Werkzeuge, die die notwendige Genauigkeit vermissen lassen, sind für die Anforderungen der modernen Softwareentwicklung nicht geeignet. Ungenaue und/oder unvollständige Daten sorgen bei Unternehmen dafür, dass sie sich mit Schwachstellen, Lizenzfragen und anderen Themen, die die Qualität betreffen, beschäftigen müssen. Was wiederum zu höheren Kosten und geringere Innovation führt.
Mehr über den erweiterten binären Fingerabdruck und warum Präzision das A und O im Umgang mit Datenintelligenz ist, erfahren Sie in diesem White Paper von Sonatype: “ Open-Source-Richtlinien sicher durchsetzen“.
Erfahren Sie mehr über Ihre genutzten Applikationen. Mit einem kostenfreien Application Health Check bietet Sonatype die Möglichkeit, in einer Stückliste Ihren Bestand an Open Source und proprietären Komponenten erfassen zu lassen. Scannen Sie doch mal eine Ihrer Applikationen – das Ergebnis dürfte möglicherweise für Überraschungen sorgen.
6 Gründe für den Application Health Check:
ASERVO Software GmbH
Konrad-Zuse-Platz 8
81829 München // Deutschland
Telefon: +49 89 7167182-40
Fax: +49 89 7167182-55
E-Mail: kontakt@aservo.com
Copyright © 2023. ASERVO SOFTWARE GMBH