Installation de GitLab CE sur Linux Debian 8

Installation de GitLab CE sur Linux Debian 8

Publié le 22/12/2015

On va installer Gitlab CE sur deux VM Debian 8 pour mettre en place une intégration continue et une gestion avancées des dépôts. Un VM disposera de Gitlab CE et l'autre disposera d'un Runner ainsi que les paquets Apache, PHP et MySQL

On va définir une entrée de type A pour chaque VM dans notre résolveur DNS local. De façon à ce que toutes les machines puissent s'appeler avec un FQDN (Cf le tutoriel sur Bind).

  • 192.168.0.150 gitlab.domain.local
  • 192.168.0.151 runner-test.domain.local

1 - Installation de Gitlab CE

Sur la première VM on va procéder à l'installation et à la configuration de Gitlab.

On va attribuer à notre serveur un nom d'hôte :


sudo nano /etc/hosts


127.0.1.1 gitlab


sudo nano /etc/hostname


gitlab

Installation de Gitlab CE :


sudo apt-get install sudo curl git
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo apt-get install gitlab-ce

Ensuite, on va éditer la configuration de gitlab :


sudo nano /etc/gitlab/gitlab.rb

Modifier la ligne suivante :


external_url 'https://gitlab.domain.local'

Lancer le script de configuration :


sudo gitlab-ctl reconfigure

On Peut maintenant accéder à Gitlab par le navigateur à l'url http://gitlab.local avec les identifiants suivants :

  • login: root
  • password: 5iveL!fe

2 - Importation d'un projet d'un repository Git

On va prendre soin de copier la clé publique de notre utilisateur git du serveur gitlab.domain.local pour l'ajouter dans le fichier "authorized_keys" de l'utilisateur git du serveur de repos git.

Création d'une paire de clés sur gitlab.domain.local (on considère qu'on à déjà une sur notre serveur git) :


su git
ssh-keygen -t rsa

Ajout de la clé publique de l'utilisateur git du serveur gitlab.domain.tld à l'utilisateur git de git-srv.domain.local :


cat /var/opt/gitlab/.ssh/id_rsa.pub

Copier la clé et coller la dans le fichier /home/git/.ssh/authorized_keys du serveur git-srv.domain.local

Se loguer une première fois avec l'utilisateur git sur le serveur git-srv.domain.local depuis notre serveur Gitlab, afin de vérifier si l'enregistrement de la clé à bien fonctionné.

Sur la machine gitlab-srv.domain.local


su git
ssh git@git-srv.domain.local

Une fois le paramétrage de l'authentification terminé, on va aller dans l'interface d'administration et on va créer un nouveau projet. On lui donne un nom, puis on choisi "import project from : git any repo by url". On part du principe que la FQDN du serveur est : git-srv.domain.local

Adresse du repository : ssh://git@git-srv.domain.local/opt/git/jobmanager.git

Cliquer sur "create project".

3 - Installation du Runner

Sur la seconde VM, on va installer un environnement LAMP et le Gitlab Runner :

Ajout du dépot git-lab-ci-multi-runner :


curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | sudo bash

Installation :


sudo apt-get install gitlab-ci-multi-runner

Dans l'admin de Gitlab cliquer sur "Admin area" (la clé à molette dans la barre du haut), puis dans "Runners" toujours dans le volet gauche.

Copier le token fourni dans la page.

Enregistrement du Runner :


sudo gitlab-ci-multi-runner register

Ajouter l'utilisateur gitlab-runner aux sudors.

Si après la configuration du runner, ce dernier n'est pas contactable, on supprimera le fichier de configuration du runner et on rejouera la commande gitlab-ci-multi-runner register.


sudo rm /etc/gitlab-runner/config.toml

ou


sudo rm /home/user/.gitlab-runner/config.toml

On peut visualiser le comportement du runner avec la commande :


gitlab-runner --debug run

