Contexte et objectifs 

GitLab est un outil actuellement incontournable pour les DevOps d’aujourd’hui. En effet, c’est un outil complet qui comprend l’ensemble des Ă©lĂ©ments permettant de rĂ©aliser des chaines d’intĂ©gration continue. Il embarque notamment un « Container Registry » Docker qui est directement intĂ©grĂ© Ă  l’application. 
Notre objectif, dans le cadre de ce tutoriel, est de vous présenter comment activer la fonctionnalité « Container Registry » de GitLab ainsi que comment utiliser ce Registry pour stocker des images Docker.
Durée de la mise en place : 1 heure.

Configuration

0 – Mise en place de l’environnement 

Nous travaillerons avec deux serveurs linux : 

Un serveur Debian oĂč sera dĂ©ployĂ©e l’application GitLab CE. Celle-ci sera dĂ©ployĂ©e Ă  l’aide d’un conteneur Docker :

[table id=description-srv-gitlab-registry /]

Un serveur CentOS distant avec Docker installĂ©, pour nous permettre de rĂ©aliser les tests de login, de push et pull des images Docker : 

[table id=description-srv-remote-gitlab-registry /]

Schéma Infrastructure

  • Mise en place de la rĂ©solution de nom 

N’ayant pas de DNS, nous ajoutons Ă  la main nos entrĂ©es DNS en effectuant les commandes suivantes :

Serveur GitLab 

Éditer le hostname de la machine avec la commande « hostnamectl set-hostname » :

admin@gitlab:~$ sudo hostnamectl set-hostname gitlab.samiamoura.com

Ajouter la rĂ©solution DNS :

admin@gitlab:~$ echo '3.90.17.104 ec2-3-90-17-104.compute-1.amazonaws.com gitlab.samiamoura.com' | sudo tee -a /etc/hosts

Serveur distant

Éditer le hostname de la machine :  

[centos@serveur-distant ~]$ sudo hostnamectl set-hostname serveur-distant

Ajouter la rĂ©solution DNS pour faire correspondre les adresses avec le serveur « gitlab.samiamoura.com Â» :

[centos@serveur-distant ~]$ echo '3.90.17.104 ec2-3-90-17-104.compute-1.amazonaws.com gitlab.samiamoura.com' | sudo tee -a /etc/hosts

1 – GĂ©nĂ©ration du certificat SSL self-signed

Pour activer le Registry Docker de « GitLab Â» il est nĂ©cessaire de gĂ©nĂ©rer un certificat SSL self-signed (auto-signĂ©).

  • CrĂ©ation du dossier « /etc/docker/certs.d/gitlab.samiamoura.com Â»

Serveur GitLab

CrĂ©er  le dossier « /etc/docker/certs.d/gitlab.samiamoura.com Â» :

admin@gitlab:~$ sudo mkdir -p /etc/docker/certs.d/gitlab.samiamoura.com

Serveur distant

CrĂ©er  le dossier « /etc/docker/certs.d/gitlab.samiamoura.com Â» :

[centos@serveur-distant ~]$ sudo mkdir -p /etc/docker/certs.d/gitlab.samiamoura.com
  • GĂ©nĂ©ration du certificat SSL self-signed

Serveur GitLab

GĂ©nĂ©rer le certificat auto-signĂ© avec la commande « openssl req Â» :

admin@gitlab:~$ sudo openssl req -newkey rsa:4096 -nodes -sha256 -keyout /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.key -x509 -days 365 -out /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.crt

Remplir les champs de la façon suivante :

Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:gitlab.samiamoura.com
Email Address []:

Important: : Tous les champs peuvent rester vides sauf le champ Common Name (e.g. server FQDN or YOUR name) qui doit impĂ©rativement contenir l’adresse publique IPv4 de la machine ou le DNS publique IPv4 de la machine ou le la rĂ©solution de nom de la machine. 

Dans notre exemple nous utiliserons la rĂ©solution de nom de la machine :

Common Name (e.g. server FQDN or YOUR name) []:gitlab.samiamoura.com

Nous avons maintenant deux fichiers ; un au format .crt et un au format .key :

admin@gitlab:~$ sudo ls -la /etc/docker/certs.d/gitlab.samiamoura.com/
-rw-r--r-- 1 root root 2029 Mar 30 16:48 gitlab.samiamoura.com.crt
-rw------- 1 root root 3272 Mar 30 16:47 gitlab.samiamoura.com.key
  1. Le fichier « gitlab.samiamoura.com.crt » : correspond au certificat qui a Ă©tĂ© gĂ©nĂ©rĂ© avec la commande prĂ©cĂ©dente
  2. Le fichier « gitlab.samiamoura.com.key »  : correspond Ă  la clĂ© qui est associĂ©e au certificat gĂ©nĂ©rĂ© prĂ©cĂ©demment
  • Changement des permissions des fichiers gĂ©nĂ©rĂ©s ( .crt et .key)

