software:gitlab

GitLab

GitLab ist eine Webanwendung zur Versionsverwaltung für Softwareprojekte auf Basis von git. Sie bietet diverse Management und Bug-Tracking-Funktionalitäten sowie mit GitLab CI ein System zur kontinuierlichen Integration. Quelle Wikipedia

Die Pricing Strategy von Anfang 2021 hebt die Preise auf mind. 19$ pro Benutzer und Monat für features wie LDAP an.

Die Systemvorraussetzungen sind (abhängig von der laufenden Komponenten) moderat, unter 4GB Arbeitsspeicher wird es aber nicht gut laufen.

GitLab Installation

Im Falle von Debian ist das relativ simpel:

sudo apt install -y curl openssh-server ca-certificates
sudo apt install -y postfix
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash
sudo EXTERNAL_URL="http://gitlab.myDOMAIN.tld" apt-get install gitlab-ee
Die folgenden Signaturen waren ungültig: EXPKEYSIG 3F01618A51312F3F GitLab B.V. (package repository signing key) <packages@gitlab.com>
curl -L https://packages.gitlab.com/gitlab/gitlab-ee/gpgkey | sudo apt-key add -

Nach Änderungen der Konfigurationsdatei /etc/gitlab/gitlab.rb wird intern Chef aufgerufen um die entsprechende Config zu erzeugen:

gitlab-ctl reconfigure
gitlab-ctl restart

Debugging: /var/log/gitlab/gitlab-rails/production.log

gitlab bringt sein eigenes nginx mit, daher muss dies auf IPv6 konfiguriert werden:

# v6:
nginx['listen_addresses'] = ["0.0.0.0", "[::]"]
# registry_nginx['listen_addresses'] = ['*', '[::]']
# mattermost_nginx['listen_addresses'] = ['*', '[::]']
# pages_nginx['listen_addresses'] = ['*', '[::]']

wenn es funktioniert:

netstat -avlpt|grep nginx
tcp6       0      0 [::]:https              [::]:*                  LISTEN      30331/nginx: master 
tcp6       0      0 [::]:http               [::]:*                  LISTEN      30331/nginx: master 

SMTP-Settings

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "RELAY-Server.domain.tld"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "BENUTZNAME"
gitlab_rails['smtp_password'] = "PASSWORT"
gitlab_rails['smtp_domain'] = "ABSENDERDOMAIN.tld"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false

gitlab_rails['gitlab_email_from'] = 'gitlab@ABSENDERDOMAIN.tld'
gitlab_rails['gitlab_email_display_name'] = 'NAME DER Gitlab-INSTANZ'
gitlab_rails['gitlab_email_reply_to'] = 'reply-to@ABSENDERDOMAIN.tld'

debugging smtp

gitlab-rails console
Notify.test_email('ICH@DOMAIN.TLD', 'Hello World', 'This is a test message').deliver_now

Es muss ein gültiges Zertifikat auf die external_url vorhanden sein, alternativ mit letsencrypt besorgen.

external_url 'https://gitlab.myDOMAIN.tld'

nginx['redirect_http_to_https'] = true
nginx['redirect_http_to_https_port'] = 80

nginx['ssl_certificate'] = "/etc/gitlab/ssl/ZERTIFIKAT.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/PRIVATEKEY.key"
nginx['ssl_ciphers'] = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
# nginx['ssl_ciphers'] = "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA:EECDH:EDH+AESGCM:EDH:ECDH+AESGCM:ECDH+AES:ECDH:HIGH:MEDIUM:!RC4:!3DES:!CAMELLIA:!SEED:!aNULL:!MD5:!eNULL:!LOW:!EXP:!DSS:!PSK:!SRP"
nginx['ssl_prefer_server_ciphers'] = "on"

:!: Das Zertifikat und Zwischenzertifikate müssen in die Datei bei ssl_certificate hinein.

Automatische Verlängerung mit letsencrypt

/etc/gitlab/ssl/update-cert.sh

#!/bin/sh
 
dest="/etc/gitlab/ssl"
user="gitlab-www"
domain="my.domain.tld"
 
cp /etc/letsencrypt/live/$domain/privkey.pem $dest/gitlab.key
chmod 600 $dest/gitlab.key
chown $user $dest/gitlab.key
cat /etc/letsencrypt/live/$domain/cert.pem /etc/letsencrypt/live/$domain/chain.pem > $dest/gitlab.fullchain
chgrp $user $dest/gitlab.fullchain

in der crontab:

/root/letsencrypt/letsencrypt-auto renew --pre-hook "gitlab-ctl stopr" --post-hook "/etc/gitlab/ssl/update-cert.sh ; gitlab-ctl start"

via cron-job:

gitlab-rake gitlab:backup:create

Die Archive landen in /var/opt/gitlab/backups/.

Gitlab bietet die Möglichkeit andere Repositories zu spiegeln (mirroring). Es zwei Richtungen

  • Pull: Entferntes Repository nach gitlab (nur mit der enterprise-Edition)
  • Push: gitlab zu einem entferntem Repository.

Die Einstellungen dazu finden sich in Projekt → Settings → Repository → Mirror a repository.

Alternativ (allerdings manuell) kann ein entferntes Repo als upstream definiert werden und/oder als Submodul eingesetzt werden.