From 6c25046dcc4239baf4b0e08be0bfc4fd6b1bf6e7 Mon Sep 17 00:00:00 2001 From: Manuel Plonski Date: Fri, 20 Mar 2020 11:00:42 +0100 Subject: [PATCH] added mass --- chapters/grund.tex | 2 +- chapters/mass.tex | 318 +++++++++++++++++++++++++++++++++++++++++ pandoc/mass.tex | 319 ++++++++++++++++++++++++++++++++++++++++++ pandoc/maßnahmen.docx | Bin 0 -> 18729 bytes thesis.tex | 1 + 5 files changed, 639 insertions(+), 1 deletion(-) create mode 100644 chapters/mass.tex create mode 100644 pandoc/mass.tex create mode 100644 pandoc/maßnahmen.docx diff --git a/chapters/grund.tex b/chapters/grund.tex index aa72150..b62b3ed 100644 --- a/chapters/grund.tex +++ b/chapters/grund.tex @@ -146,7 +146,7 @@ GitLab-CI}. ~ \subsection*{Continuous Delivery / Continuous Deployment} - +\todo{Mehr zu CDE und CD schreiben} Die Abkürzung CD kann sowohl für Continuous Delivery als auch für Continuous Deployment stehen und bezeichnen die weitere Automatisierung in der Pipeline und stehen für das Ausmaß der Automatisierung. diff --git a/chapters/mass.tex b/chapters/mass.tex new file mode 100644 index 0000000..148b979 --- /dev/null +++ b/chapters/mass.tex @@ -0,0 +1,318 @@ +\chapter{Empfehlungen für die Planung und Implementierung von CI/CD} + +Im Folgenden werden Empfehlungen aufgezeigt, welche das Auftreten der +oben geschilderten Probleme verhindern können. + +Die dargestellten Maßnahmen beziehen auf die Planung und Implementierung +eines CI/CD Systems, die Dokumentation und auch konkrete technische +Maßnahmen. + +\section{Planung eines CI/CD Systems} + +Die Einführung eines CI/CD Systems beinhaltet nicht nur eine einfache +Automatisierung bestehender Prozesse, es handelt sich um eine komplexe +Automatisierung mit einem hohen Grad an Integration. Aus diesem Grund +stellt die sorgfältige Planung des Systems die Basis für eine +erfolgreiche Einführung von CI/CD. Hierbei müssen Fragen zu den +Anforderungen und dem Design beantwortet werden. + +\subsection{Frage nach dem Umfang der Automatisierung und den Objekten der Automatisierung}\label{mas:m1.1} + +Entsprechend des individuell vorliegenden Entwicklungsprozess werden die +Teilprozesse und ihre Abfolge definiert, welche das CI/CD System +abbilden soll. + +Typische Prozesse hierfür sind der + +\begin{description} + \item[Build-Prozess] + Compile, ggf, Multimudulcompiling und Containerbau + \item[Testprozess] + Modul, Integrations- und Systemtest + \item[Analyseprozess] + statisch oder dynamische Codeanalyse, Dependencyanalyse, Lizenzscan, Containersicherheitsanalyse + \item[Delivery oder Deployment] +\end{description} + +Die detaillierte Definition der \textbf{Inputschnittstelle} für das +CI/CD System (z.B. xxxx ) muss ebenfalls erstellt werden. Dazu gehört +das Format, die Art, der Ort (Übergabeordner oder Repository) und der +Kontext (z.B. Release-Erstellung oder Snapshot-Version) unter dem das +CI/CD System aufgerufen wird. + +Zu diesem Zeitpunkt ist es notwendig, die \textbf{Rahmenbedingungen} für +das CI/CD -- System festzulegen. Dazu gehören alle Arten von +unternehmens- oder projektspezifischen Konventionen und Richtlinien +beispielsweise zu Security, Code oder Systemarchitektur. Auch die +vorliegende Hardware könnte als Rahmenbedingung vorgegeben sein. + +Für jeden \textbf{Prozessschritt} muss eine \textbf{detaillierte +funktionale Anforderung} erfolgen, beispielsweise könnte für den +Analyseprozess die Arten von Checks festgelegt werden, wie der Check auf +bestimmte Designpatterns, Variablennamen, der Check gegen vorhandene +Regellisten.\\ +Für den Prozessschritt des Delivery gilt es zu entscheiden, ob die +Softwareartefakte in einem einfachen Dateisystem bereitgestellt werden +oder in einem Artefakt-Managementsystem. + +Wird das CI/CD-System für ein bereits sich im +Softwareentwicklungsprozess vorliegendes Projekt eingeführt, muss eine +\textbf{Migration} geplant werden. Hierbei müssen alle zu migrierende +Artefakte zu den entsprechenden Prozessschritten bestimmt und +beschrieben werden. + +\subsection{Definition der Zielumgebung für Artefakte oder Software}\label{mas:m1.2} + +Eine relevante Vorgabe in der Planung eines CI/CD-Systems ist die +Festlegung der Zielumgebung für Artefakte (für Delivery) und im Falle +des Deployments die Zielumgebung für die Software. + +Die Laufzeitumgebung der produktiven Software variiert in Abhängigkeit +des Use Case: Beispielsweise kann es sich um ein Autoradio, eine +Cloudumgebung, eine App, eine Website, einen Großrechner oder einen +Cluster handeln, welcher lokal vorliegt oder über das Internet +zugänglich ist. + +\subsection{Design des CI/CD Systems}\label{mas:m1.3} + +\subsubsection{Toolauswahl}\label{mas:m1.3.1} + +In diesem Planungsschritt gilt es, aus den Vorgaben über den Umfang, +Inhalt und die Zielumgebung des Use Case die \textbf{Wahl der +Toolkonfiguration} und auch die Entscheidung zwischen +\textbf{individueller Lösung} oder einer \textbf{All-in-One Lösung} zu +treffen. + +Zunächst muss eine Toolübersicht über Einzel- als auch All-in-One Tools, +mit einer genauen Analyse über Funktionalität und Schnittstellen +erstellt werden. + +Ein systematischer Abgleich der Anforderungen aus \ref{mas:m1.1} und \ref{mas:m1.2} gegen +die Tooleigenschaften liefert eine potenzielle Toolauswahl, welche gegen +die Detailanforderungen und Rahmenbedingungen überprüft wird. + +Dabei geht es um die Bestimmung der grundlegenden Realisierbarkeit und +auch um den Änderungsaufwand im Falle von Konflikten. + +In die Entscheidung der Konfiguration fließen neben der funktionalen +Betrachtung auch der Entwicklungsaufwand für Einführung und Migration, +Lizenzkosten, Hardwarekosten und Training ein. Weitere betriebsbedingte +Aufwände beispielsweise für das Integrationsteam gehören auch zu dieser +Betrachtung. + +Für den Fall, dass Module zu einer individuellen Lösung konfiguriert +werden, muss eine Integrationsanalyse durchgeführt werden. + +\subsubsection{Design im Toolkontext}\label{mas:m1.3.2} + +Nach der Toolentscheidung erfolgt die Detailplanung des Designs für die +getroffene Toolauswahl. + +Hierzu gehört das Design der Toolintegration, die Migration, aber auch +das Design von möglichen technischen Maßnahmen wie in 4./3xx +dargestellt. + +\subsection{Festlegung der Hardware für das CI/CD System}\label{mas:m1.4} + +Die Art der Anfragen und die Häufigkeit der Anfragen an das CI/CD System +ist ebenfalls vom Use Case vorgegeben und bestimmt die Ausstattung der +Hardware mit CPU und RAM. + +So hat eine pure Webanwendung mit einer CI Anfrage pro Stunde keine +besondere Anforderung an die eine Hardware, während ein CI-System, +welches 25 CI Anfragen in der Stunde erhält und für die Entwicklung von +CPU-oder sogar GPU intensiven Anwendungen gedacht ist, eine viel +stärkere Hardware mit höheren Taktraten und Kernen benötigt. + +Solche hardwareintensiven Anwendungen finden sich häufig unter Machine +Learning Anwendungen und auch bei Quarkus- Native-Compiles. + +Der Speicherbedarf muss ermittelt werden, entsprechend des +Speicherkonzepts und passend zu den gewählten Tools. Auch die Vorgaben +zur Spiegelung für die redundante Verwaltung der Datenserver können bei +der Konfigurationsentscheidung eine Rolle spielen, so wie Konventionen +aus dem Unternehmens- und Projektumfeld. + +\section{Dokumentation}\label{mas:m2} + +Ein CI/CD System wird zum zentralen Element des +Softwareentwicklungsprozesses. Die starke Integration und Komplexität +erfordert eine umfangreiche Dokumentation für Entwickler, als auch für +das Integrations-(xxx oben definieren) und Automatisierungsteam(xxxoben +definiern). + +Die Dokumentation stellt für den Entwickler Informationen bereit, welche +ihm Kenntnisse zu den In- und Output-Schnittstellen vermittelt. Er muss +für sein individuelles Projekt Information darüber haben, wie und welche +Schritte durchlaufen werden und wie die Inputschnittstellen diesen +Ablauf durch die Pipeline beeinflussen können. + +Das Automatisierungsteam benötigt Informationen über den CI/CD Engine, +(xxx bei der automatisierung -- vielleicht auch tools und ) eingesetzte +Tools und deren Interfaces und über die Konfiguration des aktuellen +Systems, um den Betrieb und die Wartung für das Automatisierungsteam zu +ermöglichen. + +Bei Störungen im CI/CD System kann diese Dokumentation helfen, das +System wiederherzustellen bzw. sogar extern als Workaround zu betreiben +(durch Verfassung der einzelnen CI/CD Schritte in Einzelscripten). + +\section{technische Maßnahmen}\label{mas:m3} + +\subsection{Lösungsansätze zur Umsetzung der Maßnahmen}\label{mas:m3.1} + +Bei der Einführung eines CI/CD System können mit Hilfe von technischen +Maßnahmen einige Probleme vermieden werden, welche durch Unkenntnis der +Entwickler über die Funktionsweise des Systems verursacht werden. +Zusätzlich können technische Maßnahmen auch für die Einhaltung von +Policies genutzt werden. + +Beispielsweise kann durch technische Maßnahme verhindert werden, dass +eine ungetestete Softwareversion in einer Produktionsumgebung ungewollt +verwendet wird: Mit Hilfe eines Artefakt-Archivierungssystems können +passende Einstellungen vorgenommen werden, welche gewährleisten, dass +nur getestete Softwareversionen in die Produktion übertragen werden. +\emph{(\ref{B06} B06 -- unzureichende Tests -- ungetesteter Code in Produktion)} + +Weitere Beispiele sind die Verhinderung einer ungewollten Ausführung +eines Releases \emph{(\ref{B04} B04 -- ungewolltes Aktivieren der Pipeline durch +unbewusste Nutzung des Masterbranch),} deren Umsetzung im +Anschlusskapitel an einer konkreten Systemumgebung aufgezeigt wird. + +Die ungewollte Ausführung eines unorchestrierten Containers ist ein +Problem, welches ebenfalls durch technische Maßnahmen vermieden werden +kann.(einbisschen andeuten wieexxx) + +Auch im \textbf{Speichermanagement} gibt es Möglichkeiten, den \emph{in +(\ref{B02} B02 - erschöpfte Speicherkapazität des CI/CD System)} beschriebenen +Speicherengpass zu verhindern: Durch ein \emph{geeignetes +\textbf{Lifecycle-Management}} könnten gewisse Artefakte nach einiger +Zeit gelöscht werden. + +Weitere Maßnahmen könnten die Einführung einer \textbf{Hardwarequote} um +für eine ungewollte Hardwarebeanspruchung für einzelne Nutzer +vorzubeugen. + +Das \textbf{vier-Augenprinzip} klingt zunächst nach einer +organisatorischen Maßnahme und kann für unterschiedliche Prozessschritte +als Qualitätssicherungsmaßnahme vorgesehen werden. Die technische +Komponente dieser Maßnahme wäre die Dokumentation und +Ausführungsbestätigung dieser Schritte, welche als Voraussetzung für die +Fortsetzung des spezifischen Entwicklungsprozesses implementiert wird. + +So können auch \textbf{Konflikte}, welche durch eine \textbf{parallele +Ausführung} zweier Pipelines entstehen, mit Hilfe von technischen +Vorkehrungen erkannt werden und zum Stopp der Pipeline führen. (andeuten +wie xx) + +\subsection{Beispiel für die Umsetzung von Maßnahmen zur Vermeidung +von B04 -- ungewolltes Aktivieren der Pipeline durch unbewusste Nutzung +des Masterbranch} + +Die in B04 dargestellte Problemstellung besteht nicht nur aus der +versehentlichen Nutzung des Masterbranchs als Featurebranch. Die Brisanz +entsteht durch die Folgen bei der Ausführung des Push-Kommando im CI/CD +Umfeld. Der Build-Prozess wird gestartet und endet mit dem Deployment in +der produktiven Umgebung. + +Das Szenario wird mit Hilfe einer einfachen CI/CD Umgebung dargestellt. +Sie besteht aus einer kleinen Pipeline, welche die Funktionen Build und +Deploy abdeckt. + +Das Branchpattern besteht aus einem Master-, Develop- und Featurebranch. + +\subsubsection{Anforderungen für Branchmanagement/Deployment} + +Im Folgenden werden die Anforderungen definiert, welche mit Hilfe der +CI/CD Tools oder des Versionsmanagementsystem umgesetzt werden müssen. + +Die erste Überlegung wäre, gleich zu dem Zeitpunkt, an dem der +Entwickler seine „versehentliche`` Programmiertätigkeit auf dem +Masterbranch beginnt, eingreifen zu können. An dieser Stelle sind jedoch +die Optionen in den weit verbreiteten Tools nicht gegeben und die +Möglichkeiten zu intervenieren, können erst später ansetzen. + +\textbf{Ziel ist es, dass Softwareänderungen nur über das Merge-Kommando +in den Masterbranch übertragen werden dürfen.} + +\textbf{Ein Release darf nur ausgeführt werden, nach dem die +Softwareänderung von einer autorisierten Person über das +Vieraugenprinzip eine Überprüfung durchlaufen hat.\\ +} + +Diese Richtlinien stellen somit die Grundlage, dass kein Code durch das +unbewusste Arbeiten auf dem Masterbranch in Produktion gelangt. + +Hieraus ergeben sich die folgenden Einzelanforderungen für technische +Maßnahmen: + +Verhinderung der Push-Operation für Code auf den Masterbranch + +Code muss über die Merge-Operation auf den Masterbranch übertragen +werden + +Bei der Merge-Operation auf dem Masterbranch muss der Vorgang einer +Code- und/oder Testüberprüfung durch eine weitere berechtigte Person +nach dem Vieraugenprinzip vor der Release-Ausführung bestätigt werden + +Im betrachteten Problemfall würde der Entwickler zunächst unbemerkt auf +dem Masterbranch arbeiten. Er bestätigt seine Codeänderungen und würde +versuchen, sie mit dem Push-Kommando auf das Remote-Git-Repository +hochzuladen. In diesem Augenblick erhält er jetzt eine Fehlermeldung +aufgrund des Verbotes des Push-Kommandos. Desweitern verhindert der +Prüfschritt für das Vieraugenprinzip, dass der Entwickler ein Release +durch Merge ausführen kann. + +\subsubsection{Umsetzung im Versionsmanagmenttool oder in den CI Tools} + +Es gibt eine Vielzahl von Versionsmanagementsystemen, welche in der Lage +sind, gewisse Operationen regulieren können. Zum Beispiel das Verhindern +von Push-Operationen auf gewissen Branches. + +Das Versionsmanagementsystem GitLab lässt sich so konfigurieren, dass +man auf dem Masterbranch ein Push-Kommando nicht nutzen darf. Beim +Auslösen des Push kann eine Fehlermeldung angezeigt werden. + +Entsprechend können im GitLab die Einstellungen getroffen werden, dass +nur die Merge-Operation erlaubt ist. + +Ebenfalls ist es möglich, im GitLab bei einem Merge-Kommando einen +zusätzlichen Validierungsschritt zu implementieren, welcher nur von +Usern mit einer speziellen Berechtigung bestätigt werden kann. Dieser +Schritt stellt dann die Bestätigung der Vieraugenüberprüfung und +Release-Freigabe durch die entsprechend autorisierte Person dar. + +Sind diese Möglichkeiten der Regulierung von Operationen mit dem +vorhandenen Versionshaltungstool nicht gegeben, gibt es noch die +Möglichkeit über das CI-Tool einzugreifen: + +Ein CI-Tool kann bei der Aktivierung nicht nachvollziehen, ob sich die +Anfrage aus einem Push- oder Merge-Aufruf ergeben hat. + +Aber es gibt die Möglichkeit der Überprüfung des letzten Commits aus dem +Versionshaltungstool. + +Die eine vorgegebene Berechtigung des Users kann überprüft werden, +welche z.B. mit Hilfe von digitalen Signaturen umgesetzt werden könnte. + +Diese Regel stellt sicher, dass die CI-Pipeline für ein Release +gestartet wird, wenn der letzte Commit durch eine berechtigte Person +durchgeführt wird. + +\subsubsection{Dokumentation zur Erläuterung der Funktionalität für den +Entwickler} + +Auch in der Projektdokumentation sollte auf dieses Regelwerk hingewiesen +werden. Neben der Darstellung der Branchpattern sollten die vorhandenen +Branches mit den erlaubten Operationen aufgeführt sein. + +Eine Übersicht der möglichen Fehlermeldungen mit dem Verweis der +umgesetzten technischen Maßnahmen ergänzt die Darstellung. + +Mit dieser Darstellung zur konkreten Umsetzung der Maßnahme zur +Vermeidung der unbewussten Entwicklung auf dem Masterbranch wird dieses +Kapitel abgeschlossen. + +Sobald man sich auf die Ebene von realem Use Case und Toolumgebung +begibt entfalten sich die Möglichkeiten der technischen Maßnahmen und +die Realisierung kann entsprechend in Abhängigkeit davon variieren. diff --git a/pandoc/mass.tex b/pandoc/mass.tex new file mode 100644 index 0000000..ab70a5a --- /dev/null +++ b/pandoc/mass.tex @@ -0,0 +1,319 @@ +4. Empfehlungen für die Planung und Implementierung von CI/CD + +Im Folgenden werden Empfehlungen aufgezeigt, welche das Auftreten der +oben geschilderten Probleme verhindern können. + +Die dargestellten Maßnahmen beziehen auf die Planung und Implementierung +eines CI/CD Systems, die Dokumentation und auch konkrete technische +Maßnahmen. + +4.1Planung eines CI/CD Systems + +Die Einführung eines CI/CD Systems beinhaltet nicht nur eine einfache +Automatisierung bestehender Prozesse, es handelt sich um eine komplexe +Automatisierung mit einem hohen Grad an Integration. Aus diesem Grund +stellt die sorgfältige Planung des Systems die Basis für eine +erfolgreiche Einführung von CI/CD. Hierbei müssen Fragen zu den +Anforderungen und dem Design beantwortet werden. + +4.1.1 Frage nach dem Umfang der Automatisierung und den Objekten der +Automatisierung + +Entsprechend des individuell vorliegenden Entwicklungsprozess werden die +Teilprozesse und ihre Abfolge definiert, welche das CI/CD System +abbilden soll. + +Typische Prozesse hierfür sind der + +\textbf{Build-Prozess} (Compile, ggf, Multimudulcompiling und +Containerbau), + +\textbf{Testprozess} (Modul, Integrations- und Systemtest), + +\textbf{Analyseprozess} (statisch oder dynamische Codeanalyse, +Dependencyanalyse, Lizenzscan, Containersicherheitsanalyse) + +\textbf{Delivery} oder \textbf{Deployment} + +Die detaillierte Definition der \textbf{Inputschnittstelle} für das +CI/CD System (z.B. xxxx ) muss ebenfalls erstellt werden. Dazu gehört +das Format, die Art, der Ort (Übergabeordner oder Repository) und der +Kontext (z.B. Release-Erstellung oder Snapshot-Version) unter dem das +CI/CD System aufgerufen wird. + +Zu diesem Zeitpunkt ist es notwendig, die \textbf{Rahmenbedingungen} für +das CI/CD -- System festzulegen. Dazu gehören alle Arten von +unternehmens- oder projektspezifischen Konventionen und Richtlinien +beispielsweise zu Security, Code oder Systemarchitektur. Auch die +vorliegende Hardware könnte als Rahmenbedingung vorgegeben sein. + +Für jeden \textbf{Prozessschritt} muss eine \textbf{detaillierte +funktionale Anforderung} erfolgen, beispielsweise könnte für den +Analyseprozess die Arten von Checks festgelegt werden, wie der Check auf +bestimmte Designpatterns, Variablennamen, der Check gegen vorhandene +Regellisten.\\ +Für den Prozessschritt des Delivery gilt es zu entscheiden, ob die +Softwareartefakte in einem einfachen Dateisystem bereitgestellt werden +oder in einem Artefakt-Managementsystem. + +Wird das CI/CD-System für ein bereits sich im +Softwareentwicklungsprozess vorliegendes Projekt eingeführt, muss eine +\textbf{Migration} geplant werden. Hierbei müssen alle zu migrierende +Artefakte zu den entsprechenden Prozessschritten bestimmt und +beschrieben werden. + +\textbf{4.1.2 Definition der Zielumgebung für Artefakte oder Software} + +Eine relevante Vorgabe in der Planung eines CI/CD-Systems ist die +Festlegung der Zielumgebung für Artefakte (für Delivery) und im Falle +des Deployments die Zielumgebung für die Software. + +Die Laufzeitumgebung der produktiven Software variiert in Abhängigkeit +des Use Case: Beispielsweise kann es sich um ein Autoradio, eine +Cloudumgebung, eine App, eine Website, einen Großrechner oder einen +Cluster handeln, welcher lokal vorliegt oder über das Internet +zugänglich ist. + +\textbf{4.1.3 Design des CI/CD Systems} + +4.1.3.1 Toolauswahl + +In diesem Planungsschritt gilt es, aus den Vorgaben über den Umfang, +Inhalt und die Zielumgebung des Use Case die \textbf{Wahl der +Toolkonfiguration} und auch die Entscheidung zwischen +\textbf{individueller Lösung} oder einer \textbf{All-in-One Lösung} zu +treffen. + +Zunächst muss eine Toolübersicht über Einzel- als auch All-in-One Tools, +mit einer genauen Analyse über Funktionalität und Schnittstellen +erstellt werden. + +Ein systematischer Abgleich der Anforderungen aus 4.1.1 und 4.1.2 gegen +die Tooleigenschaften liefert eine potenzielle Toolauswahl, welche gegen +die Detailanforderungen und Rahmenbedingungen überprüft wird. + +Dabei geht es um die Bestimmung der grundlegenden Realisierbarkeit und +auch um den Änderungsaufwand im Falle von Konflikten. + +In die Entscheidung der Konfiguration fließen neben der funktionalen +Betrachtung auch der Entwicklungsaufwand für Einführung und Migration, +Lizenzkosten, Hardwarekosten und Training ein. Weitere betriebsbedingte +Aufwände beispielsweise für das Integrationsteam gehören auch zu dieser +Betrachtung. + +Für den Fall, dass Module zu einer individuellen Lösung konfiguriert +werden, muss eine Integrationsanalyse durchgeführt werden. + +4.1.3.2 Design im Toolkontext + +Nach der Toolentscheidung erfolgt die Detailplanung des Designs für die +getroffene Toolauswahl. + +Hierzu gehört das Design der Toolintegration, die Migration, aber auch +das Design von möglichen technischen Maßnahmen wie in 4./3xx +dargestellt. + +4.1.4 Festlegung der Hardware für das CI/CD System + +Die Art der Anfragen und die Häufigkeit der Anfragen an das CI/CD System +ist ebenfalls vom Use Case vorgegeben und bestimmt die Ausstattung der +Hardware mit CPU und RAM. + +So hat eine pure Webanwendung mit einer CI Anfrage pro Stunde keine +besondere Anforderung an die eine Hardware, während ein CI-System, +welches 25 CI Anfragen in der Stunde erhält und für die Entwicklung von +CPU-oder sogar GPU intensiven Anwendungen gedacht ist, eine viel +stärkere Hardware mit höheren Taktraten und Kernen benötigt. + +Solche hardwareintensiven Anwendungen finden sich häufig unter Machine +Learning Anwendungen und auch bei Quarkus- Native-Compiles. + +Der Speicherbedarf muss ermittelt werden, entsprechend des +Speicherkonzepts und passend zu den gewählten Tools. Auch die Vorgaben +zur Spiegelung für die redundante Verwaltung der Datenserver können bei +der Konfigurationsentscheidung eine Rolle spielen, so wie Konventionen +aus dem Unternehmens- und Projektumfeld. + +4.2 Dokumentation + +Ein CI/CD System wird zum zentralen Element des +Softwareentwicklungsprozesses. Die starke Integration und Komplexität +erfordert eine umfangreiche Dokumentation für Entwickler, als auch für +das Integrations-(xxx oben definieren) und Automatisierungsteam(xxxoben +definiern). + +Die Dokumentation stellt für den Entwickler Informationen bereit, welche +ihm Kenntnisse zu den In- und Output-Schnittstellen vermittelt. Er muss +für sein individuelles Projekt Information darüber haben, wie und welche +Schritte durchlaufen werden und wie die Inputschnittstellen diesen +Ablauf durch die Pipeline beeinflussen können. + +Das Automatisierungsteam benötigt Informationen über den CI/CD Engine, +(xxx bei der automatisierung -- vielleicht auch tools und ) eingesetzte +Tools und deren Interfaces und über die Konfiguration des aktuellen +Systems, um den Betrieb und die Wartung für das Automatisierungsteam zu +ermöglichen. + +Bei Störungen im CI/CD System kann diese Dokumentation helfen, das +System wiederherzustellen bzw. sogar extern als Workaround zu betreiben +(durch Verfassung der einzelnen CI/CD Schritte in Einzelscripten). + +4.3 technische Maßnahmen + +4.3.1 Lösungsansätze zur Umsetzung der Maßnahmen + +Bei der Einführung eines CI/CD System können mit Hilfe von technischen +Maßnahmen einige Probleme vermieden werden, welche durch Unkenntnis der +Entwickler über die Funktionsweise des Systems verursacht werden. +Zusätzlich können technische Maßnahmen auch für die Einhaltung von +Policies genutzt werden. + +Beispielsweise kann durch technische Maßnahme verhindert werden, dass +eine ungetestete Softwareversion in einer Produktionsumgebung ungewollt +verwendet wird: Mit Hilfe eines Artefakt-Archivierungssystems können +passende Einstellungen vorgenommen werden, welche gewährleisten, dass +nur getestete Softwareversionen in die Produktion übertragen werden. +\emph{(B06 -- unzureichende Tests -- ungetesteter Code in Produktion)} + +Weitere Beispiele sind die Verhinderung einer ungewollten Ausführung +eines Releases \emph{(B04 -- ungewolltes Aktivieren der Pipeline durch +unbewusste Nutzung des Masterbranch),} deren Umsetzung im +Anschlusskapitel an einer konkreten Systemumgebung aufgezeigt wird. + +Die ungewollte Ausführung eines unorchestrierten Containers ist ein +Problem, welches ebenfalls durch technische Maßnahmen vermieden werden +kann.(einbisschen andeuten wieexxx) + +Auch im \textbf{Speichermanagement} gibt es Möglichkeiten, den \emph{in +(B02 - erschöpfte Speicherkapazität des CI/CD System)} beschriebenen +Speicherengpass zu verhindern: Durch ein \emph{geeignetes +\textbf{Lifecycle-Management}} könnten gewisse Artefakte nach einiger +Zeit gelöscht werden. + +Weitere Maßnahmen könnten die Einführung einer \textbf{Hardwarequote} um +für eine ungewollte Hardwarebeanspruchung für einzelne Nutzer +vorzubeugen. + +Das \textbf{vier-Augenprinzip} klingt zunächst nach einer +organisatorischen Maßnahme und kann für unterschiedliche Prozessschritte +als Qualitätssicherungsmaßnahme vorgesehen werden. Die technische +Komponente dieser Maßnahme wäre die Dokumentation und +Ausführungsbestätigung dieser Schritte, welche als Voraussetzung für die +Fortsetzung des spezifischen Entwicklungsprozesses implementiert wird. + +So können auch \textbf{Konflikte}, welche durch eine \textbf{parallele +Ausführung} zweier Pipelines entstehen, mit Hilfe von technischen +Vorkehrungen erkannt werden und zum Stopp der Pipeline führen. (andeuten +wie xx) + +\textbf{4.3.2 Beispiel für die Umsetzung von Maßnahmen zur Vermeidung +von B04 -- ungewolltes Aktivieren der Pipeline durch unbewusste Nutzung +des Masterbranch} + +Die in B04 dargestellte Problemstellung besteht nicht nur aus der +versehentlichen Nutzung des Masterbranchs als Featurebranch. Die Brisanz +entsteht durch die Folgen bei der Ausführung des Push-Kommando im CI/CD +Umfeld. Der Build-Prozess wird gestartet und endet mit dem Deployment in +der produktiven Umgebung. + +Das Szenario wird mit Hilfe einer einfachen CI/CD Umgebung dargestellt. +Sie besteht aus einer kleinen Pipeline, welche die Funktionen Build und +Deploy abdeckt. + +Das Branchpattern besteht aus einem Master-, Develop- und Featurebranch. + +\textbf{4.3.2.1 Anforderungen für Branchmanagement/Deployment} + +Im Folgenden werden die Anforderungen definiert, welche mit Hilfe der +CI/CD Tools oder des Versionsmanagementsystem umgesetzt werden müssen. + +Die erste Überlegung wäre, gleich zu dem Zeitpunkt, an dem der +Entwickler seine „versehentliche`` Programmiertätigkeit auf dem +Masterbranch beginnt, eingreifen zu können. An dieser Stelle sind jedoch +die Optionen in den weit verbreiteten Tools nicht gegeben und die +Möglichkeiten zu intervenieren, können erst später ansetzen. + +\textbf{Ziel ist es, dass Softwareänderungen nur über das Merge-Kommando +in den Masterbranch übertragen werden dürfen.} + +\textbf{Ein Release darf nur ausgeführt werden, nach dem die +Softwareänderung von einer autorisierten Person über das +Vieraugenprinzip eine Überprüfung durchlaufen hat.\\ +} + +Diese Richtlinien stellen somit die Grundlage, dass kein Code durch das +unbewusste Arbeiten auf dem Masterbranch in Produktion gelangt. + +Hieraus ergeben sich die folgenden Einzelanforderungen für technische +Maßnahmen: + +Verhinderung der Push-Operation für Code auf den Masterbranch + +Code muss über die Merge-Operation auf den Masterbranch übertragen +werden + +Bei der Merge-Operation auf dem Masterbranch muss der Vorgang einer +Code- und/oder Testüberprüfung durch eine weitere berechtigte Person +nach dem Vieraugenprinzip vor der Release-Ausführung bestätigt werden + +Im betrachteten Problemfall würde der Entwickler zunächst unbemerkt auf +dem Masterbranch arbeiten. Er bestätigt seine Codeänderungen und würde +versuchen, sie mit dem Push-Kommando auf das Remote-Git-Repository +hochzuladen. In diesem Augenblick erhält er jetzt eine Fehlermeldung +aufgrund des Verbotes des Push-Kommandos. Desweitern verhindert der +Prüfschritt für das Vieraugenprinzip, dass der Entwickler ein Release +durch Merge ausführen kann. + +\textbf{4.3.2.1 Umsetzung im Versionsmanagmenttool oder in den CI Tools} + +Es gibt eine Vielzahl von Versionsmanagementsystemen, welche in der Lage +sind, gewisse Operationen regulieren können. Zum Beispiel das Verhindern +von Push-Operationen auf gewissen Branches. + +Das Versionsmanagementsystem GitLab lässt sich so konfigurieren, dass +man auf dem Masterbranch ein Push-Kommando nicht nutzen darf. Beim +Auslösen des Push kann eine Fehlermeldung angezeigt werden. + +Entsprechend können im GitLab die Einstellungen getroffen werden, dass +nur die Merge-Operation erlaubt ist. + +Ebenfalls ist es möglich, im GitLab bei einem Merge-Kommando einen +zusätzlichen Validierungsschritt zu implementieren, welcher nur von +Usern mit einer speziellen Berechtigung bestätigt werden kann. Dieser +Schritt stellt dann die Bestätigung der Vieraugenüberprüfung und +Release-Freigabe durch die entsprechend autorisierte Person dar. + +Sind diese Möglichkeiten der Regulierung von Operationen mit dem +vorhandenen Versionshaltungstool nicht gegeben, gibt es noch die +Möglichkeit über das CI-Tool einzugreifen: + +Ein CI-Tool kann bei der Aktivierung nicht nachvollziehen, ob sich die +Anfrage aus einem Push- oder Merge-Aufruf ergeben hat. + +Aber es gibt die Möglichkeit der Überprüfung des letzten Commits aus dem +Versionshaltungstool. + +Die eine vorgegebene Berechtigung des Users kann überprüft werden, +welche z.B. mit Hilfe von digitalen Signaturen umgesetzt werden könnte. + +Diese Regel stellt sicher, dass die CI-Pipeline für ein Release +gestartet wird, wenn der letzte Commit durch eine berechtigte Person +durchgeführt wird. + +\textbf{4.3.2.1 Dokumentation zur Erläuterung der Funktionalität für den +Entwickler} + +Auch in der Projektdokumentation sollte auf dieses Regelwerk hingewiesen +werden. Neben der Darstellung der Branchpattern sollten die vorhandenen +Branches mit den erlaubten Operationen aufgeführt sein. + +Eine Übersicht der möglichen Fehlermeldungen mit dem Verweis der +umgesetzten technischen Maßnahmen ergänzt die Darstellung. + +Mit dieser Darstellung zur konkreten Umsetzung der Maßnahme zur +Vermeidung der unbewussten Entwicklung auf dem Masterbranch wird dieses +Kapitel abgeschlossen. + +Sobald man sich auf die Ebene von realem Use Case und Toolumgebung +begibt entfalten sich die Möglichkeiten der technischen Maßnahmen und +die Realisierung kann entsprechend in Abhängigkeit davon variieren. diff --git a/pandoc/maßnahmen.docx b/pandoc/maßnahmen.docx new file mode 100644 index 0000000000000000000000000000000000000000..633916619b35c2460286fd481f8dc188c5a64fd8 GIT binary patch literal 18729 zcmeHvgLh`j(syiUV%xTD+qP{d6Wh+jnK%>Mwr$&*@XNV)@44sR_5B0y`>eHVJ-d7V zYIpal+SOfMUGh@EAm0GM03ZMW00;oK3TLe~0RaH;K>+}e0U&_1gzRjcO>CX@ls)WC zoOEd2ZLIP0L4e3}0f4@q|G(e=;t{A%8nf-CM-X{Reu0l~QZYQvFQWvCsDIq$g_VOPElClFKT{3PMqT28f|dj#VZ0jAp|9{)Wo5{nW7u zoVrP3Pa)R;js>Tiiv*omyTsySD^7@Ryy7&cZk8RQWi^wIC;) z>ljRQzBGBY81QpvJZEMFs^LMxVmE`*$ZBt8ZI70kLTcGH?CpD%B9i)-RT^PB!1&4a zjQmRVyp5bsa`574z;)~mb&D^3^8<6ql zzeq~Ho5#b!-s3HHqXES z0H2@00P_E)lDP4hO;=xXCi|sv&|fO4=V)T>L`VAv{XbRwU#x$B>Uu>&k7XY{4F6To zd(cdW!fFqCfh?WT^cwmKIE0pjH1gWA<5w5L;+sLOVe&NXI= z3T#9N|1_faAViqW7*4U~u}OtARpu(XM8o&{Yc1L48cka>{dbg$l~+DMuoM-hh@ ze5_Xl8ufZRc34?D0(W1A=|A;j(YQ|G{%bH8zO)A$00Pj>&e53e?@D59XXIk@Wxf6| zTmMuTz%SeN#pi$buOeaWOJKgf-N7G0X+AVuKJtS5){+Eki|+s;xO_jUAt&y4x~jz` z&ZhNSuN|w>oTmI)*QRD+!$ps4JQi5LF^K;L_x%o; z&hPV^SWhW)y5xO%a&*HGRls~lVfFp>!f5DIXgQr)AT?SmUB2*`8kHHN*6-IxzmK7< zL9O>fwSL7TK-j#xN{3ai2Bbre)`rfU2SJQTYZ_IaMB@>By)%*q*XmCZYzKdM+Yx55}Uq5#>Jyz=N<-jt(%Ia~lYKF5B$6g?L`vBuEfStQA_ zt)jaX&lq!_smHxLxJM-qB9!E&eSnfNb#I3RT~rRfWo}^^*>-d83Cx|2we3M#&DPJv z*6-1!pIAutZ8RYsu`=HWPFI6C3*W6w`>qw$#bqwJntcQbbaVnIGU9$hlf}DM(<)QfIQ#(BXw_8 zjeGdlj-TvpU0BX97s`A!s;h$%Y&i{$A-k@Jx2KKotZaT}=QfA*GajORkrgFjxLl&) z5V25h&Z@q}T#FktX9vg^pSJAd?o?Zw+R$*j&iH*lr-e#`dhX$o?~`F-i1JR#bEn_8 z$z_QkPYMfr+)BdX9%B}t9vPHv!Rzf7s*WEOu(3%ID@}f+I8noXSWy2W2NU9mw@h<8 zehNe9IgX@WrT}Y+=g^r>B^7VIACjMCl}Gd$TpA)h354;7&&%J5h7+Bm)0FC1L^8}l zc!h$tGDmd65K-@GGJK(<5!~I+r6Q9INx{5(+fi2AB?32mV18ISL#d?}XPoy%H-|7eB|RClX9Odjc#^aI`gJ5M z9=?xE*H_`bS3l_(u~8^)O!p_sy+E|D)kJD1)DWBbli3OwysP0;eJSeQ=HY6{)~4I| zS>*By!RYS643y$4zeO(rfl)Llv~;i5iF};+6mX>{!Fw0IH^B!R0s;z`NKRZpE+e=` z>ogESQf&ZXHiCXqw!bLc$YP2Dt}(N`e7|d&0?^Kzg>Rbrfwu_ucgXr7ow_+IBJq!t zZSf;Vb9LgX87bqqBn+O1h5-M1sOTayQLt(K7mm?|npp#%j8r`;?RqN4WDRpOwGkMI zJoM5U#fJgffDO%S;EA+Fj<6EHX~mQ6X$b#R2}FSDb92V-mv+)ws0-eXjn46TgjSW~ ztT>KiBS85`IaI-`=myxfssPgB1Clocco3!O@tYhS6P&m8cbOP&*{qhII!C`L>E^?a7B;EZ|G~bRu-4JFu>)46P@t9fIf`g=VcAOq8 zY_`v6H{Hv*`Yzi*Z!5 z%&aX)l#$*%q3iXTi&fJ)cP#cv{V)@I+ieyNcMG=eFWOIyiWl?R#x_*%{LjFvz-D}6 z>b8WaGxGeds5<^^7qoNeTIf*5EMEo=c$eWFj;Wcrjm^cHmt#MLvr>F^}9@><{GZeIrFZOY`uK{`cD$o*td> zb;w5{@8pZytF6zax+VYI`NA-L8P-OSe3<&oUx>$Y&+2Jn4gIgk=tiQX#z1wvQU}7Y z=p^RW0ZJecNEcbuSKAj6`lh{O`L)U;68T&l4H`Fs=U?^2sF zvO2`Pg|KUg;|v;rup^|h%!M@I@x#r%AkM2sNm{Z_wCKu+!+7gZ-cf540y~Oa_WGzq z$eIA4LbyHqlEGHb9V>C zTib2PM({(k1Y4K+qs&Q?TyZ_FUYCfyoCv?8jDBYoH~EcU<977Rn)(WafqwZ^i?JdE zJE_5K3xE7sEf}H;A-8OPw@fXZ_HcVRZiPNFLW*+~ly)gYceI;oIuhNOoI_r~{B|_q z$lhpgqz6YLr)l)JTndqHh%qCSj=}kgKa3F6DhWde>U+QDIuqk3053S1*Vfbepb>%r zC{#ft?W~MB^|9OMJRi>|+sUz8Pha{7>~Fi24x;#jD|T+m*CAqHH;Mk33i>1dg+z_M zXSG>35ovvd?zkq80dG`~R-8@A=@y(WAAlJX@wFdN0Ku`4TK)3k*gsqi)-{jUM&_a_ zX^(q^R+~Xkt?Qo*ExC86bbB;`Gl{PWpb^TwI-Eug6My%dX1G<79CHioh*z_K0x>WG#*N(LeD}{2lfZ;ackYVufr|d39~hE^u~v1A!BSoIiK8?%wx$_piv3f z>k_?Jnf>)*PbV4C=?DC@A)C?KNXDbQ1P!>qns*uN>$ zgS(PAJ(alK*b1xXl{j2DK3W95Va!=%+`Hcc(_V=aMKdF9vg|w#C7XfXl~T>?M#OJr z9!ppi z37&|bM|&Y)#vXn2v zdtrdsG$3i<{BPq>7J_;*-@=rZ?o4*|S*Cft+6J^6FSO6c7=}!&pFp|I zg)nL()1}ELV;Xts?S8?=8%_vt`v=2Q=FHfA!5(e&s` zn>yg}v7Em!=4(&Qj1`4h-55y&@alAHDgDr*8m}H#GkJqts|!Mz0-B65c57Mq<)U87 zGcCw~>4eK=KAHB@*OQ+Ci;&>}h+t z9PUoO)rPmBH*kU$4y*@?#75L&`^Gi*06={uyLJIHE6k3PtI(4pLwPVmOEd_cA5xM>O2gY%j}&r<(T@1unjZD8N@wbBk(*ecj)~fZ zZL)yno3iqvG0i|4q|;?*3bi_{+QwiE_O9dIf!OHkO zWmir=Ly#Q(v4(4;8dC&xMB_<8bpa);+8f5+Wu=9QR*B&)1_>!a`5eEoU=_JV)5OKs~Kq5+vElSCn5t?aT+ib$5mTg0rid~YSh9X_V=g49A-0opkO-XWVv z5vUZ-(j)F?#56}i1VmDFpwBa5I>+Ow*(j+%=jOvob(RH~m;RY-FS@Z{f*5>}WGEzO z&j+Bu5vFR-ztMnU(dbdjtMfVj*9*2;+*+UcyJ@4!H}?#$QsmTEYn=M{ng#zx zN`E?`nP8xTDOID^eWb$k9ab&?J+BHy42`|OO$P*&tlSH)y9U`Uk+f(o+)2BQQP%XG zN=msQs77F(LX;~IY7B0BBqkas`7Cgz@Pg(R6nYMN?8Fx?E#BAbm)+4Pf6=)#=?}X?BATSd%E;JnBT+tER6T@c_bW#7JB&}w!FwwM8mgUhZP?< zV!n|QJ#BgI0h!>TmfChbv+o+@1%PPckXuC1TAi_jP^N+PYQ;uwjJi&&95i5@Hi820 z32E{4kYN(Ug8p)pKhwojzj=dn8DrBsVhAE*IPg~bFwuF4N3FESR+uSEnsx)v%U)pP zBJBFMHba_GrJ&L-u7<>7nF*SGk0k5nC4EK^nsYyyrrm3Zrx4~PbI@MKt-UYqhJOhn zw3y0Sbn3No=5v#+cu)d_`(hXH3g#&Ug7T)FS2XgFE^@m;Yif9@K5I_ zW6>p3_8zzi(_4LZ)vChPVyeA&w`Ym+_u*o$@TsMH-jBIx9J3A0!ZkgSDAiBWB*@#z zu`vwYlHEj;NqJQ%bj4& zu?Rl(k~(d!T%KvS)4#USJwDp0b~;dGXD8X^x#v%5@dk8T@-Za6JNOK09w026EH8N@AQmbUf|mp=(Bko$0em5nn!$)4~Tu`6*|r| zip3JwQKw66<&&OLr{oPyC;PFzt+F5+r1hZH6tLqO<}Abfp0E)0VkiB5(>wT5>)Eqj zOG)Ekl#5JEh(=G<-mAoLm2CdqEq-6hazIlVrw;SFzY9usaad7^vK)r+H#xA8nI=Bt z7MX||>iYLulm7Bv0f(#G%1KT75LGw+f_a2@mvUw7Z1z3q&SwoT3CC$5HSCEX}q z?MaKfdws(bWr77f9Or91Q;GaZjY=)ya-)zPe{0jO9qBtXhcq6E-)a%+8{vnKisrDQ z;(?QSBoxbBA<4n!A1G`L!glf?KOItCH0`S#>T{gDz8}4A*=ry5$ey1$ZwYE#3?vND ztnqXPKN+ieHaL13mMqoqI@fBbrS1>k$xA59gnOLJ@OU9!a zJKw1-3a*gsi64g#(Rk26F5|xF6z4AzL9Gw94)?0mS{ecoNhDW2_oVEA{4}u4S~pdC zWRR%mY%=-IdJLayEVp)Vqvdm8(6Mq1jz-w(04Cm6Lc6Raj+-q`6D4?of>yj3U;WJxVTNlinAF-a=rbYum~G_MtUZ*PJA1i`wMZJCN&UW0bz_ zP|UJ!a)RpC46+tgN~5JZ)BoTkn`s5wqXQ9Guw440sh-Wn#hliymZP#DpB&;})~MOD zn6*4daK-I|zvXI{Z-QdAjNKiHajzSI#i-W2JxG_$HECFRFux{`xt!GI4d&gMbB5R# zb1S=@q3-yua{=ho59;V~g?I=?cqz18)phfMSN`s4>>0UsS^M9=EA*rEo7)|Y%b zb;>atBUIFIp%Q>8pR_WAl_cW8RmBbd&e)7dderhx`WoIh$5#S(NZ&l5s+9GzDiTd_ zB)GC+q~P1J19fS8$i6*tyvWaOZY9Q5RE|-OYD_T^qAOy4eW(|LRn7aWBPcp3x`U7F z#lEij9eFa@&K&hpR@C`qhL<3Ni;wdFAhDj4b*GXzGS?JS)78$p_;=Jvu3QElPdc7) z)YHfCV9^aN18U=P_ba%mCX1`Jb<#jV+3czmW$oE)h7~y{i*`4pgp)MTz)>@k2j47w zKI&=14KC{3dR1z4uO^Knx#{Zd`jO{#fDOFf(WYryd53YEd2V z+PUwY66MvX`b*{kA3x5I87|+nY@y}2&8Gl@MR~WSD@?0h8>i3?P3;=)o9`-De#Y(K zV`g3QmCQE5fU~%(t@tnn)oMnpbBMVAY6+H7!Lz!t6-f@RSNC_+`WWW(*w&jVnc{Qc9epYU;&X(Y8eBt|O&F9rBG599J>t~zYL(8HKm10+ zr`*uJg=n%7;`VShE*}_2sBT0V5-XvqyUL#Iy1y&oOwbADNOz^Nk`RHU>d-Rk$>Ws_ ztEawK&OpiLL*(q~H88p@HY{I#v^Ugt&79l1iu;(B0+vb@WDS5y5icLmMoy_#ZP?p2 z{i?HLb6x!DZv#S&P|aUgmCId;v+Hv;{Nkg#E(9@k>YKMb^5Far__-CN?KJN|PK ztk)#7UBJ)A{esIRSved(OkNZ&Qrv-8>*W5kA#7~al?r$Cg>`M9FkmU$=L~F#cG4q} zbht9&lZu{2k$KW+%m4lmYX&y|^G8u*-n)<<}%V%3InR|y4cE!h%LDPd? zwk`l(5Hyln-GWfTxrNOy)5`_#o+=Y(d0NxMTDC+~gjlzgxx$qHf_7S3XM7w5awC#{ z52jmU0XvG<=UY7CW8Fj+_Oz&eo2rwlg+<>wRM87TkY}ar&^9A07RB;|>$9O!1_Rrz zu2r&ACzkyd%kusnaycbeGdTCYT`Qozt~>O{bX-63#%x>kdGHHvW$1i+kbl1w6_(wA zB3V_UJZma0U~Pw!`vf@K8U46caY;C&f^_gzd$EhoF=NPSv~iT|ii6;5Va$t@6~k;t zfr`H;ttqW`qxczq7r21s)UTZeQ+`F$^0r-MgslL~8ECmgazce3xQIfn0q(aQPL)Hd zK0>P!jgvMd7#IU`JX!(ywuPvs)ef#@YV+$b9+sxmnp-9gP-mO|%F3BG@?x4OxYtMJ zxZupDS?048 zs*dU?be^J8lA1_J5;*NMVnewaBLkjvkxC_^7OA2$dB@AF!3PNNsk)JD6xs+jd@IC6 zQH6y~W#c*&=mNkmpUrXFwyKPpRx*K$I>1RYd}(hfxv#9!waeo~$fD{4&kqC71KS%0 znCm*Owcmg7Xcld8Lk>0)8D60q6Xz=u6HEM#3Pdooh`NBJ=qw$RJD53t1zI_2ags z9_aSnQhLdr$QOVyO4P}n?Ssfvx~?CHg>rh_UccH}%ndJZSE;KWRPS3-S#ph8Z;*Xz zPr6q6*c+}6Ihr$x3)ItQAfu>T)gMj{=vz@47!Le8WL-t<_Pfj49{r~<8`M?>JXjc4 z#$u&tJXaE~`$NgxPj0?;8KbZ8_>LrIx2E)XeJp;Y!EHfBrIAtibe$+CV1{@+#1ChX zF@(5}LfcI7KXipCB1Cp+dfYsd@WLe!SNmY20?63nuCL%iAF>ix?Nq-?Ts0_ocT!s1 z86`g*)BNClN^H72lz-07pb%007~b001ce+;4R@H?c9H z`x|BWV~_q^Lnac74ZRcX1uvw93wMp_Lwy%^?^kyHij3fwYo>skXo`F>DvJ233Nj!e z%ah{U?5q%Q$Ai2iFf8-^EM8sQbTMCk!k|&Cb&FIh-1k|Qiiex_YTSI=WO8I_tLlk7I8{6WB^C4senuEy}YMEL$_q< z33VBXoDS3bN$XuyrZ4r4jrF>dj1N;c;5NT401qxm1x6~j{TRb=whX)~L@l>{dA+*{ zyX&fvxgCfE-6RpVevbu9fMJcqSo#{4sC}=cPt^xdFR!d42;Js!G}))jbTO@FfGb0Oq_v>2)^!SVNyGaeGLgeBASi1~vhf z_mK=~qLzB1g64B<%4g@JwA~H)NF*zr*CQKo(xkRuf7P!YDJR^k1U(2|Bg|Iy7bhq0= zW;E8tuQd~u(E>v9;hVfc=Ras~Ek2_drTzAs#p7x7M>{m4&-;c`-Qgww>_qoiSc_b| z16!rkGwXV*J@|LgN<=T@WD39SQPaHDCL-TI(qbj5Uw;>fpXE4 z1D0LOp?pEhF$RykCFX8NMAj!c5oX8;{g#HNyzF=^8{LZzG6jVZxiB{2cph^HqXSwv zw_Q~Rj9xH`t^k8TQ**tXylP~@kjk6VQrvVq25Dq2fopg6mhzPtC zCldL};MOb$D^Z0d-+lK^toe@I-TDrJ0h?yoqKn_r5mz43tKH=s@4D~5AfV)CGg4!D zzD+T?ce-EYud;1+6b`VwN{Y`?Dm-nMF{)naTDtVLp`EEeuAw5ud(2nBb4ANmYn(8@ z84O%JttQJ(pR2q~Q7NTPA1OI7Pe+ie^``y)vqWXR)kKs z;!lA-CzE()3JUA}C=-onCe^v{c_}-5KuPpH765XMk^3$;NQ7eTHjJWlZEO23AA_g0 z;LT32ed`*sRe1_i1xG|NU_#39(&fo~KDMzPW=!-*5K(C;#>kj{;j1d&kCTf$`hHD$ zCSZF4>7H_p`Z`sVg7{L`??g@nD2M=yicZEmN_Jw{C!wOSR3j+0^@UNZd*so34)ZPX zbw6kFkF{YqD(jhR8!IIU&N5UBU(u-VIUG7h1XW?ldRxPYWYG8VgI5$x0@*(NIsluY zWgqq0`g7`X-Nbj9s=VSb`82W;b**yiE5aD2@h1fXmG1-U&|-27_4v;(BPLPO$bNBU zo96gs2Hgh-{UX>pB)rm&8jnvL+8(ZPlHASn(zGn(*=hB>E^A(cDpeT4$N4!1P{nG$ zBBIuPJEeHrlP52%Hf@O>Z;TzS36O}%GHxs1(x@0PiYq{x=zhAhp>Ppq|Mmh+O17<$ z;nluM5KSp{ubBtc>P!^8kO0a`0C& zGezfUwVh8!Fro%5v5b~sSZiU`*eE8N68DzjOS%N)XC76wJ+tw~#rUiVB(E0shS=K9 zL0L;Y%qm}u_ifz8aO9_^LS<1WGP?V9U*JqDDJGD-@d(thNCS5>XBQbnU&hB|bAb|O z&+HH>Hm`(55T&$O%Kpu)*=jzIBgY8Y-8svCmyK;n;>o=XT36&~q^rS4USDa^w7*v* zR=y`3iOXaRV1Qi-U%L~TV~Veh6A?tU@FQjcUeBWD0+0N-UpxsqOv zkU`#nZU1F_L4+QHadY#<&;I+?B0vp-BJRvl8^%cVjZ5oUr0!m{kklogq_z4!#n2*L zC%m7Qc3`U;d8tJLuK8{l#;G0D(6tq*2LdTiwGMI7S{T++`4}kh{O9)82Mxy3xDdWu zdvwB`5T>EuG@i3z?h|yUX)KtQ(e@D=*?Q)C;W0%R#A2rl*j?7z=S+{uv0kN{1~g3` z)`3M)gX29-&&fZkwO5<+^ZAD!;#1!vJ_pDqe+IDRZnM-Vf}g8}lC*e{o`b2s0YtwG zpK>sQxS^*k;Mo44vb!TmA7V?i=tP&@9N#lYiLnb^f_%d`+Vl41kSJMk`EX+k-Wgh3 z;QOzWM}siKL9DOvXESgB0Hl9T9!Q45ByX)CPP?hz zxzPLU>U;iOFrP(!6v|Wc9b408qt!758sJ=`JfX4r~&KCco7j#bX;+1?JDOXB)_O3Se zDlJjQLI-Le3|UKkCTm?@a<2R!!8snJ+=?*q?hHX9)2(5s903E5us-}cWsa8=C$uT6 z58c~r9fO_Gfv&;-Sap8Jt2~{M@9S&UkuC(f6wr6u(RVs*d7c_~+yoY9{kvw1zVCg&qqOl>#st7ohKI_ac2Ob>FixH90R#@bM z1@PUT3|;MME-v8ZWaJ{gwMZn6(N!~Rii$QcZ8W(D1SDa%%Zj2}h2vO3tX-G0-H4=G zZ=>LPaHiTSN>9-qF-6k4kZ5Qi5U zQ!ey*(oz*EbHBK$D|U{|GZ^1_*a+ob-t5Ri-I-n8!T;Bh><1FPyZsu;yD$5T@D+Fc z6+A2NXlL(4XJBvthf01OPWZoA>#vc^N|do%qlXE(0)E7U*}_`UNHq<}&lj(Gn63oe zZ8VcDHZo`=7LS-YUy7~8np$zqkfY<1<{_l;eO+ah2%V%VShC<9n+0iLE}9K>c~SQ6 z)GQ8%&y_Nd8g%g#{IMDFboD%m5lKsa51Bmeo4rV|jAEp_xE%OHL0zeku_~Cqn2TOX zMRIp>*eH^-#v_FWy%TJnBt^}YIt>m*P3L(lzbHO_iVuxU>H&nVrU4e@+t%(6ShIp4 zG*W)0pQs|DmowX3?73*rlVCl1QB)miW|3BtU=wUC>~R6DWVdgoH}Q4hp<5bjIAxBTq<} z>(dV+pwVKJzFf~dg4h>u%EafrWkMKHQtdAiec2@=ZrA9Ujj~+!P|o6^^*zTfMn3lW z@_?nW1sh`)tIFk8@lTM%w8&lsX81l5Vr0z6cvP)g&*0X)!50`{^N^EC=iY;ODs06K zxpIb)LkOwV9_*@lU>5`}uYz~p&_jT4*K&>YYt77d(H+jRi#sC0o^}GWg}3ly*1S4V z5>Zzpkt8yn*bB$oPtFWW{m939KHaxjcW(Gqt9RESBAsa__YZ9@k2Aheu~Khe-<1E1 zG>5Do191P+lc%p*#6Rnak)7k;Y}fxO%9ob>p(qJ|I#9L*D;pNEN)A#APuySdv(R!O z+X{X=fjz|r;>{-;M6jUt)OOJ6aPoO|M*m0ABwW&A%P~>c9sxMW1O{3;ucuVVC5~e~ zL0~*H+O!z>v^j#Fo``Y?vl_ix3y2B3`4A-}j^c`#m637SuVSm=uuFBph%sM@n-oYvTpLawwLJ_Cy8&U=0xOcAq8CK(M`EfL3%IkK9CeJ8Gv2!u|EPuA-K zfRHH6$X&)CB-28ACGfv&3OGEv@@pq{xK517y192`_H|;0GRM3PE4mw-c`8{8YAV2| z6UU5CE4g>9&;NZK3;+2xbT#(m@hidtSDZhiORjfpCZD|aDKylhITvzd>pH6Vb_fFv zl44(sfloTjowhD0jtqlhIccCm9S0W=Cp#8K^gi!;B`WwnB-BK3PH+tm3R8+u?hbV9 zmc?czv~izs6a?NPXH1sNVL%E(iY@Ji0)T}28~0J&ZuEJSMZBoQ-A()lU3il}6ZSSb zz@$@zP!>kNL8s*L7`b@w)6-oNG-EW0geyf{B^0y!y?`gv?hb5rJR_~+g910y-Hi9F zpRI@He$Oq>h|nOd*b=d+Qjh2@mgMa&rCH(4!7k-QW@hm3gX3@#Mr+(-#^*uggcvv! zPSO+YkB`Lu)PgYFb#F^SHa!`QuV_eY>8hliJPWOdro~8dJ0u_z4E3QYYZ+=$G%TXGc?}11p zoBHjM(-UF@G07sjXEt1Q>nClSPz?o%ORF;{Ru{+T4X(}~np~~!l{g(fl{gmTTP;K> zqW48egzK=mmwW2-VTbDdA&2Vq-w)Lb0}s`c{14TEa3+5BGh`S+DuI-2=g~k}_4pcw zKiXb?aP&sE`AOREUH$-EZ+=DY#B%fVb=$j?JF;DWUs;Q8hfXwARrQ%b}|(d9e=R5D>@LWD047WUi3BhW0oyz|JjEb*TT#K=q) zMC}#AlAZg(oI+y3pD%vP4FpOfX@G&4nuh8u3MwOX%2e|%V3ab8Pm@?0x;#F-julxP zf3%~8+(8^H!=G5IP99GWFOVH4f4w8K*RSRKJbt@lRD|C%#28abwixsSVXk7QAz%=O z4wl)}-6WTx4>~Ag${RL5&jXV}=#E)G_K!a>6LZZNtJe-*h9VV8-aZQq zmwxA$oQJ3A_uH=0%iJW6fb`z23`5dEVuZuman^`Gg}N`6J%9Xq{XJZua=mXPyB6nN zdFB$PJ*Hb%kIkD4n?dJbPuzJ5Y>Hfg!x}QnKv@GBT_-!~ckZd#UP<-2t@AzKN7t@_2a@+Z! zv`H-o4&Gv!<&J(tnHblDaKwaEDm|4$`R=2zoPvz-R>7HPx@WVc+DwlOy>fGn7y?dG0c0ekTklvUep5MHbj?D!;n|Jzj zH>@6^x!vfAz(95AB&&TN*IM`Q({mT;+bj*aJkC3B7q^MKjjf%5A3HZ`ks27USluks zYY`lgu;b!Y)8AM`tdsd}!fq>h^rcVC_U}=oP5H8vp%4BMy z-*jnHF-6Lhs|P!wEjxrIRDj>)}|v|#JDgK%(>oU4`wog5=l zM&JFmvtD&y&W{yu1(3vnLvueIC*S%dN1YnB@yDwgoAIewuJO+4u;h`}ylc~lyTp${ z&U~!FlGo@as_>8l4LPaisk`@-H5JFc+x!xe^`o_%6wMOYFfUM2)RIs$heA{s?Nh` z1AGej(lb^VB$Te~oE|`iUp)~wsGL4jZcm$i_P#59X0~1)^ioV%OpkJ$`0bX(o1E`0 zb8RdmcHG6_%y0p&Aa*duFJLDpoF{FzjKmyg7oI~nHwH2R(P{~JX*UKw(yl-$YS%9K ztN7#0cyZ{9gE4Y)X=&xt@CplmrU9G>I>q4NLl#zrv2kZe{0WwHnB_&6%K*2 zeh3m}wG9GAQTsa-#s9SJ?~p%kC4Y9WOZ=<#IyV-w3ahkrczdy)n$^o!ey5|%r&{l- zmz<}Ce3l!OT;-n~5O^GZaGG}9+%pfNd=Qy~QD;K)DRZYTRh`5@F1vSUE>AeTE-&4o zwCP?1_Z&(9d>2-bF{N3q!QLB4-#kim;&q!q$|vWl&b69A=C&==W*1tu^^yoni1gQ! zO)UqFB0ba^tJ3=jE=OlrgxGs^(pyX+z?-S?mSCoUlC#_@r#xfkejmOl@*hJDVea(G z9z#hTm%DI=^d6rvbLCY(oqzANtw)yss5iWhX(*V+Z7f*VhBXOsX=szb0I4V^=owi6 z*t@h0b97}9ZfU_J75yp$JhOb-wnnvhvlQ=c#YC#9!euAW zVz~S&Hd7Ny$}Hd6h5MhX5D+po;Hb88g3*-)go8s%d6EJhSV(m>A)v*Dxb1yQe+M@f zVU9M;{8sJC*nDQ~=v(^<>?VkEj9t?G3<6q?B^aEtqKpQk24y04RjFw;s~>x1MXhsR z-Po){ercVN<^Mew(ZjVEBj~jp~8TDXZH5B0TnjjfU%glyd$-&Z`Dhq-_43sH%OnNA{nDq^;axK{4~+ z$iFor#qz{{#T_uw@GLcaBsx+>bb+baifvqYfk}Kqg1=+Or!Z%?cvF&;@ST!mA*H*W zceGtVf^8*>asJb6L8{{R6j!u`B^^as{Jf>}RfLD+$kExmc#5wKeoOM9m|78ay?zB? ze5~eH?+gbw^LfHgr#w}HrIYEZVYPE4q8NOO46NDLCHWE=JJ_BelzidCewl0``FCP?~~{ABhbKz3pIW&m6Ma>n;*<+@_%ezd8{X!m zC>)HnQfdsDB`*eXU}c=ethN(eZFD@4-(vt7l9%y=Fi>KM%YJrtXhfFA$ z1T3kv^NQIm#Ch?ji>Van#jSdgL1*9%p{2eSTY)(1eD!9X4}QNxzcN?+WBCgRMDyib z`|mkr{ublpR zT>M|WPQDW7{Kw((zrz0-{qQfi2I)WGe~pFsD~rEwb^VJ)HT6GNX@Bxz{uTaL7y7^8 zDfIt<|C>YoulT?EP5*`8Vf+XFFJ9EYa`<