Changer les permissions des fichiers avec les droits 600 (read and write) :

admin@gitlab:~$ sudo chmod 600 /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.*

2 – Copie des fichiers .crt et .key dans le conteneur GitLab

Pour rappel, notre application GitLab est dĂ©ployĂ©e avec un conteneur Docker afin de privilĂ©gier l’agilitĂ©.

  • RĂ©cupĂ©ration du nom du conteneur GitLab

Lister les conteneur en cours d’exĂ©cution « docker ps Â» :

admin@gitlab:~$ sudo docker ps

Voici le rĂ©sultat de la commande : 

CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS                 PORTS                                              NAMES
ed0c04c32b27        gitlab/gitlab-ce:11.3.0-ce.0          Â«Â /assets/wrapper »        3 hours ago         Up 3 hours (healthy)   0.0.0.0:80->80/tcp, 22/tcp, 0.0.0.0:443->443/tcp   gitlab

→ Le nom du conteneur « GitLab » en cours d’Ă©xecution est : gitlab

  • Copie des fichiers .crt et .key dans le conteneur gitlab

Copier les fichiers « gitlab.samiamoura.com.crt Â» et « gitlab.samiamoura.com.key Â» dans le rĂ©pertoire « /etc/gitlab Â» du conteneur « gitlab Â» Ă  l’aide de la commande « docker cp Â» :

admin@gitlab:~$ sudo docker cp /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.crt gitlab:/etc/gitlab/
admin@gitlab:~$ sudo docker cp /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.key gitlab:/etc/gitlab/

Information : L’emplacement des deux fichiers n’est pas important, cependant il sera impĂ©ratif d’utiliser le mĂȘme chemin des fichiers .crt et .key dans le fichier de configuration « gitlab.rb Â».

  • VĂ©rification que les deux fichiers ont correctement Ă©tĂ© copiĂ©s

Administrer le conteneur « gitlab Â» Ă  l’aide de la commande « docker exec -it Â» :

admin@gitlab:~$ sudo docker exec -it gitlab /bin/bash

Dans le conteneur « gitlab Â» se rendre dans le dossier « /etc/gitlab/ Â» et vĂ©rifier que les deux fichiers ont Ă©tĂ© copiĂ©s avec succĂšs : 

root@ed0c04c32b27:/# cd /etc/gitlab/
root@ed0c04c32b27:/etc/gitlab# ls -la gitlab.samiamoura.com.*
-rw------- 1 root root 2029 Mar 30 16:48 gitlab.samiamoura.com.crt
-rw------- 1 root root 3272 Mar 30 16:47 gitlab.samiamoura.com.key

3 – Edition du fichier de configuration de GitLab  : Â« gitlab.rb Â»

Le fichier de configuration de l’application GitLab est le fichier « gitlab.rb Â» situĂ© dans le rĂ©pertoire « /etc/gitlab Â» du conteneur. Ce fichier, Ă©crit en Ruby, permet d’activer ou de dĂ©sactiver une multitude de modules pour l’application GitLab. C’est notamment grĂące Ă  ce fichier que nous allons pouvoir activer et utiliser notre « Container Registry Â» Docker. 
Important : L’ensemble des commandes de cette section seront Ă  exĂ©cuter dans le conteneur « gitlab Â».

Dans le rĂ©pertoire « /etc/gitlab/ Â», crĂ©er un fichier de backup au cas oĂč nous souhaiterons rĂ©utiliser le fichier orignal :

root@ed0c04c32b27:/etc/gitlab# cp gitlab.rb gitlab.rb.bak
  • Édition du fichier « gitlab.rb Â»

Les numĂ©ros de lignes peuvent lĂ©gĂšrement varier, tout dĂ©pendra de la version de l’application GitLab que vous utiliserez.

~ Ligne numĂ©ro 13

Ajouter la ligne suivante correspondant Ă  l’adresse IP (Nom DNS) de la machine hĂŽte : 

external_url 'http://gitlab.samiamoura.com'

~ Ligne numĂ©ro 414

Ajouter la ligne suivante correspondant Ă  l’adresse IP ou Nom DNS de la machine hĂŽte : 

registry_external_url 'https://gitlab.samiamoura.com'

Attention : Ne pas oublier le « s Â» de « https Â».

~ Ligne numĂ©ro 419

VĂ©rifier que la ligne suivante est commentĂ©e :  

# gitlab_rails['registry_enabled'] = false

~ Ligne numĂ©ro 422

Ajouter la ligne suivante afin de dĂ©finir le dossier oĂč seront stockĂ©es les images Docker :

gitlab_rails['registry_path'] = "/var/opt/gitlab/gitlab-rails/shared/registry"

~ Ligne numĂ©ro 431

