5.1.1. Arbeit mit git im WiTTFind Projekt¶
Jede Mitarbeit, jedes Programmieren im WiTTFind Projekt muss über das gitlab koordiniert und dort abgelegt werden. Nutzer unseres gits bekommen einen Zugang vom Sysadmin freigeschaltet.
5.1.1.1. Einloggen in das gitlab (mit Passwort und mit ssh-key)¶
Damit man optimal mit unserem gitlab arbeiten kann, muss man sich einen SSH-KEY zwischen dem eigenen Rechner und unserem GIT-LAB Server einrichten. Wie das geht findet Ihr
hier: http://doc.gitlab.com/ce/ssh/README.html
und
hier: https://gitlab.cis.uni-muenchen.de/help/ssh/README#generating-a-new-ssh-key-pair
Der SSH-Key muss dann in ihrem Benutzerprofil für jeden Rechner, mit dem Sie am gitlab arbeiten eingetragen werden:
siehe hier: https://gitlab.cis.uni-muenchen.de/profile/keys
5.1.1.2. Git von der Kommandozeile¶
Wir arbeiten im Allgemeinen mit dem git von der Kommandozeile aus, nur bei kleinen Änderungen verwenden wir die Browser gitlab Funktionen.
5.1.1.3. Git Command-Line tool für Windows¶
Ein sehr gutes Command-Line Tool für Windows gibt es hier: https://git-scm.com/download/win
5.1.1.4. Kommentare und Readme Files im Markdown Format¶
Erläuterungsfiles, Notizen und Bemerkungen im gitrepository bitte im Markdown-Format schreiben (Extension .md).
Dann kann man die Texte etwas formatieren und das gitlab zeigt es auch formatiert an.
siehe: https://guides.github.com/features/mastering-markdown/
5.1.1.5. Hier ein Artikel zu git bei Heise.de¶
https://www.heise.de/download/product/git-57506
5.1.1.6. Weitere Bemerkungen zu git:¶
Hier sind zwei Foliensätze von Florian Fink, auf denen Details von git erklärt werden.
Foliensatz 1 : https://www.cis.uni-muenchen.de/~finkf/ss15/slides4.pdf
Foliensatz 2 : https://www.cis.uni-muenchen.de/~finkf/ss15/slides5.pdf
Für einen schnellen Einstieg bzw. eine Wiederholung der wichtigsten Feature empfehlen wir diesen Link
5.1.2. Branching model¶
In unserem Projekt wird das in der Praxis bewährte git branching model von hier in wittfind-web
und in wittfind-data
verwendet.
Jede Arbeit in unserem gitlab muss sich auf ein Issue beziehen. Issues werden von der WiTTFind Oberfläche über die FeedbackApp erstellt (siehe nächstes Kapitel)
5.1.2.1. Anlegen eines Issues über die FeedbackApp¶
Mit Feedbackapp von wiTTFind können sie ein Issue erzeugen: hier : http://wittfind.cis.lmu.de/?feedback. In dem Issue, das sie nun anlegen, soll genau beschrieben werden, was bearbeitet wird. Die Feedback-App erstellt gitlab automatisch ein Issue in unserem gitlab mit einer eindeutigen Nummer (z.B. 447)
Hier finden Sie einen Überblick über alle Issues der WAST-Tools: hier
5.1.2.2. Ermitteln eines branch Namen¶
Mit der Issuenummer, das die Feedbackapp ins gitlab geschrieben hat (z.B. 447) muss man einen neuen Branch anlegen.
Der Name des branches soll sich an folgende Syntax halten: feature/XXXX-issue-447
unter XXX bitte einen “klingenden” Namen eintragen, der das Thema dieses Issues wiederspiegelt.
5.1.2.3. Abzweigen vom Master-branch in den neuen branch¶
Im repository gibt einen master
Branch.
zuerst auf Branch master (normalerweise ist das der Default)
git checkout master
neuen Branch anlegen und abzweigen vom Branch master (normalerweise ist das der Default)
git checkout -b feature/XXXX-issue-447
5.1.2.4. nun beginnt die Arbeit unter diesem branch ….¶
Alle Veränderungen werden geloggt und können mit git status
angezeigt werden. Wenn Sie mit Ihrer Arbeit an einem Punkt angekommen sind, wo sie Unterstützung brauchen, denn können Sie ihren Branch auch pushen und Fragen in der comment-Message stellen.
5.1.2.5. Fragen an die Mitprogrammierer¶
Wenn Sie während der Arbeit Fragen an die Mitprogrammierer oder den Projektmanager haben, dann können Sie das als comment-Message in ihrem Issue stellen. Schicken Sie mit ihrer Message eventuell einen screen-shot mit. Schicken Sie aber keine Programm oder Datendateien mit ihrer gitlab-Message. Nutzen sie ihren Branch um Dateien mitzuschicken.
5.1.2.6. Wenn Sie mit der Arbeit fertig sind, dann gilt es die Datei in GIT Repository zu pushen¶
Es ist ganz wichtig, dass beim
zuerst die zu pushenden Dateien adden (Wildcards sind zugelassen)
git add file
git add **
läuft rekursiv durch alle Verzeichnisse und “added” alle Files
Datei lokal commiten
git commit -m "Message"
Datei vom feature Branch nach REMOTE pushen
git push -u origin feature/XXXX-issue-447
5.1.2.7. Merge Request¶
Der master
Zweig aller Repositories ist per default nur für die owner
des Repository freigegeben. So muss jeder andere einen merge Request nach master
stellen.
In der Merge Request Beschreibung sollten unbedingt folgende Punkte berücksichtigt werden:
Eine klare Beschreibung, was der Merge Request genau implementiert.
Ein Verweis auf das Ursprungsissue (falls vorhanden) sollte gesetzt werden. Um auf das
WAST/wittgenstein-issues
Repository zu verweisen, muss die Cross-Projekt-Referenznummer verwendet werden, beispielsweise:wast/wittgenstein-issues#508
Dieser entsprechender Verweis findet sich auf der jeweiligen Issuebeschreibungsseite.
Um den bestreffenden Issue oder auch mehrere Issues automatisch nach Annahme des Merge Requests zu schließen, kann das issue closing pattern verwendet werden:
Closes wast/wittgenstein-issues#508 Fixes wast/wittgenstein-issues#508 and wast/wittgenstein-issues#509 Closes wast/wittgenstein-issues#508,wast/wittgenstein-issues#509 and wast/wittgenstein-issues#510
Nachdem der Merge Request angenommen wurde, werden die im Beschreibungstext referierten Issues automatisch geschlossen. Dazu wurde die GitLab Instanz speziell angepasst : sofortiger Deploy auf dev.wittfind.cis.uni-muenchen.de
5.1.2.7.1. Probleme bei Merge Requests mit GitLab: Manuelles Mergen¶
Wenn das GitLab Probleme bei Automatischen MERGE-Befehlen hat, dann muss das Mergen Manuell mit git-Befehlen realisiert werden.
Der einzige benötigte git-Befehl dafür ist git merge <source branch>
.
Wenn also Branch feature/issue-1
nach development
gemerged werden soll, schaut es folgendermaßen aus:
Zielbranch (hier
development
) auschecken:git checkout development
Merge vollziehen:
git merge --no-ff feature/issue-1
Eventuell entstehen hier Mergekonflikte - git erklärt hier aber genau, was zu tun ist. Falls ich den Source-Branch noch remote löschen möchte, geht das über git push :<source branch>
- besonders wichtig ist hierbei der Doppelpunkt.
5.1.3. Continous Integration¶
Das gitlab, mit dem die WAST-tools gemanaged werden, arbeitet mit der Technik: Continuous Integration, siehe dazu auch hier.
Repositories, bei denen der gitlab ci Runner aktiviert ist und eine gitlab-ci.yml
Datei im Root-Verzeichnis des Repositories existiert, starten bei jedem push eine sogenannte “Continous Integration” (CI). Man nennt dies ausrollen des branches. Die “CI” arbeitet die Befehle in der yaml Datei gitlab-ci.yml
ab.
Alle Befehle, die zum “Ausrollen” eines pushes innerhalb eines Repositories notwendig sind werden von den Programmierern des Repositories in der yaml Datei gitlab-ci.yml
definiert. Der Anweisungen in der yaml Script-Datei orientieren sich an den üblichen Techniken der UNIX-Shell Programmierungen und Makefiles, wurden aber gegenüber der UNIX-Shellprogrammierung und Makefiles um zahlreiche Erweiterungen ergänzt.
Das zentrale Konzept in einer gitlab-ci sind sogenannte jobs
, die in pipelines
zusammengefasst werden. jobs
erinnern an die targets in Makefiles. Es gibt vordefinierte jobs, wie before-script:
(hier werden z.B. Environmenvariablen definiert, die für die Ausführung der Befehle notwendig sind). Jeder Job kann Konfigutations-Parameter definieren, die genau festlegen, wann und in welchem Kontext die nachfolgenden Befehle ausgeführt werden.
Ein spezieller Job sind die sogenannten stages
die unterschiedliche Integrationsebenen definieren, an denen der ci-Runner die Anweisungen abareiten soll. Sollte in einem “stage” ein Fehler passieren, bricht der ci-Runner die Arbeit ab.
Im allgemeinen verwendet man die drei stages
build
check
deploy
Jeder Job legt kann in seinen Konfigurationsparameter stages
festlegen, bei welcher Integrationsebene er aktiv werden soll.
Ähnlich zu Makfiles werden im yaml-skript auch Dependencies definiert, die auf andere jobs verweisen, die Befehlsfolgen definieren, die abzuarbeiten sind.
Soll ein Job in einer yaml Datei auskommentiert werden, setzt man dem Jobnamen einen Punkt voran. Es wird dann ein hidden-job
definiert.
Hidden-Jobs
können aber auch als Template-Jobs verwendet werden, die später an beliebiger Stelle eines anderen Jobs eingeführt werden. Den hidden-jobs
wird ein Anchornamen nachgesetzt, die Einfügestelle in einem andern Job wird mit einer “merge-Anweisung” definiert.
.my_template_test: &test
script:
-make test
testing:
<<: *test
script:
- make deploy
5.1.3.1. wichtige ci Konfigurationsparameter¶
Ein sehr wichtiger Konfigurationsparameter der ci-integration ist only <branchname>
. Er legt fest, bei welchem branchname
der job aktiviert werden soll.
z.B. only master
: Nur wenn was auf den master
branch gepushed wird, werden die Anweisungen des jobs ausgeführt.
5.1.3.2. Probleme mit der ci im Team¶
Es stellt ein großes Problem in der Teamarbeit dar, wenn jeder push in ein Repository sofort ausgerollt wird, was ja das Default-verhalten der ci-Technik vorschreibt.
Im WAST gitlab wird jeder push
nach
master
auf unserem Produktion-Server (cast1) ausgerollt: : sichtbar unterwittfind.cis.lmu.de
alle anderen pushes werden auf dem Testing-Server (cast2) ausgerollt: sichtbar unter
dev.wittfind.cis.lmu.de
ACHTUNG: Wenn die Teamprogrammierer sich nicht absprechen, oder auf unterschiedlichen Branches unterschiedliche Arbeiten ausführen, überlagert jeder push in ein Repository sofort den vorherigen push. Programmierer sind überrascht, wenn plötzlich die vorherige Arbeit der Kollegen auf dev.wittfind.cis.lmu.de
verschwunden ist.
So muss sich das Team absprechen
was in welchem branch gepushed wird
oder einen gemeinsamen branch definieren z.B.
development
an dem zentral gearbeitet wird und in den die branches, sobald ein erfolgreicher Zwischenschritt programmiert ist, gemerged werden.
Durch gezieltes Starten eines vorherigen runner-Laufes könnte aber jederzeit ein beliebiger push im Repository wieder aktiviert werden.
Es gäbe mit dem Parameter except
die Möglichkeit branches vom Ausrollen auszuschliessen.
5.1.4. Für gitlab Adminstratoren¶
5.1.4.1. Release¶
Um ein Release, beispielsweise für den Meilenstein 15.7 vorzubereiten, sind folgende Schritt notwendig:
setzen in den
master
Zweig,git checkout master
git push origin master
Der Release-Zweig mit dem Namen
release/15.7
wird auf demmaster
Zweig erstellt:git checkout master
git checkout -b release/15.7 master
Danach wird die Versionsangabe in
config.default
auf"Version": "15.7"
angehobenDie geänderte Version von
config.default
wird dann dem Release-Zweig hinzugefügt:git add config.default
git commit -m "Bump version to 15.7"
Danach gibt es einen
--no-ff
Merge vonrelease/15.7
mit demmaster
Zweig (das geht bequem per GitLab Oberfläche) oder:git checkout master
git merge --no-ff release/15.7
Nach diesem Merge wird der Zweig
release/15.7
ebenfalls auch noch in dendevelopment
gemergt, damitmaster
unddevelopment
wieder gleich sind. Das geht ebenfalls per GitLab Oberfläche oder:git checkout development
git merge --no-ff release/15.7
Zum Schluss wird ein Tag mit dem Namen 15.7 erstellt und als Beschreibung version 15.7 vergeben:
git checkout master
git tag -a 15.7 -m "version 15.7"
Somit ist der Meilenstein 15.7 erfolgreich nach unserem branching model publiziert worden!
5.1.4.2. Hotfix¶
Um einen Hotfix-Zweig in master
zu integrieren, geht man ähnlich wie beim Release vor:
Der Hotfix-Zweig namens
hotfix/issue-123
wird vommaster
Zweig weggezweigt:git checkout master
git checkout -b hotfix/issue-123 master
Dort werden dann alle Änderungen für den Fix vorgenommen und zu dem Zweig hinzugefügt
Danach wird der
hotfix/issue-123
Zweig inmaster
mittels--no-ff
gemergt:git checkout master
git merge --no-ff hotfix/issue-123
Zum Schluss muss die Versionsangabe erhöht werden - beispielsweise von 15.7 auf nun 15.7.1. Die Nummer am Ende wird für jeden Hotfix dementsprechend erhöht. Dazu wird exakt so vorgegangen wie in Release beschrieben
5.1.4.3. Submodule¶
5.1.4.3.1. Einrichten eines Submoduls:¶
Wenn Repositories die Programme/Daten aus anderen Repositories verwenden sollen, dann können sie über “submodule” in das Repository eingebunden werden. Dazu sind zwei Befehle im geclonten Repository notwendig:
Addiert den masterbranch des Repository (wichtig ist, dass sie den branch explizit angeben!!)
git submodule add -b master git@gitlab.cis.uni-muenchen.de:wast/tokingtagging.git
Initialisiert die git Configuration:
git submodule init
Commit und pushen
git commit -m "submodule init"
git push origin master
5.1.4.3.2. Entfernen eines Submodules:¶
git submodule deinit -f—tokingtagging
rm -rf .git/modules/tokingtagging
git rm --cached tokingtagging
5.1.4.4. git lsf¶
Wenn größere Binärdaten in einem Repository gespeichert werden sollen, dann sollten diese Binärdaten nicht als reguläre Files im Repository gespeichert werden, sondern als git-lfs (git-large-file) File. see: https://git-lfs.github.com/
git lfs install
git lfs track export-data/**
rm -rf .git/modules/tokingtagging
git rm --cached tokingtagging
5.1.5. Meilensteine¶
Zur besseren Versionierung und zum Sammeln bestimmter Aufgaben für einen bestimmen Termin, werden Meilensteinen mit dem Namensschema <Jahr>.<Monat>
angelegt. Ein Milestone definiert einen Zeitraum, in dem er bearbeitet werden muss und ihm werden Issues zugeordnet, die für seine erfolgreichen Abschluss erledigt sein müsssen. Damit Issues über mehrere Repositories verteilt einem Milestone zugewiesen werden können, empfielt es sich einen “Guppen-Milestone” anzulegen. (in neuen gitlab-Versionen möglich)
5.1.5.1. Vorarbeiten zu Meilensteinen¶
Bevor ein Meilenstein angelegt wird, sollten dazu mehrere Feature-Requests erstellt werden:
[Milestone] Juli Update
- dort wird das Fälligkeitsdatum diskutiert (geschlossen wird, sobald der Meilenstein angelegt wurde)[Milestone] Merge development in master
- Mergerequest vondevelopment
inmaster
[Milestone] Releasezweig
- Anlegenrelease
Zweiges inmaster
und indevelopment
[Milestone] Tagging des master Zweiges
- Taggen des aktuellen Stand desmaster
Zweiges[Milestone] Deploy master Zweig
- Deploy desmaster
Zweiges[Milestone] Deploy development Zweig
- Deploy desdevelopment
Zweiges[Milestone] Juli Update - Schließung
- wird geschlossen, sobald alle Issue für den Meilenstein geschlossen sind
5.1.5.2. Namenskonvention bei Meilensteinen¶
Auf jeden Fall sollte der Meilenstein eine klare Beschreibung bzw. Versionierung verwenden. Namen wie “Prä-München” sind nicht unbedingt hilfreich!
5.1.5.3. make deploy auf PERMALINK wittfind.cis.uni-muenchen.de¶
Wenn alles ausreichend getestet wurde, dann kann auf unserem PERMALINK Rechner der Masterzweig deployed werden. Milestone haben fertig!
5.1.6. Aufgabe zu git:¶
aktivieren Sie den für Sie vom CIS bereitgestellten gitlab-Account bei gitlab.cis.lmu.de • generieren sie ssh-Keys (mit oder ohne Passphrase), und legen Sie ihren Public(!)-Key an der dafür vorgesehenen Stelle in gitlab ab (im Notfall lesen Sie Dokumentation! Einmal: ‘generate ssh keys’ und die gitlab- Dokumentation: ssh keys adden.) • nun loggen Sie sich in gitlab ein – clonen Sie dieses Repository auf ihren Rechner (von dem aus Sie ihren Public-Key erstellt und hochgeladen haben)
wechseln Sie in den development Branch.
im development Branch finden Sie die Fortsetzung der Aufgabe:
aufgabe_git.md
: https://gitlab.cis.uni-muenchen.de/wast/wast-master-2019/blob/development/aufgabe_git.md