Wer mit git arbeitet, braucht neben den dezentralen auch einen zentralen Repository Speicherort, welches als Quelle für gemeinsame Entwicklung dienen soll. Erste Anlaufstelle für OpenSoure Projekte ist Github. Wer jedoch eine eigenes dediziertes Repository braucht, kann dies mit einer lokalen Gitlab Intanz bewerkstelligen.

Schematischer Aufbau

In diesem Aufbau wurde Gitlab auf einem Raspberry Pi installiert. Zur Authentifizierung mittels LDAP läuft eine virtuelle Windows 2012 R2 Instanz als Domain Controller. Auf dem Client Laptop sind neben Git Bash für Windows auch die aktuelle Eclipse (Neon) Entwicklungsumgebung.

Schematischer Augbau Gitlab Raspberry Pi

Sorgenfreie Installation

Wer eine sorgenfreie Installation bevorzugt, kann mit dem Paketsystem Omnibus sich eine komplette Gitlab Instanz für sein Betriebssystem herunterladen.

Screenshot Gitlab Homepage

Link: https://about.gitlab.com/downloads/

Manuelle Installation von GitlabHQ

Folgende Grundpakete braucht man nach einer minimalen Debian Installation:

apt-get install sudo vim dialog build-essential zlib1g-dev curl git-core openssh-server mysql-server mysql-client libmysqlclient-dev redis-server checkinstall libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev libkrb5-dev python-pkgconfig python-docutils cmake nodejs nginx
Installation Ruby Paket

Gitlab basiert auf die objektorientierte Programmiersprache Ruby. Hierzu wird das aktuelle Paket von der Ruby Projektseite heruntergeladen und auf dem lokalen Server kompiliert.

mkdir -p /opt/ruby
cd /opt/ruby
wget -c https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
tar xif ruby-2.3.1.tar.gz
cd ruby-2.3.1/
./configure
make
make install

Ausgabe make vom ruby Paket

Installation von RubyGem Paketen

Zur besseren Verwaltung von Ruby Bibliotheken (Gems) wird neben das Verwaltungstool Bundler, weitere benötigte Ruby Programme installiert.

gem install bundler --no-ri --no-rdoc
gem install rugged -v '0.24.0'
gem install timfel-krb5-auth -v '0.8.3'
gem install charlock_holmes --version '0.7.3'

Gitlab shell und Workhorse Umgebung

Vor dem Download und Konfiguration von gitlab müssen erst ein Systemuser „git“ für den Dienst angelegt werden.

adduser --disabled-login --gecos 'GitLab' git
cd /home/git
su git

Mit dem User git wird eine aktuelle Version von gitlab Shell Source aus dem GithubHQ Repository geklont und auf dem Server installiert.

git clone https://github.com/gitlabhq/gitlab-shell.git
cd gitlab-shell
git checkout v3.4.0
cp config.yml.example config.yml
vi config.yml (optional)
./bin/install
exit

 

Zum besseren Handling von push/pull Funktionen über HTTP (Hypertext Transfer Protocol), wird zusätzlich der Reverse Proxy Workhorse installiert.

su git
cd /home/git
git clone https://gitlab.com/gitlab-org/gitlab-workhorse.git
cd gitlab-workhorse/
git checkout v0.7.10
make

 

Als letztes sollten folgende globale git Umgebungsvariablen gesetzt werden.

su git
git config --global user.name "GitLab"
git config --global user.email "gitlab@OUTBACK"
git config --global core.autocrlf input

 

Grundinstallation Gitlab

Ab dieser Phase kann endlich das eigentliche Gitlab vom Github geklont und angepasst werden.

su git
git clone https://github.com/gitlabhq/gitlabhq.git gitlab
cd /home/git/gitlab
git checkout 8-11-stable
cp config/gitlab.yml.example config/gitlab.yml
vi config/gitlab.yml
exit

 

Nach dem Klonen muss vor dem ersten Aufruf das Template von der Konfigurationsdatei wie folgt angepasst werden. Neben dem Hostnamen wird hier zusätzlich eine LDAP (Lightweight Directory Access Protocol) Authentifizierung gegenüber einem Windows Active Directory Server etabliert. Somit können Windows User sich auch automatisch unter Gitlab anmelden. Als letzte Änderung gegenüber dem Template verlege ich das Verzeichnis für die abgelegten Repositories auf ein separate Partition. In dem Fall ist dieser als Verzeichnis /repositories gemountet.

...
host: debian-gitlab
port: 80 
https: false
...
…
ldap:
  enabled: true
  sync_time:
  host: 'windows2012DC'
  port: 389
  uid: 'sAMAccountName'
  method: 'plain' # "tls" or "ssl" or "plain"
  bind_dn: 'CN=gitlabuser,CN=Users,DC=OUTBACK'
  password: 'PASSWORD'
  allow_username_or_email_login: true
  base: 'ou=ACCOUNTS,dc=OUTBACK'
