From 55f9af71c1659668d7b2d0932f60a52cadbfa78f Mon Sep 17 00:00:00 2001 From: 2211275 <2211275@stud.hs-mannheim.de> Date: Sun, 19 Apr 2026 15:51:15 +0200 Subject: [PATCH] feature matrix price plans, survey --- DMS_paper15_gitlab.tex | 92 ++++- ...oper_survey_collab_tools_documentation.png | Bin 0 -> 15660 bytes literatur/dms.bib | 391 ++++++++++++++++++ other/statistics.ods | Bin 0 -> 18108 bytes 4 files changed, 462 insertions(+), 21 deletions(-) create mode 100644 bilder/stack_overflow_developer_survey_collab_tools_documentation.png create mode 100644 other/statistics.ods diff --git a/DMS_paper15_gitlab.tex b/DMS_paper15_gitlab.tex index a810fe5..db51b44 100644 --- a/DMS_paper15_gitlab.tex +++ b/DMS_paper15_gitlab.tex @@ -7,6 +7,8 @@ \usepackage{multicol}[] \usepackage{blindtext} \usepackage{float} +\usepackage{booktabs} +\usepackage{makecell} \usepackage{fancyhdr} \usepackage{geometry} @@ -15,6 +17,8 @@ \usepackage{acronym} \usepackage{hyperref} +\usepackage{amsmath} + \usepackage{biblatex} \graphicspath{ {./bilder/} } @@ -23,7 +27,7 @@ a4paper,margin=25mm } -\title{\huge{Dev Ops mit Microservices - Gitlab}} +\title{\huge{Dev Ops mit Microservices - GitLab}} \date{\today} \author{ \begin{tabular}{ccc} @@ -41,7 +45,7 @@ \pagestyle{fancy} %... then configure it. \fancyhead{} % clear all header fields - \fancyhead[L]{Gitlab} + \fancyhead[L]{GitLab} \fancyhead[R]{DMS - DevOps mit Micro Services} \fancyfoot{} % clear all footer fields \fancyfoot[LE,RO]{\thepage} @@ -59,48 +63,94 @@ \tableofcontents \section{Einleitung} + + \subsection{Motivation} + + \textbf{\ac{CI}} ist eine Methodik zur Softwareentwicklung. Ziele der Vorgehensweise sind die Erstellung von qualitativen Quellcode, durch stetiges Überprüfen der Funktionalität des verfassten Code. Der Entwicklungsstand einer Software liegt innerhalb des sogenannten Hauptzweiges. Entwickler nehmen fortlaufend kleinere Änderungen vor und bauen diese innerhalb kurzen Entwicklungszyklen in den Hauptzweig ein. Der Entwickler stellt eine Anfrage, ob sein Code in den Hauptzweig aufgenommen werden kann (Pull Request). Damit eine korrekte Funktionsweise des Hauptzweiges sichergestellt werden kann, wird jeweils eine Reihe an Tests durchgeführt. Schlagen diese Tests fehl, so muss der Entwickler seine Änderungen ausbessern und den Prozess erneut anstossen und wiederholt diesen Schritt solange bis die Tests erfolgreich sind. Die Änderungen können somit in den Hauptzweig übernommen werden (Merge). + Häufig findet \ac{CI} in Kombination mit agiler Projektmethodik statt. \cite{arefeen_continuous_2019}.\\ + \textbf{\ac{CD}} beschreibt den durch \ac{CI} notwendigen Aspekt der Automatisierung. Eine manuelle Durchführung der Tests benötigt einen höheren zeitlichen Aufwand und kann fehlerhaft durchgeführt werden. Zu den Vorteilen von \ac{CI}/\ac{CD} zählen eine frühe Fehlererkennung und schnellere Entwicklungszyklen. + GitLab ist eine Plattform, die es ermöglicht \ac{CI}/\ac{CD} in Verbindung mit agiler Entwicklung umzusetzen. + Nach der jährlichen Entwicklerumfrage von Stack Overflow, ist GitLab, mit 35.6 \%, neben GitHub, mit 81.8 \%, und Jira, mit 46.4 \% eine der meistgenutzten Plattformen zur Dokumentation und zur kollaborativen Zusammenarbeit an Code \cite{2025StackOverflow}. Siehe \ref{fig:stackoverflow-devsurvey-tools} + \begin{figure}[H] + \includegraphics[width=\linewidth]{bilder/stack_overflow_developer_survey_collab_tools_documentation.png} + \caption{Auswahl der 10 meist verwendeten Dokumentations- und Kollaborations Werkzeuge nach Stack Overflow Survey 2025 \cite{2025StackOverflow}} + \label{fig:stackoverflow-devsurvey-tools} + \end{figure} + Diese wissenschaftliche Ausarbeitung beschäftigt sich damit, inwiefern sich die von GitLab v18.11 bereitgestellten Werkzeuge bzw. Möglichkeiten eignen um eine beispielhafte Anwendung zu entwickeln, zu testen und einzusetzen. Ebenso wird betrachtet in welchen Punkten sich die Implementierung von \ac{CI}/\ac{CD} in GitLab zu seinem Mitstreiter GitHub unterscheidet. \subsection{Softwarelösung} - Gitlab ist eine mit Git kompatible Plattform für Code-Hosting. Der Code von Gitlab ist in Ruby verfasst \cite{degeler_gitlab_2014}. Unter der Haube verwendet Git die relationale Datenbank PostgreSQL. Auf Gitlab kann mithilfe einer Weboberfläche zugegriffen werden \cite{gitlab_about}: - Gitlab kann in folgenden unterschiedlichen Formen genutzt werden: + GitLab ist eine mit Git kompatible Plattform für Code-Hosting. Der Code von GitLab ist in Ruby verfasst \cite{degeler_gitlab_2014}. Unter der Haube verwendet Git die relationale Datenbank PostgreSQL. Auf GitLab kann mithilfe einer Weboberfläche zugegriffen werden \cite{gitlab_about}: + GitLab kann in folgenden unterschiedlichen Formen genutzt werden: + \begin{itemize} - \item \textbf{\ac{SaaS}} Die Plattform wird innerhalb der Cloud von Gitlab gehostet. - \item \textbf{Selbst gehostet} Gitlab kann auf linux-basierten Servern selbst betrieben werden. - \item \textbf{Dediziertes \ac{SaaS}} Für Unternehmen und Regierungen kann Gitlab in eigenen isolierten Instanzen verwendet werden, um hohe Sicherheitsstandards zu gewährleisten. - \end{itemize} + \item \textbf{\ac{SaaS}} Die Plattform wird innerhalb der Cloud von GitLab gehostet. Die Arbeit mit GitLab kann sofort gestartet werden. + \item \textbf{Selbst gehostet} GitLab kann auf linux-basierten Servern selbst betrieben werden. Installation, Konfiguration und Administration der Infrastruktur muss selbst übernommen werden. + \item \textbf{Dediziertes \ac{SaaS}} Für Unternehmen und Regierungen kann GitLab in eigenen isolierten Instanzen verwendet werden, um hohe Sicherheitsstandards und gesetzliche Regulierungen zu gewährleisten. + \end{itemize} + + Für die \ac{SaaS}- und die selbst gehostete Variante von GitLab gibt es drei unterschiedliche Preispläne: Free, Premium und Ultimate. Tabelle \ref{tab:saas_plans} zeigt eine Auswahl an Funktionalitäten und deren Verfügbarkeit nach Preisplan. In der selbst gehosteten Variante von GitLab sind die technischen Limitierungen Nutzeranzahl, Rechnungszeit und Speicher von der Bereitstellung eigener Serverkapazitäten abhängig. Die Verfügbarkeit der restlichen Funktionalitäten ist analog. + \begin{table}[H] + \begin{tabular}{@{}llll@{}} + \toprule + & \multicolumn{3}{c}{Verfügbarkkeit} \\ \midrule + Preisplan & Free & Premium & Ultimate \\ \midrule + Nutzerzahl & 5 & $\infty$ & $\infty$ \\ + \makecell[cl]{Rechnungs-\\zeit} & 400 min & 10000 min & 50000 min \\ + Speicher & 10 GiB & 500 GiB & 500 GiB\\\midrule + \ac{CI}/\ac{CD} & X & X & X\\ + \makecell[cl]{Container-\\Scan} & X & X & X\\ + Web \acs{IDE} & - & X & X\\ + Pushregeln & - & X & X\\ + \makecell[cl]{Integrierte\\Testfälle} & - & - & X\\ \midrule + \makecell[cl]{Zeitracking} & X & X & X\\ + Wikis & X & X & X\\ + \makecell[cl]{Issue-\\Gewichte} & - & X & X\\ + \makecell[cl]{Projekt-\\analyse} & - & X & X\\ + \makecell[cl]{Statusseite} & - & - & X\\ + \midrule + Preis & 0\texteuro & \makecell[cl]{29\texteuro je$\frac{\text{Nutzer}}{\text{Monat}}$} & \makecell[cl]{kunden-\\spezifisch}\\ \bottomrule + \end{tabular} + \caption{Auswahl an Funktionalitäten und deren Verfügbarkeit, nach Preisplan \cite{gitlab_about}} + \label{tab:saas_plans} + \end{table} + \subsection{Geschichte} - Gitlab wurde von Sytse Sijbrandij und von Dmitriy Zaporozhets gegründet. Zaporozhets entwickelte Gitlab 2011 als Hilfsmittel für seine eigenen Projekte. Gitlab war zu dem Zeitpunkt eine private und freie Plattform zum eigenen Code-Hosting, entwickelt von Zaporozhets. Nachdem Zaporozhets sich entschied den Quellcode von Gitlab frei zugänglich zu machen, entstand die Partnerschaft mit Sijbrandij. Um den Einstieg in die Nutzung von Gitlab zu erleichtern entschieden sich Sijbrandij GitLab als \ac{SaaS} unter der Domain \url{https://gitlab.com/} anzubieten. Der Quellcode von Gitlab ist frei unter \url{https://gitlab.com/gitlab-org/gitlab} verfügbar \cite{degeler_gitlab_2014}. 2014 wurde Gitlab erstmalig als Unternehmen eingetragen und erfuhr seitdem einen grossen Zuwachs an Mitarbeitern. Aktuell zählt Gitlab mehr als 2600 Mitarbeiter, die über 65 Länder verteilt leben \cite{gitlab_about}. Gitlab selbst besitzt keinen ausgebauten Firmenhauptsitz, da Mitarbeiter hauptsächlich remote arbeiten und freie Verfügung über ihre Arbeitszeit haben \cite{choudhuryGitLabWorkWhere2020}. Gitlab finanziert sich durch Spenden um neue Funktionalitäten zu realisieren. Ein weiterer Teil der Einnahmen kommt durch den Abschluss von Abonnements der Enterprise-Edition \cite{degeler_gitlab_2014}. - Abbildung \ref{fig:gitlab-logo} zeigt das Logo von Gitlab. Es besteht aus einem Tanuki, einem in Japan heimischen Waschbärhund, und dem Gitlab Schriftzug. + GitLab wurde von Sytse Sijbrandij und von Dmitriy Zaporozhets gegründet. Zaporozhets entwickelte GitLab 2011 als Hilfsmittel für seine eigenen Projekte. GitLab war zu dem Zeitpunkt eine private und freie Plattform zum eigenen Code-Hosting, entwickelt von Zaporozhets. Zaporozhets und Sijbrandij lernten sich auf der \href{https://thenextweb.com/conference}{The Next Web} Konferenz kennen. Nachdem Zaporozhets sich entschied den Quellcode von GitLab frei zugänglich zu machen, entstand die Partnerschaft mit Sijbrandij. Um den Einstieg in die Nutzung von GitLab zu erleichtern entschieden sich Sijbrandij GitLab als \ac{SaaS} unter der Domain \url{https://gitlab.com/} anzubieten. Der Quellcode von GitLab ist frei unter \url{https://gitlab.com/gitlab-org/gitlab} verfügbar \cite{degeler_gitlab_2014}. Der Quellcode des Konkurrenten GitHub ist nicht frei zugänglich. 2014 wurde GitLab erstmalig als Unternehmen eingetragen und erfuhr seitdem einen grossen Zuwachs an Mitarbeitern. Aktuell zählt GitLab mehr als 2600 Mitarbeiter, die über 65 Länder verteilt leben \cite{gitlab_about}. GitLab selbst besitzt keinen grossen ausgebauten Firmenhauptsitz, da Mitarbeiter hauptsächlich remote arbeiten und freie Verfügung über ihre Arbeitszeit besitzen. Der organisatorische Aufbau und der Ablauf interner Prozesse von GitLab, können in dem von GitLab öffentlichem Handbuch \url{https://handbook.gitlab.com/} nachgelesen werden \cite{choudhuryGitLabWorkWhere2020}. + GitLab finanziert sich durch Spenden um neue Funktionalitäten zu realisieren. Ein weiterer Teil der Einnahmen kommt durch den Abschluss von kostenpflichtiger Abonnements. \cite{degeler_gitlab_2014}. + Abbildung \ref{fig:gitlablogo} zeigt das Logo von GitLab. Es besteht aus einem Tanuki, einem in Japan heimischen Waschbärhund, und dem GitLab Schriftzug. \begin{figure}[H] \centering \includegraphics[width=0.8\linewidth]{./bilder/gitlab-logo-100-rgb.png} - \label{fig:gitlab-logo} - \caption{Logo Gitlab} + \caption{Logo GitLab} + \label{fig:gitlablogo} \end{figure} - Gitlab erregte in mehreren Fällen mediale Aufmerksamkeit auf sich. 2017 verlor die \ac{SaaS}-Lösung von Gitlab sechs Stunden an Nutzerdaten, aufgrund von einer menschlichen Fehlreaktion, ausgelöst durch Spamanfragen die in Problemen mit der Datenbank resultierten \cite{GitLabcomDatabaseIncident}. Ebenso bestanden 2022 Pläne inaktive Repositories löschen. Nach starker Kritik wurde sich dazu entschieden, anstatt zu löschen, zu archivieren \cite{onlineVersionsverwaltungGitLabRudert2022}. + GitLab erregte in mehreren Fällen mediale Aufmerksamkeit auf sich. 2017 verlor die \ac{SaaS}-Lösung von GitLab sechs Stunden an Nutzerdaten, aufgrund von einer menschlichen Fehlreaktion, ausgelöst durch Spamanfragen die in Problemen mit der Datenbank resultierten \cite{GitLabcomDatabaseIncident}. GitLab wagte im Oktober 2021 den Gang an die Börse und ist aktuell als Aktie im \ac{NASDAQ} unter dem Kürzel: GTLB erhältlich \cite{teamGitLabIncGTLB}. + Ebenso bestanden 2022 Pläne inaktive Repositories löschen. Nach starker Kritik wurde sich dazu entschieden, anstatt zu löschen, zu archivieren \cite{onlineVersionsverwaltungGitLabRudert2022}. \subsection{Aufbau} - Zusammenarbeit in Gitlab ist in Form von Gruppen organisiert. Diese können in Subgruppen unterteilt werden. Gruppen und Subgruppen können Projekte und Mitarbeiter zugeordnet werden. + Zusammenarbeit in GitLab ist in Form von Gruppen organisiert. Diese können in Subgruppen unterteilt werden. Gruppen und Subgruppen können Projekte und Mitarbeiter zugeordnet werden. Jedes Projekt besteht aus einer Issue-Seite, einem Wiki und einem Code-Repository. \cite{gitlab_gitlab_nodate} - % Vergleich von Features mit Github möglich + % Vergleich von Features mit möglich \subsection{Funktionalitäten} + \section{CI/CD} %https://docs.gitlab.com/topics/build_your_application/ - \subsection{Einführung} - \subsection{Gitlab Runner} + + \subsection{GitLab Runner} \subsection{Pipelines} \subsection{Jobs} \subsection{CICD-Komponenten} + \subsection{GitLab vs. GitHub} \section{Anwendungsbeispiel} @@ -124,20 +174,20 @@ \section{Diskussion} - \ac{CI/CD} \section{Ausblick} \section{Zusammenfassung} - - Hallo Welt \cite{arefeen_continuous_2019} \subsection{Geschichte} \section*{Abkürzungsverzeichnis} \begin{acronym}[Abkürzungsverzeichnis] - \acro{CI/CD}{Continuous Integration/Continous Delivery} + \acro{IDE}{Integrated Development Environment} + \acro{CD}{Continous Delivery, kontinuierliche Auslieferung} \acro{SaaS}{Software as a Service} + \acro{CI}{Continuous Integration, kontinuierliche Integration} + \acro{NASDAQ}{National Association of Securities Dealers Automated Quotations} \end{acronym} \printbibliography diff --git a/bilder/stack_overflow_developer_survey_collab_tools_documentation.png b/bilder/stack_overflow_developer_survey_collab_tools_documentation.png new file mode 100644 index 0000000000000000000000000000000000000000..54bdfd1e0ccc85d4d1208ed441df38165f3d36c0 GIT binary patch literal 15660 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