Simples deployment via git

Das Problem

Egal ob Homepage, Konfigurationsdateien oder Programmcode: Für praktisch alle Projekte verwendet man heute git.

Möchte man jedoch Versionen automatisch ausrollen (z.B. statische HTML Dateien einer Webseite), benötigt man einige Skripte oder einen Build-Dienst wie z.B. Gitlab-CI, Jenkins oder CircleCI.

Oftmals reicht es jedoch die Daten auf das Zielsystem zu kopieren. Aber auch das geht mit git:

Verteilen von Paketen

Ausgangssituation

Wie haben einen Server (für die Homepage), einen Laptop (für die Entwicklungsarbeit), sowie ein Git-Projekt (z.B. bei Github).
Auf Github befindet sich unser Projekt.
Auf Laptop wie auch auf dem Server haben wir uns mit git clone das Projekt eingerichtet.

Vorgehen

Das Projekt auf dem Server soll beim Empfangen neuer Dateien diese auch in das "Working Directory" schreiben. Dies aktivieren wir mit :

# auf Server, im Projektverzeichnis
git config receive.denyCurrentBranch updateInstead

Nun müssen wir unserem Projekt auf dem Laptop das neue Ziel beibringen:

# auf Laptop, im Projektverzeichnis
git remote add deploy benutzer@servername:/pfad/zu/projektordner/auf/server
# jetzt noch sagen: schiebe den lokalen branch _master_ auf den server (nur 1 mal notwendig)
git push --set-upstream deploy master

Unsere Änderungen können wir weiterhin zu Github schieben:

git push origin

Aber nun auch neu: Auf dem Server direkt ausrollen:

git push deploy

Es ist sogar möglich mittels push-url mehrere Ziele auf einmal zu definieren.

Fazit

Natürlich ersetzt unser kleiner Workflow keinen Build-Server oder ausgetüftelte Deployment Prozesse. Aber für Kleinst-Projekte kann das vorgehen mit updateInstead sehr praktisch sein.

Aber Achtung: Verwenden wir diese Möglichkeit um Webseiten zu versionieren: Nicht vergessen, den .git Ordner nicht auszuliefern.

Kommandozeile mit FZF

Wer viel auf der Kommandozeile/Shell arbeitet, lernt im Lauf der Zeit einige nützliche Tools und Tastaturkürzel kennen.
So stöbert man in bash bzw. zshmit Ctrl+R in der Eingabe-History, sucht mit find Dateien in einem gegeben Pfad - und so weiter und so fort.

Ein nützliches Helferlein, welches die beiden Aktionen (und mehr) beschleunigt
ist fzf:

Read more "Kommandozeile mit FZF"

Sharpkeys

Um Tasten wie Shift-Lock ("Feststelltaste") sinnvoller zu nutzen kann auch unter Windows die Belegung dieser Taste geändert werden.
Da Windows leider (noch) kein Werkzeug hierzu mitbringt, kann man sich einfach mit dem Freeware-Werkzeug "SharpKeys" behelfen.

Einfach installieren, Taste auswählen, neue Belegung auswählen und nach an- und abmelden ist die Taste neu belegt.

Tipp: Die Feststelltaste einfach mit Strg (Ctrl) belegen.

Myrepos: Alle meine Repositories

Repository-Zentrale

Dank VCSH habe ich all meine Dotfiles hübsch in Git-Repositories verpackt.
Das Einbinden eines einzelnen Repositories geht nun zwar schnell von der Hand,
aber wenn nun für vim und mutt und emacs und und und ... lauter
Repositories vorliegen wird es unbequem.
Auch das updaten (pull) jedes einzelnen Repos ist sehr mühselig und damit
fehleranfällig.

Abhilfe schafft hier myrepos (kurz mr),
dass es erlaubt Aktionen auf mehreren Repositories auszuführen.

Read more "Myrepos: Alle meine Repositories"

OS X Keyboard Layout

Das Problem

