On va partir du mini-LAB, en adaptant la configuration matérielle du serveur debian Core, selon les prérequis pour installer un serveur GitLab :
Préparons le serveur debian-core :
sudo nano /etc/hostname
sudo nano /etc/hosts
qui doit au final ressembler à ceci :
127.0.0.1 localhost
127.0.1.1 gitlab
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
sudo nano /etc/network/interfaces
Sur l'interface enp0s3
(lignes 11 et 12) : ip fixe 192.168.1.10/24
(ligne 13) et la passerelle 192.168.1.1
(ligne 14) :
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug enp0s3
iface enp0s3 inet static
address 192.168.1.10/24
gateway 192.168.1.1
sudo reboot
Puis, une fois le serveur relancé, on s'y connecte en ssh depuis le poste client :
ssh pascal@192.168.1.10
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl openssh-server ca-certificates tzdata perl
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo apt update
sudo GITLAB_ROOT_PASSWORD="password" EXTERNAL_URL="http://192.168.1.10" apt install gitlab-ce
sudo gitlab-ctl reconfigure
Accès web : Rendez-vous sur http://192.168.1.10
dans un navigateur.
Définissez le mot de passe administrateur lors de la première connexion.
L’utilisateur par défaut est root.
En cas de besoin le mot de passe est dans
/etc/gitlab/initial_root_password
Pour mémoire le process pour installer un certificat SSL avec Let's Encrypt :
sudo nano /etc/gitlab/gitlab.rb
external_url "https://gitlab.example.com"
letsencrypt['enable'] = true
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
sudo gitlab-ctl tail
sudo apt update && sudo apt upgrade
/etc/gitlab/gitlab.rb
:gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
gitlab_rails['backup_keep_time'] = 604800 # Garder 7 jours de sauvegardes
sudo gitlab-backup create
sudo gitlab-backup restore BACKUP=<nom-du-fichier-de-sauvegarde>
Créer le projet test-app sur gitlab
Ajouter une clé ssh pour l'authentification.
ssh-keygen -t ed25519 -b 4096 -C "adresse@email.com"
cat ~/.ssh/id_ed25519.pub
ssh
sur GitLabinstaller le package git sur le client à l’aide du gestionnaire de paquets :
sudo apt update && sudo apt upgrade && sudo apt install -y git
On vérifie l'installation et la version de git :
git --version
Une fois installé, configurez Git avec vos informations personnelles :
git config --global user.name "Prénom NOM"
git config --global user.email "adresse@email.com"
git config --list
git clone git@192.168.1.10:root/test-app.git
Voici la structure du projet que nous voulons créer :
test-app/
├── .gitlab-ci.yml
├── README.md
On se positionne :
cd test-app
Pour s'échauffer, on peut modifier le fichier README.md
:
nano README.md
Personnalisez le fichier, et "poussez" cette première modif :
git add .
git commit -m "Modification du fichier README"
git push -u origin main
Créez un fichier .gitlab-ci.yml
à la racine de votre projet :
nano .gitlab-ci.yml
avec ce contenu :
stages:
- build
- test
build-job:
stage: build
script:
- echo "Construction de l'application"
test-job:
stage: test
script:
- echo "Lancement des tests"
Poussez ce fichier dans votre dépôt.
GitLab exécutera les pipelines automatiquement après chaque push.
Sur le client :
sudo apt install -y curl
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
sudo apt install gitlab-runner
(installer docker-ce avant ?)
Créer le runner (shell) sur le webadmin de gitlab et l'activer (et vérifier)
gitlab-runner register --url http://192.168.1.10 --token glrt-t3_m31fGKmfvZ1z-1zfzQoJ
qui permet d'enregistrer le runner > successfully
sudo gitlab-runner start
Les commandes echo du premier exemple vont sortir dans les logs du GitLab Runner, c'est-à-dire qu'elles seront affichées dans l'interface de GitLab lorsqu'on consulte les résultats du pipeline.
Où trouver les logs des commandes echo ?
Dans les logs du job, on verra les résultats de toutes les commandes exécutées dans le script, y compris les echo qui affichent des messages comme :
Construction de l'application
Les fichiers de l'application ont été construits
Pour les voir sur le runner, on peut rediriger la sortie standard de echo.
Créer le projet my-php-app sur gitlab
créer la connexion ssh (par clé)
puis cloner localement le projet :
git clone git@192.168.1.10:root/my-php-app.git
Voici la structure du projet que nous voulons créer :
my-php-app/
├── docker-compose.yml
├── docker-compose.staging.yml
├── src/
│ └── index.php
├── db/
│ └── init.sql
├── Dockerfile
├── .gitlab-ci.yml
├── README.md
On se positionne :
cd my-php-app
Fichier : src/index.php
<?php
$host = getenv('DB_HOST');
$db = getenv('DB_NAME');
$user = getenv('DB_USER');
$password = getenv('DB_PASSWORD');
try {
$pdo = new PDO("pgsql:host=$host;dbname=$db", $user, $password);
echo "Connexion réussie à la base de données !";
} catch (PDOException $e) {
echo "Erreur : " . $e->getMessage();
}
?>
Fichier : db/init.sql
Ce script permet d'initialiser la base de données avec des données exemple.
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
INSERT INTO users (name) VALUES ('Alice'), ('Bob');
Fichier : Dockerfile
Pour construire l'image de l'application php
# Utiliser une image PHP avec Apache
FROM php:8.2-apache
# Activer les extensions PHP nécessaires
RUN docker-php-ext-install pdo pdo_pgsql
# Copier les fichiers du projet
COPY src/ /var/www/html/
Fichier : docker-compose.yml
services:
web:
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:80"
environment:
DB_HOST: db
DB_NAME: appdb
DB_USER: user
DB_PASSWORD: password
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: appdb
volumes:
- ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
Fichier : .gitlab-ci.yml
Voici un pipeline pour construire, tester et déployer l'application directement en production.
image: docker:latest
services:
- docker:dind
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_DRIVER: overlay2
stages:
- build
- test
- deploy-production
build:
stage: build
script:
- docker-compose -f docker-compose.yml build
test:
stage: test
script:
- docker-compose -f docker-compose.yml up -d
- curl -f http://localhost:8080 || exit 1
- docker-compose down
deploy-production:
stage: deploy
script:
- docker-compose -f docker-compose.yml up -d
environment:
name: production
url: http://example.com
only:
- main # Déployer uniquement à partir de la branche "main"
Synchronisation du projet
git add .
git commit -m "Depôt initial"
git push -u origin main
???
DB_PASSWORD_PRODUCTION = password
???