Ajouter la ligne suivante afin d’activer le « Container Registry Â» :

registry['enable'] = true

~ Ligne numĂ©ro 1190

Ajouter la ligne suivante pour activer le registry NGINX :

registry_nginx['enable'] = true

Ajouter les lignes suivantes avec les chemins des fichiers « gitlab.samiamoura.com.crt et gitlab.samiamoura.com.key Â» prĂ©cĂ©demment copiĂ©s dans le dossier « /etc/gitlab Â» du conteneur « gitlab Â»:

registry_nginx['ssl_certificate'] = "/etc/gitlab/gitlab.samiamoura.com.crt"
registry_nginx['ssl_certificate_key'] = "/etc/gitlab/gitlab.samiamoura.com.key"

→ La configuration du fichier « gitlab.rb Â» est terminĂ©e. Enregistrer le fichier et quitter.

Information : Vous trouverez le fichier complet sur mon repository GitHub Ă  l’adresse suivante : https://github.com/samiamoura/eazytraining-article/blob/master/gitlab-registry/gitlab.rb

  • Prise en compte de la configuration 

Utiliser la commande « gitlab-ctl reconfigure Â» afin de reconfigurer le l’application GitLab et prendre en compte les changements effectuĂ©s :

root@ed0c04c32b27:/etc/gitlab# gitlab-ctl reconfigure

Si la reconfiguration est effectuĂ©e avec succĂšs le message suivant apparait : 

Running handlers:
Running handlers complete
Chef Client finished, 37/487 resources updated in 15 seconds
gitlab Reconfigured!

4 – RĂ©solution de nom sur le PC local 

Pour rappel et comme prĂ©cisĂ© au prĂ©alable, nous n’avons pas de DNS, il faut donc ajouter la rĂ©solution de nom Ă  la main sur notre ordinateur local.

Éditer le fichier hosts de votre ordinateur local de la façon suivante en ajoutant la ligne suivante : 

3.90.17.104 ec2-3-90-17-104.compute-1.amazonaws.com gitlab.samiamoura.com 

L’adresse « http://gitlab.samiamoura.com/ Â» est dĂ©sormais atteignable depuis votre navigateur web.

5 – Configuration de l’application GitLab

Pour ce tutoriel, nous avons créé l’utilisateur « samiamoura Â». C’est avec cet utilisateur que nous ferons l’ensemble des dĂ©monstrations.

AprĂšs authentification, se rendre dans la partie « Admin Area Â» en cliquant sur l’icĂŽne suivante   .
Sur la page suivante nous pouvons voir que le module « Container Registry Â» est activĂ©. Cependant, il sera nĂ©cessaire de l’activer pour chaque nouveau projet.

6 – CrĂ©ation d’un nouveau projet et activation du « Container Registry Â» de GitLab

Sur la mĂȘme page, cliquer sur « New project Â» afin de crĂ©er un nouveau projet :

Donner un nom et une description au projet et cliquer sur « Create project Â» :

Sur la page qui apparait aprĂšs la crĂ©ation du projet, nous pouvons constater que le « Registry Â» n’est pas encore activĂ© pour ce projet. Dans le menu de gauche, se rendre sur « Setting > General Â» :

Sur la page suivante, se rendre sur « Visibility, project features, permissions Â»  :

Cliquer sur le bouton « Expand Â» pour afficher les options relatives Ă  ce projet, puis activer le « Container registry » en cliquant sur le bouton. Cliquer sur « Save changes Â» pour enregistrer les modifications.

AprĂšs avoir cliquĂ© sur « Save changes Â», nous pouvons constater que l’onglet « Registry Â»  est apparu dans le menu de gauche :

Cliquer sur l’onglet « Registry », la page suivante apparait avec les instructions pour pouvoir utiliser le « Container Registry » :

Nous pouvons aussi constater que celui-ci est vide pour le moment : 

6 – Configuration des accĂšs au « Container Registry » GitLab

Pour pouvoir utiliser le Container Registry, il va nous falloir configurer notre certificat et le copier sur le serveur distant. 

  • Management du certificat

Serveur GitLab

Renommer le fichier « /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.crt Â» en « /etc/docker/certs.d/gitlab.samiamoura.com/ca.crt Â»

admin@gitlab:~$ sudo mv /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.crt /etc/docker/certs.d/gitlab.samiamoura.com/ca.crt

Supprimer le fichier « /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.key Â» car celui-ci va nous empĂȘcher de nous logguer sur notre « Container registry Â» :

aadmin@gitlab:~$ sudo rm -f /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.key

Copier le certificat « /etc/docker/certs.d/gitlab.samiamoura.com/ca.crt Â» sur le serveur distant dans le dossier « /etc/docker/certs.d/gitlab.samiamoura.com/ Â» afin de pouvoir utiliser le « Container Registry Â» avec la commande « scp » :

