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
- Installation et mise en place d’un serveur web sur Linux Debian - LAMP partie 1
- Installation de sudo - LAMP partie 2
- Installation de SSH - LAMP partie 3
- Installation d'Apache 2 - LAMP partie 4
- Configuration des vhosts sur Apache2 et pointage DNS - LAMP partie 5
- Installation de PHP 5 - LAMP partie 6
- Installation de MySQL - LAMP partie 7
Pour la configuration de l'environnement LAMP, se reporter aux tutoriels suivants :
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