…
  repositories:
    storages: {"default":"/repositories"}
…
 

Anpassung Verzeichnisstruktur

Für die weitere Installation müssen folgende bestehenden Verzeichnisse angepasst werden.

cd /home/git/gitlab
chown -R git log/
chown -R git tmp/
chmod -R u+rwX  log/
chmod -R u+rwX  tmp/

Weiterhin müssen folgende Verzeichnisse angelegt werden.

mkdir /home/git/gitlab-satellites
mkdir /home/gitlab/public/uploads
mkdir /home/git/gitlab/tmp/pids
mkdir /home/git/gitlab/tmp/sockets
 

MySQL Datenbank für Gitlab vorbereiten

Für das Befüllen der Gitlab Tabellen muss in MySQL eine Gitlab Datenbank und einen Datenbankuser angelegt werden.

mysql -u root -p
mysql> CREATE DATABASE IF NOT EXISTS `gitlabDB` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
mysql> GRANT ALL ON `gitlabDB`.* TO 'gitlab'@'localhost' identified by 'FxncN8qRtSIv';
mysql> exit

 

Damit Gitlab sich mit der angelegten MySQL Datenbank verbinden kann, muss die entsprechende Template der Konfigurationsdatei angepasst werden.

cd /home/git/gitlab
cp config/database.yml.mysql config/database.yml
vi config/database.yml
chmod o-rwx config/database.yml
database: gitlabDB
username: gitlab
password: "FxncN8qRtSIv"

 

Anpassung Unicorn Konfiguration

Gitlab benötigt den unter Ruby und C geschriebenen HTTP Server Unicorn, um HTTP Anfragen verarbeiten zu können.

su git
cd /home/git/gitlab
cp config/unicorn.rb.example config/unicorn.rb
vi config/unicorn.rb

 

Ruby on Rails Umgebungsvariable

Nun muss Rails Umgebungsvariable auf Produktion gesetzt werden.

su git
cd /home/git/gitlab
bundle install --deployment --without development test postgres aws
bundle exec rake gitlab:setup RAILS_ENV=production
bundle exec rake gitlab:env:info RAILS_ENV=production

Ausgabe bundle Info

 

Anpassung NGINX Konfiguration

rm -f /etc/nginx/sites-enabled/default
cp /home/git/gitlab/lib/support/nginx/gitlab /etc/nginx/sites-available/gitlab
ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab
vi /etc/nginx/sites-available/gitlab
 

Gitlab Runlevel anlegen

Zum automatischen Starten des Daemons muss das Gitlab init Skript ins Runlevel Verzeichnis /etc/init.d kopiert und ausführbar gemacht werden.

cp /home/git/gitlab/lib/support/init.d/gitlab /etc/init.d/gitlab
chmod +x /etc/init.d/gitlab
update-rc.d gitlab defaults 21

Ausgabe gitlab init start

Synchronisation mit Git Bash für Windows

Nachdem man ein erstes Projekt auf dem eigenen Gitlab erstellt hat, kann man über Git Bash für Windows ein Push sein lokales git Repository hoch geladen werden. In dem Beispiel nehme ich gerne alte Programmierübungen von Lehrbüchern. Als erstes muss der exakte HTTP Pfad des neu angelegten Projektes ermittelt werden. Neben HTTP können auch SSH (Secure Shell) als Kommunikationswege verwendet werden. Zum ersten Test reicht aber eine HTTP Übertragung.

Screenshot Gitlab Projekt Link

Nun muss dem lokalen git Repository der neue Remote Pfad angeben werden. Falls schon ein Remote Pfad in dem Repository existiert, muss dieser in der Datei .git/config enfernt werden.

...
[remote "origin"]
        url = http://debian-gitlab.OUTBACK/Carlos/Erlenkoetter.Java.git
        fetch = +refs/heads/*:refs/remotes/origin/*
...

 

Über die Konsoleneingabe im Git Bash kann dann das lokale Repository hoch geladen werden.

git remote add origin http://debian-gitlab.OUTBACK/Carlos/Erlenkoetter.Java.git
git push -u origin master

Git Bash mit Push auf Gitlab Projekt

 

Klonen eines Gitlab Projekts mit Entwicklungsumgebung Eclipse

Nachdem die ersten Java Programme auf dem Gitlab Projekt hoch geladen wurde, kann man mit Ecplise sich diese als Remote Repository einbinden. Hierbei benötigt die Eclipse Grundinstallation zusätzlich das AddOn „Eclipse Git Team provider“ zur Synchronisation mit einem Git Repository.

Screenshot Eclipse mit Git AddOn