Configurer comme suit :

  • Coordinator URL (e.g. https://gitlab.com/ci): http://gitlab.domain.local/ci
  • Token for this runner: Coller le token récupéré
  • Description for this runner: runner-test
  • Tags for this runner (comma separated): lamp-prod
  • Executor: ssh, shell, parallels, docker, docker-ssh: shell

4 - Clonage du projet dans l'environnement de développement

Sur notre poste de travail, on va récupérer la clé publique de notre utilisateur et la copier pour l'ajouter dans notre projet dans Gitlab.

Ajout de la clé publique de l'environnement de développement dans le projet importé :

Dans l'interface d'admin de Gitlab, sélectionner le projet et cliquer sur "add and ssh key" dans le bandeau orange situé dans la partie supérieure de la page.

Clonage du repository importé sur notre environnement de développement :


git clone git@gitlab.domain.local:root/project.git

Dans le volet gauche du projet, cliquer sur "Settings", dans "Project Settings", puis dans la section "Continuous Integration", sélectionner "git fetch" et enregister.

5 - Création du fichier .gitlab.yml

Création d'un fichier d'instruction à la racine du projet : gitlab-ci.yml. Ce dernier va contenir les instructions de déploiement et test du Runner :


nano .gitlab-ci.yml


stages:
    - build
    - test
    - deploy

cache:
    untracked: true
    paths:
        - vendor/

test:app:
    script:
        - curl -s https://getcomposer.org/installer | php
        - php composer.phar install
        - rm -rf app/cache/*
        - chmod -R 777 app/cache/ app/logs/
    only:
        - prod
    tags:
        - lamp-prod

Les directives "only: - prod" et "only: - test" indique les Runner se déclencheront sur ces branches lors d'un merge.

Commit et push :


git add .gitlab-ci.yml
git commit -m 'add gitlab ci config'
git push origin master

Pour finir, dans l'admin de Gitlab on va créer une branche "prod" et on va créer un merge de "master" vers "prod". A l'url http://gitlab.local/root/project/builds on va voir l'exécution de notre runner.

6 - Configuration d'Apache

Configuration d'Apache pour l'utilisateur gitlab-runner :

Changement de l'utilisateur apache :


sudo nano /etc/apache2/envvars


export APACHE_RUN_USER=gitlab-runner
export APACHE_RUN_GROUP=gitlab-runner

Ajout de l'utilisateur gitlab-runner au dossier de sessions de PHP :


sudo apt-get install acl
sudo setfacl -Rm u:gitlab-runner:rwx /var/lib/php5/sessions
sudo setfacl -Rm g:gitlab-runner:rwx /var/lib/php5/sessions

Ajout d'un dossier racine d'apache dans apache2.conf :


sudo nano /etc/apache2/apache2.conf


<Directory /home/gitlab-runner/builds/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

Redémarrage d'Apache :


service apache2 restart

8 - Déclenchement d'un build Jenkins après le déploiement

Si on possède un serveur de test Jenkins et que l'on souhaite déclencher un build après le déploiement, on va procéder de la façon suivante :

Récupération de l'API token de notre utilisateur Jenkins.

Dans Jenkins, allez dans les paramètres de votre utilisateur dans la barre de navigation du haut, sur le nom de notre utilisateur en haut à gauche. Puis dans le menu latéral gauche, cliquer sur "Configurer". Dans la section "API Token", cliquer sur "Show API Token" et copier le token.

On va rajouter la commande suivante dans le fichier .gitlab-ci.yml de notre projet :


test:app:
    script:
	   // ...
        curl -XPOST http://jenkins-srv.domain.local:8080/job/JOBNAME/build?token=APITOKEN

build:app:
    script:
	   // ...
        curl -XPOST http://jenkins-srv.domain.local:8080/job/JOBNAME/build?token=APITOKEN

9 - Changement de port ssh

On souhaite changer le port 22 par default de ssh sur un port haut pour éviter les attaques de bots.

On va d'abord changer la configuration de ssh :


nano /etc/ssh/sshd_config

Changer la valeur 22 pour le port de votre choix (de préférence au dessus de 10000) par la suivante :


# What ports, IPs and protocols we listen for
Port XX

On va ensuite modifier la configuration de Gitlab :


nano /var/opt/gitlab/gitlab-rails/etc/gitlab.yml

Changer la valeur de ssh_port :


ssh_host: XX

Redémarrage de Gitlab :


gitlab-ctl reconfigure
gitlab-ctl restart

Mise en place d'un certificat SSL avec Let's Encrypt

Dans le fichier de configuration, éditer comme suit :


nano /etc/gitlab/gitlab.rb

Modifier les lignes suivante :


external_url 'https://gitlab.domain.local'
//...
letsencrypt['enable'] = true
letsencrypt['contact_emails'] = ['foo@email.com'] 
letsencrypt['auto_renew'] = false
letsencrypt['auto_renew_hour'] = "12"
letsencrypt['auto_renew_minute'] = "30"
letsencrypt['auto_renew_day_of_month'] = "*/7"

Décommenter la ligne suivante :


nginx['redirect_http_to_https_port'] = 80


S'assurer d'avoir exposé les ports 80 et 443 sur votre firewall vers le serveur hébergeant Gitlab

Reconfigurer gitlab :


sudo gitlab-ctl reconfigure

Sources :

https://about.gitlab.com/installation/#debian https://docs.gitlab.com/omnibus/settings/ssl.html