Als Entwickler nutze ich stetig Sonderzeichen und Symbole wie {, ] oder auch `.

Doch welches Tastaturlayout soll ich einsetzen?
Zwar ist ein englisches Tastaturlayout sehr attraktiv, da dort sämtliche Sonderzeichen gut erreichbar sind. Als Entwickler im deutschsprachigen Raum benötige ich jedoch ständig Umlaute und das ß-Zeichen.

Read more "OS X Keyboard Layout"

Shift Lock sinnvoll nutzen

Shift-Lock

Die Shift-Lock Taste alias "Feststelltaste" ist für die meisten Menschen ein Ärgernis und
Relikt aus der Zeit der Schreibmaschinen.

Doch anstatt die Taste zu deaktivieren oder gar auszubauen kann die Taste auch gut für andere
Zwecke verwendet werden.

Ich habe die Shift-Lock Taste auf die "Ctrl" (Steuerung) Taste gemappt, was Shortcuts wie Ctrl+C in vim deutlich attraktiver macht

So gehts

Read more "Shift Lock sinnvoll nutzen"

Konfigurationsdateien verwalten mit VCSH

Einstellungen

Was ist der erste Schritt bei der Benutzung eines Autos, einer Stereoanlage oder eines Schreibtischstuhls?
Die Einstellungen!
Natürlich will man gut aus dem Fahrzeug sehen können, der Lieblings-Musik lauschen und bequem sitzen.

Doch auch Software hat Einstellungen:

  • Welchen Editor setze ich als Standard?
  • Welche Shell-Erweiterungen lade ich in oh-my-zsh?
  • Welches color-theme lade ich in vim?
  • Welche Accounts habe ich in mutt?

Praktischerweise liegen all diese Einstellungen in Dateien (sogenannten "Dotfiles"), welche sich einfach von A nach B kopieren lassen.
Da ich jedoch regelmässig auf unterschiedlichen Rechnern arbeite, möchte ich diese aktuell halten.

Dropbox

Mein erster Ansatz war es, alle Dateien in einen zentralen Dropbox Ordner zu verschieben und Links zu erstellen nach folgendem Schema

~/.vimrc -> ~/Dropbox/config/vimrc

Meine .vimrc wurde durch den Dropbox-Dienst nun auf allen Rechnern synchronisiert und immer aktuell.
Richtete ich einen neuen Rechner ein, so musste ich "nur" Dropbox und den Link erstellen.

Dieser Ansatz hat jedoch einige Nachteile:

  1. Ich bin von der Verfügbarkeit von Dropbox abhängig (ist ok für mich)
  2. Ich muss auf allen Rechnern Dropbox installieren (ist auch noch so ok)
  3. Ich muss alle Dateien händisch verlinken (nicht ok!)
  4. Die Änderungen sind nicht dokumentiert bzw. haben keine definierten Zwischenstände (nicht ok!)
  5. Alle Änderungen werden sofort bei allen Systemen aktualisiert (außer ich stoppe Dropbox)

VCSH

Ich wünschte mir ein System, welches die Versionierung der Konfigurationsdaten übernimmt und bin dabei auf VCHS gestoßen.

Das schöne an VCSH: Es baut einfach auf git auf und bietet somit einerseits ein vertrautes Interface. Zudem kann ich meine Konfigurationsdateien nun einfach in ein zentrales Repository (z.B. auf Github oder auf einem eigenen Server) ablegen.

Installieren

Installieren erfolgt aus dem Repository, Debian/Ubuntu also per

apt-get install vcsh

oder bei Arch Linux via aur (hier mit yaourt)

yaourt -S vcsh

Anlegen

Ich empfehle pro Werkzeug (z.B. emacs, mutt, ...) ein eigenes Repository anzulegen um die Übersicht zu behalten.
Die Syntax hierbei entspricht der von git, jedoch mit Namen des Werkzeugs vorangestellt, also vcsh WERKZEUG GIT-BEFEHL (Ausnahme: init-Befehl)

Wir initialisieren uns erstmal ein Repository für unsere Vim-Einstellungen...

vcsh init vim

... fügen die Datei(en) hinzu, die wir verwalten wollen ...

vcsh vim add ~/.vimrc

... machen unseren ersten commit ...

vcsh vim commit -m "Mein erster Vim-commit"

... und pushen diesen auf unseren Git-Server (z.B. Github)

vcsh vim remote add git@MEINGITSERVER:vim.git
vcsh vim push -u origin master

Klonen

Auf einem neuen Rechner können wir uns die Konfiguration einfach holen:

vcsh clone git@MEINGISERVER:vim.git

.gitignore

Da sich unsere Konfigurationsdateien im Home-Verzeichnis des Users befinden, hat VCSH (bzw. git) keine Chance zu wissen welche Dateien definitiv zu dem Projekt gehören und welche nicht.
Also schaffen wir mit einer .gitignore-Datei Abhilfe: Alle Dateien und Verzeichnisse sollen ignoriert werden, außer den Projektdateien/Ordnern.
Diese erstellen wir automatisch via

vcsh write-gitignore vim

Wie fügen die ignore-Datei selbst auch dem Projekt hinzu...

vcsh vim add -f ~/.gitignore.d/vim

... und schreiben die Datei erneut.

vcsh write-gitignore vim

Nun kontrollieren wir die Datei ~/.gitignore.d/vim ob sie nicht Dateien ignoriert, welche wir versionieren wollen;
Wenn nicht: Ab damit ins Repository!

vcsh vim add ~/.gitignore.d/vim

Alle weiteren Aktionen können wir nun in gewohnter git-manier (commit push pull) erledigen.

Fazit

VCSH erlaubt es bequem Dotfiles zu organisieren und diese versioniert abzulegen.
Im Alltag hilft mir es enorm meine Konfigurationsdateien auf einem Stand zu halten und Änderungen dokumentiert.

Ergänzend zu VCSH bietet sich die Benutzung von myrepos ab um mehrere Repositories gleichzeitig zu verwalten.