admin@gitlab:~$ sudo scp -i "devops.pem" /etc/docker/certs.d/gitlab.samiamoura.com/ca.crt centos@serveur-distant:/etc/docker/certs.d/gitlab.samiamoura.com/

Serveur distant

VĂ©rifier que le fichier « ca.crt Â» est effectivement prĂ©sent :

[centos@serveur-distant ~]$ ls -la /etc/docker/certs.d/gitlab.samiamoura.com/
-rw-------. 1 root root 2029 Mar 30 19:44 ca.crt

7 – Utilisation du « Container Registry » GitLab

  • Authentification 

Pour utiliser le « Container Registry », il va d’abord falloir se logguer avec un utilisateur.

Se logguer au « Container Registry », avec la commande « sudo docker login » :

[centos@serveur-distant ~]$ sudo docker login gitlab.samiamoura.com
Username: samiamoura
Password: 

 Information : Nous avons utilisĂ© les identifiants (login/password) de l’utilisateur « samiamoura » créé sur « GitLab Â» prĂ©alablement.

Si l’authentification est rĂ©ussie le message suivant apparait :

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
  • Push / Pull des images

Pour tester notre « Container Registry Â», nous allons rĂ©cupĂ©rer une image « Nginx Â» du DockerHub et la pusher sur notre « Container Registry Â» aprĂšs l’avoir tagguĂ©e avec les informations liĂ©es Ă  notre compte.

RĂ©cupĂ©rer l’image « Nginx Â» avec la commande « docker pull » :

[centos@serveur-distant ~]$ sudo docker pull nginx:latest
latest: Pulling from library/nginx
68ced04f60ab: Pull complete 
28252775b295: Pull complete 
a616aa3b0bf2: Pull complete 
Digest: sha256:2539d4344dd18e1df02be842ffc435f8e1f699cfc55516e2cf2cb16b7a9aea0b
Status: Downloaded newer image for nginx:latest

Tagguer l’image prĂ©cĂ©demment tĂ©lĂ©chargĂ©e avec les Ă©lĂ©ments de notre repository et comme indiquĂ© sur la page de notre « Container Registry Â».

Information : La structure de l’image se compose de la façon suivante : « domaineName/usernameGitlab/projectName/imageName:tag »

Utiliser la commande « docker tag Â» pour tagguer l’image « Nginx Â» avec les nos informations :

[centos@serveur-distant ~]$ sudo docker tag nginx:latest gitlab.samiamoura.com/samiamoura/gitlab_registry/nginx:samiamoura-gitlabregistry

Utiliser la commande « docker images Â» pour lister les images : 

[centos@serveur-distant ~]$ sudo docker images
REPOSITORY                                                  TAG                 IMAGE ID            CREATED             SIZE
nginx                                                        latest              6678c7c2e56c        3 weeks ago         127MB
gitlab.samiamoura.com/samiamoura/gitlab_registry/nginx   samiamoura-gitlabregistry 6678c7c2e56c        3 weeks ago         127MB                

Utiliser la commande « docker push Â» pour pusher l’image sur notre « Container Registry Â».

[[centos@serveur-distant ~]$ sudo docker push gitlab.samiamoura.com/samiamoura/gitlab_registry/nginx:samiamoura-gitlabregistry
The push refers to repository [gitlab.samiamoura.com/samiamoura/gitlab_registry/nginx]
d37eecb5b769: Pushed 
99134ec7f247: Pushed 
c3a984abe8a8: Pushed 
samiamoura-gitlabregistry: digest: sha256:7ac7819e1523911399b798309025935a9968b277d86d50e5255465d6592c0266 size: 948

VĂ©rifier que notre image « Nginx Â» est prĂ©sente sur notre « Container Registry Â» GitLab. Se rendre sur l’application GitLab :

Environnement

Infrastructure 

Les serveurs utilisĂ©s pour rĂ©aliser ce tutoriel sont des instances EC2 qui ont Ă©tĂ© provisionnĂ©es avec le provider AWS et grĂące Ă  CloudFormation permettant d’avoir une architecture de type IaC. Ces stacks CloudFormation rĂ©cupĂšrent dynamiquement les sources des applications Ă  dĂ©ployer sur mon repository GitHub. Les applications sont dĂ©ployĂ©es dans des conteneurs Docker afin de privilĂ©gier l’agilitĂ©. 
Information : Toutes les ressources utilisĂ©es lors de ce tutoriel ont Ă©tĂ© dĂ©provisionnĂ©es.


Distribution et version des serveurs

[table id=info-os-gitlab-registry /]


Version des applications

[table id=info-appli-gitlab-registry /]

Références


Sami AMOURA
Ingénieur Core Mobile / DevOps Junior


#azure ansible AWS CI docker git gitlab jenkins