diff --git a/diagrams/omnibus_arch.tex b/diagrams/omnibus_arch.tex new file mode 100644 index 0000000..cf33eb9 --- /dev/null +++ b/diagrams/omnibus_arch.tex @@ -0,0 +1,55 @@ +% Architekturdiagramm der GitLab-Omnibus-Komponenten +% Einbinden im Hauptdokument: +% \usepackage{tikz} +% \usetikzlibrary{positioning,arrows.meta,fit,backgrounds} +% und an der gewünschten Stelle: +% \input{diagrams/omnibus_arch} + +\begin{figure}[H] + \centering + \resizebox{\columnwidth}{!}{% + \begin{tikzpicture}[ + node distance=6mm and 8mm, + font=\footnotesize\sffamily, + every node/.style={align=center}, + comp/.style={draw, rounded corners=2pt, minimum height=8mm, minimum width=20mm, fill=blue!5}, + store/.style={draw, rounded corners=2pt, minimum height=8mm, minimum width=20mm, fill=green!8}, + ext/.style={draw, dashed, rounded corners=2pt, minimum height=8mm, minimum width=20mm, fill=gray!5}, + arr/.style={-{Stealth[length=2mm]}, thick}, + ] + + % Ebene 1: Eingang + \node[comp] (browser) {Browser / git-Client}; + \node[comp, right=of browser] (nginx) {nginx\\(Reverse Proxy)}; + + % Ebene 2: Anwendungsschicht + \node[comp, below=of nginx] (puma) {Puma\\(Rails-App)}; + \node[comp, right=of puma] (sidekiq) {Sidekiq\\(Hintergrundjobs)}; + + % Ebene 3: Datenschicht + \node[store, below=of puma] (pg) {PostgreSQL\\(Daten)}; + \node[store, right=of pg] (redis) {Redis\\(Cache, Queue)}; + \node[store, left=of pg] (gitaly) {Gitaly\\(Repo-Storage)}; + + % Ebene 4: Add-Ons + \node[comp, below=of pg] (registry) {Container\\Registry}; + \node[ext, right=of registry] (runner) {GitLab Runner\\(extern)}; + \node[ext, left=of registry] (mail) {SMTP-Server\\(extern)}; + + % Verbindungen + \draw[arr] (browser) -- (nginx); + \draw[arr] (nginx) -- (puma); + \draw[arr] (puma) -- (pg); + \draw[arr] (puma) -- (redis); + \draw[arr] (puma.west) to[bend right=20] (gitaly.north); + \draw[arr] (sidekiq) -- (redis); + \draw[arr] (sidekiq.south) to[bend left=15] (pg.east); + \draw[arr] (puma.south) to[bend left=10] (registry.north); + \draw[arr, dashed] (runner.north) to[bend left=15] (puma.east); + \draw[arr, dashed] (puma.west) to[bend left=20] (mail.north); + + \end{tikzpicture}% + } + \caption{Komponenten einer Self-Managed-Instanz im Omnibus-Paket. Gestrichelte Komponenten laufen ausserhalb des Omnibus-Pakets und werden separat angebunden.} + \label{fig:omnibus-arch} +\end{figure} diff --git a/diagrams/pipeline_stages.tex b/diagrams/pipeline_stages.tex new file mode 100644 index 0000000..5353f13 --- /dev/null +++ b/diagrams/pipeline_stages.tex @@ -0,0 +1,55 @@ +% Pipeline-Schema: Pipeline -> Stages -> Jobs mit needs/DAG-Pfeil +% Einbinden im Hauptdokument: +% \usepackage{tikz} +% \usetikzlibrary{positioning,arrows.meta,fit,backgrounds} +% und an der gewünschten Stelle: +% \input{diagrams/pipeline_stages} + +\begin{figure}[H] + \centering + \resizebox{\columnwidth}{!}{% + \begin{tikzpicture}[ + node distance=4mm and 6mm, + font=\footnotesize\sffamily, + every node/.style={align=center}, + stage/.style={draw, rounded corners=3pt, minimum width=22mm, minimum height=6mm, fill=blue!10, font=\bfseries\footnotesize\sffamily}, + job/.style={draw, rounded corners=2pt, minimum width=22mm, minimum height=6mm, fill=white}, + arr/.style={-{Stealth[length=2mm]}}, + dagarr/.style={-{Stealth[length=2mm]}, dashed, red!70!black, thick}, + ] + + % Stage-Header + \node[stage] (s1) {lint}; + \node[stage, right=12mm of s1] (s2) {test}; + \node[stage, right=12mm of s2] (s3) {build}; + \node[stage, right=12mm of s3] (s4) {deploy}; + + \draw[arr] (s1) -- (s2); + \draw[arr] (s2) -- (s3); + \draw[arr] (s3) -- (s4); + + % Jobs unter den Stages + \node[job, below=of s1] (j1) {eslint}; + + \node[job, below=of s2] (j2a) {unit}; + \node[job, below=of j2a] (j2b) {integration}; + + \node[job, below=of s3] (j3a) {bundle}; + \node[job, below=of j3a] (j3b) {container}; + + \node[job, below=of s4] (j4a) {staging}; + \node[job, below=of j4a] (j4b) {prod (manual)}; + + % needs/DAG: container braucht nur bundle, nicht alle vorigen + \draw[dagarr] (j3a.east) to[bend left=10] node[above, midway, font=\tiny\itshape] {needs} (j3b.west); + + % Pipeline-Klammer drumherum + \begin{pgfonlayer}{background} + \node[draw, dotted, rounded corners=4pt, fit=(s1)(s4)(j2b)(j3b)(j4b), inner sep=4mm, label={[anchor=north west, font=\small\bfseries]north west:Pipeline}] {}; + \end{pgfonlayer} + + \end{tikzpicture}% + } + \caption{Aufbau einer Pipeline aus Stages und Jobs. Durchgezogene Pfeile: starre Stage-Reihenfolge. Gestrichelter Pfeil: needs-Beziehung (\acs{DAG}-Modus), die unnötiges Warten verkürzt.} + \label{fig:pipeline-stages} +\end{figure}