Qu'est-ce que GitLab ?
GitLab est un référentiel de code source ouvert et une plate-forme de développement collaborative. Il est développé sur la base du système de contrôle de version Git. GitLab est l'une des meilleures plates-formes Web pour l'hébergement de codes sources de projets.
Nous allons expliquer comment installer et configurer Gitlab sur CentOS 7.
Prérequis
Système
Distributions linux supportées
- Ubuntu (16.04/18.04)
- Debian (8/9/10)
- CentOS (6/7/8)
- openSUSE (Leap 15.1/Enterprise Server 12.2)
- Red Hat Enterprise Linux (please use the CentOS packages and instructions)
- Scientific Linux (please use the CentOS packages and instructions)
- Oracle Linux (please use the CentOS packages and instructions)
Hardware
Pour 100 utilisateurs.
- 2 vCpu recommandé
- 8 GO de RAM recommandé
- 2 Go de SWAP
Software
Installer les dépendances nécessaires pour l'installation de Gitlab.
# apt -y install curl vim openssh-server ca-certificates
Ensuite, installez “Postfix” pour envoyer des e-mails de notification. Si vous souhaitez utiliser une autre solution pour envoyer des courriels, veuillez sauter cette étape et configurer un serveur SMTP externe après l'installation de GitLab.
# apt -y install postfix
Note:
Lors de l'installation de Postfix, un écran de configuration peut apparaître. Sélectionnez “Site Internet” et appuyez sur la touche Entrée. Utilisez le DNS externe de votre serveur pour le “nom de courrier” et appuyez sur la touche Entrée. Si d'autres écrans apparaissent, continuez à appuyer sur la touche Entrée pour accepter les valeurs par défaut.
Installation
Ajouter le dépôt de paquets GitLab.
# curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | bash
Ensuite, installez le paquet GitLab. Remplacez “https://gitlab.example.com” par l'URL à laquelle vous souhaitez accéder à votre instance GitLab. L'installation configurera et démarrera automatiquement GitLab à cette URL.
Pour les URLs “https://”, GitLab demandera automatiquement un certificat avec Let's Encrypt, qui nécessite un accès HTTP entrant et un nom d'hôte valide. Vous pouvez également utiliser votre propre certificat ou simplement utiliser “http://”.
# export EXTERNAL_URL="gitlab.oowy.lan" # apt install gitlab-ee
Configurer l'URL principale de Gitlab
Attention:
Si gitlab n'est pas fonctionnel, il est fort probable que l'URL à l'étape précédente n'ai pas était prise en compte
La configuration principale de GitLab se trouve dans le répertoire “/etc/gitlab”. Allez dans ce répertoire et éditez le fichier de configuration 'gitlab.rb' avec vim.
# cd /etc/gitlab # nano gitlab.rb
Dans la configuration de GitLab, allez à la ligne 9 “external_url” et changez l'URL en votre URL “gitlab.oowy.lan”.
external_url 'http://gitlab.oowy.lan'.
Enregistrez le fichier et quittez l'éditeur.
Nous devons maintenant exécuter la commande ci-dessous en tant que root pour appliquer la nouvelle configuration de gitlab.
# gitlab-ctl reconfigure
Accès à Gitlab
Lors de votre première visite, vous serez redirigé vers un écran de réinitialisation du mot de passe. Fournissez le mot de passe du compte initial de l'administrateur et vous serez redirigé vers l'écran de connexion. Utilisez le nom d'utilisateur root. Celui-ci est le compte par défaut pour vous connecter.
Administration de gitlab
Inscription
Vous êtes autonome pour créer un compte sur la plateforme.
Merci de respecter la convention prenom.nom lors de votre enregistrement.
Une fois votre compte créé, vous pouvez créer des projets comme bon vous semble dans votre espace personnel.
Les Groupes
Avec les groupes GitLab, vous pouvez rassembler des projets connexes et permettre aux membres d'accéder à plusieurs projets à la fois.
Les groupes peuvent également être imbriqués dans des sous-groupes.
Pour créer un groupe.
Les Projets
Accueil du projet
Cette page permet d'avoir toutes les informations sur le projet.
Le fichier README.md est automatiquement affiché et doit permettre de comprendre les tenants et les aboutissants du projet, ainsi que les moyens pour installer le projet ou collaborer.
Si le projet vous intéresse, mettez-le en favori pour le retrouver facilement sur la page d'accueil ou dans le menu“
Création d'un projet
Créer un projet, c'est créer un espace public ou privé ou vous pouvez versionner des fichiers et collaborer.
Lorsque vous créez un nouveau projet, il peut résider :
- soit dans votre espace personnel : https://[URL]/utilisateur/nom-du-projet
- soit dans un groupe existant : https://[URL]/groupe/nom-du-projet
Plusieurs options de visibilité sont disponibles :
| Visibilité | Invité |
|---|---|
| Privé | Vous serez le seul à pouvoir accéder au projet et à donner des permissions à l'unité |
| Interne | Seuls les utilisateurs authentifiés peuvent voir le projet |
| Public | N'importe qui, même non authentifié peut voir le projet |
Une fois le projet crée, vous pouvez commencer à l'utiliser.
Si le projet est privé, vous pouvez inviter des utilisateurs à collaborer.
Gestion des droits
Vous pouvez inviter des utilisateurs individuellement, ou par groupe.
| Role | Permissions |
|---|---|
| Guest | Lire et commenter les issues |
| Reporter | Gérer les issues, voir le code |
| Developer | Modifier les fichiers, issues |
| Master | Administration du projet |
Options du projet
Un certain nombre d'options permettent de personnaliser le projet.
Parmi les options réglables, vous pouvez :
- Personnaliser le logo, description
- Personnaliser les tags du projet
- Régler les permissions d'accès
- Activer/désactiver les issues/pipelines/wikis/snippets si vous n'en avez pas besoin (cella allège l'affichage)
Les permissions
Les utilisateurs ont des permissions différentes selon le niveau d'accès qu'ils ont dans un groupe ou un projet particulier.
Si un utilisateur est à la fois dans le projet d'un groupe et le projet lui-même, le niveau d'autorisation le plus élevé est utilisé.
Quand on créé un projet, nous en sommes le “Owner”, et accordons des permissions à d'autres membres si nécéssaire.
| Permission | Invité | Reporter | Developer | Master | Owner |
|---|---|---|---|---|---|
| Issues | ✔ | ✔ | ✔ | ✔ | ✔ |
| Gérer les issues | ⨯ | ✔ | ✔ | ✔ | ✔ |
| Effacer une issue | ⨯ | ⨯ | ⨯ | ⨯ | ✔ |
| Lire le wiki | ✔ | ✔ | ✔ | ✔ | ✔ |
| Editer le wiki | ⨯ | ⨯ | ✔ | ✔ | ✔ |
| Commenter | ✔ | ✔ | ✔ | ✔ | ✔ |
| Edit un commentaire | ⨯ | ⨯ | ⨯ | ✔ | ✔ |
| Lire le code | ⨯ | ✔ | ✔ | ✔ | ✔ |
| Contribuer (merge request) | ⨯ | ⨯ | ✔ | ✔ | ✔ |
| git push | ⨯ | ⨯ | ✔ | ✔ | ✔ |
| Gérer l'équipe projet | ⨯ | ⨯ | ⨯ | ✔ | ✔ |
| Configurer les pages projet | ⨯ | ⨯ | ⨯ | ✔ | ✔ |
| Créer un projet dans groupe | ⨯ | ⨯ | ⨯ | ✔ | ✔ |
| Transférer un projet | ⨯ | ⨯ | ⨯ | ⨯ | ✔ |
| Effacer un project | ⨯ | ⨯ | ⨯ | ⨯ | ✔ |
| Voir les jobs | ✔ | ✔ | ✔ | ✔ | ✔ |
| Configurer les hooks | ⨯ | ⨯ | ⨯ | ✔ | ✔ |
| Voir les environments | ⨯ | ✔ | ✔ | ✔ | ✔ |
| Créer un environment | ⨯ | ⨯ | ✔ | ✔ | ✔ |
cf [documentation officielle](https://docs.gitlab.com/ee/user/permissions.html#project-members-permissions)
Forker un projet
Pour contribuer à un projet sur lequel nous n'avons pas les droits en écriture, il est d'usage de forker le projet, d'apporter les modifications (corrections ou améliorations) dans votre propre copie du projet, puis d'envoyer cette contribution en tant que merge request au projet original (qu'on appelle upstream).
Vous pouvez forker un projet depuis la page web du projet, c.a.d. le copier, soit dans votre espace personnel, soit dans un groupe pour lequel vous avez les permissions suffisantes.
Une fois forker, vous êtes en possession d'une copie du projet sur laquelle vous pouvez travailler indépendamment puis éventuellement soumettre des contributions utiles au projet d'origine (upstream)
Gestion des fichiers
Les fichiers d'un repository peuvent être modifiés de multiples façons :
- Via le site web : facile et rapide
- Via un logiciel dédié : permet de travailler sur son poste indépendamment avant d'envoyer les changements
- Via le CLI GIT : permet de comprendre le fonctionnement de GIT et de travailler très précisément
Demandes de fusion
Lorsque vous modifiez des fichiers sur un projet qui ne vous appartient pas, vous pouvez soumettre vos changements pour validation au propriétaire du projet.
Ceci permet de faire une revue, à l'issue de laquelle le propriétaire pourra directement intégrer vos changements dans le projet.
Le format Markdown
Le format markdown permet d'enrichir facilement du texte brut. Dans GitLab, on peut écrire du markdown a peu près partout : fichiers .md, commentaires, issues…
Ce format est exploitable par de nombreux outils, qui permettent par exemple de générer des sites web.
Documentation complète ici : https://fr.wikipedia.org/wiki/Markdown
Quelques outils pratiques :
- Un éditeur en ligne : https://dillinger.io
- un tutoriel interactif : https://www.markdowntutorial.com/
- Helper pour générer des tableaux : https://www.tablesgenerator.com/markdown_tables
- Format mermaid pour générer des schémas : https://gitlab.com/gitlab-org/gitlab-ce/issues/3711
Gestion des issues
Le système d'issues de GitLab est avancé et puissant !
Vous pouvez créez des catégories (tags), assigner les tâches, les estimer, gérer des roadmaps, ajouter des fichiers, commenter, recevoir des notifications, etc… un lieu idéal pour centraliser les discussions autour d'un projet et favoriser la collaboration transparente.
Issue
Pour accéder aux issues du projet :
Vous accédez alors à la liste des issues du projet.
Agile
Les issues peuvent être organisées dans des “boards” type “kanban”. Vous pouvez créer vos propres boards pour organiser vos priorités.
Les issues peuvent être groupés par “milestones” (sprints). Ceci permet de grouper des tâches pour en suivre la complétion.
Gestion des Services
Vérifier l'état des services
$ sudo gitlab-ctl status run: alertmanager: (pid 3067) 12s; run: log: (pid 2682) 115s run: gitaly: (pid 3028) 14s; run: log: (pid 2146) 243s run: gitlab-exporter: (pid 3027) 14s; run: log: (pid 2619) 136s run: gitlab-workhorse: (pid 3000) 15s; run: log: (pid 2508) 159s run: grafana: (pid 3091) 11s; run: log: (pid 2922) 33s run: logrotate: (pid 2561) 149s; run: log: (pid 2581) 146s run: nginx: (pid 2535) 155s; run: log: (pid 2548) 151s run: node-exporter: (pid 3012) 14s; run: log: (pid 2602) 139s run: postgres-exporter: (pid 3080) 11s; run: log: (pid 2719) 109s run: postgresql: (pid 2275) 234s; run: log: (pid 2326) 233s run: prometheus: (pid 3044) 13s; run: log: (pid 2663) 123s run: puma: (pid 2447) 173s; run: log: (pid 2460) 170s run: redis: (pid 2079) 252s; run: log: (pid 2101) 249s run: redis-exporter: (pid 3036) 13s; run: log: (pid 2642) 128s run: sidekiq: (pid 2467) 167s; run: log: (pid 2479) 166s
Démarrer Gitlab
$ sudo gitlab-ctl start ok: run: alertmanager: (pid 3960) 1s ok: run: gitaly: (pid 3970) 0s ok: run: gitlab-exporter: (pid 3979) 0s ok: run: gitlab-workhorse: (pid 3981) 1s ok: run: grafana: (pid 3990) 0s ok: run: logrotate: (pid 4008) 1s ok: run: nginx: (pid 4014) 0s ok: run: node-exporter: (pid 4021) 1s ok: run: postgres-exporter: (pid 4029) 0s ok: run: postgresql: (pid 4036) 1s ok: run: prometheus: (pid 4038) 0s ok: run: puma: (pid 4055) 1s ok: run: redis: (pid 4064) 0s ok: run: redis-exporter: (pid 4070) 0s ok: run: sidekiq: (pid 4076) 1s
Arrêt Gitlab
$ sudo gitlab-ctl stop
ok: down: alertmanager: 1s, normally up
ok: down: gitaly: 1s, normally up
ok: down: gitlab-exporter: 0s, normally up
ok: down: gitlab-workhorse: 1s, normally up
ok: down: grafana: 0s, normally up
ok: down: logrotate: 1s, normally up
ok: down: nginx: 0s, normally up
ok: down: node-exporter: 1s, normally up
ok: down: postgres-exporter: 0s, normally up
ok: down: postgresql: 0s, normally up
ok: down: prometheus: 0s, normally up
ok: down: puma: 1s, normally up
ok: down: redis: 0s, normally up
ok: down: redis-exporter: 0s, normally up
ok: down: sidekiq: 0s, normally up
Administration avancée
Fonctionnalité de base
Maintenant que notre plateforme gitlab est opérationnelle, nous allons changer les configurations suivantes : - Vérification automatique des mises à jours. - Changement du début de la semaine.
Pour activer la vérification automatique des mises à jours, il faudra se rendre dans la section : Settings > Metrics and Profiling. Cocher “Enable version check” et “Enable usage ping” dans la section “Usage statistics”
Pour définir le premier jour de la semaine, il faudra se rendre dans la section : Settings > Preferences. Séléctionner “Monday” dans la liste déroulante se trouvant dans la section “Localization”
Mise à jour de gitlab
Comme tout logiciel, Gitlab suit un process de mise à jour bien défini.
Dans notre exemple, la plateforme se trouve en version 13.0.3. Nous allons donc réaliser la mise à jour de la plateforme avec la dernière version stable, à savoir la version 13.1.1
Faire une sauvegarde (facultatif)
Si vous souhaitez effectuer une sauvegarde avant la mise à jour, la commande ci-dessous sauvegardera les données dans “/var/opt/gitlab/backups” par défaut.
$ sudo gitlab-rake gitlab:backup:create STRATEGY=copy
Mise à jour du GitLab
Mise à jour vers la dernière version du GitLab.
$ sudo apt-get update && sudo apt-get install gitlab-ce
Vérification
Voilà, notre plateforme est bien déployée avec la dernière version fournie par la société Gitlab Inc°
Désactiver la création des users
Pour désactiver la possibilité à un utilisateurs de créer un compte, il nous suffira de décocher une option dans le back-office de gitlab.
Dans Gitlab > Admin area > Settings > General > décocher → “Signup enabled”
Active Directory
La gestion d'un grand nombre d'utilisateurs dans le GitLab peut devenir un fardeau pour les administrateurs du système. La croissance d'une organisation s'accompagne d'une augmentation du nombre de comptes d'utilisateurs. Maintenir ces comptes utilisateurs synchronisés entre plusieurs applications d'entreprise devient souvent une tâche qui prend beaucoup de temps.
Active Directory est un service d'annuaire populaire compatible LDAP fourni par Microsoft, inclus dans tous les systèmes d'exploitation modernes Windows Server.
GitLab prend en charge l'intégration LDAP depuis la version 2.2. La synchronisation de groupe LDAP de GitLab a été ajoutée à GitLab Enterprise Edition dans la version 6.0. L'intégration LDAP est devenue l'une des fonctionnalités les plus populaires de GitLab.
Pour configurer notre gitlab avec un contrôleur de domaine active directory 2016
Création d'un compte de service
Nous allons créer un utilisateur du domaine qui va permettre à la plateforme gitlab.
Configurer le fichier gitlab.rb
Editer le fichier “gitlab.rb” et renseigner les paramètres suivants :
# nano /etc/gitlab/gitlab.rb ... gitlab_rails['ldap_enabled'] = true # gitlab_rails['prevent_ldap_sign_in'] = false ### gitlab_rails['ldap_servers'] = { 'main' => { # 'main' is the GitLab 'provider ID' of this LDAP server 'label' => 'ActiveDirectory', 'host' => 'dc01.oowy.lan', 'port' => 389, 'uid' => 'sAMAccountName', 'encryption' => 'plain', # "start_tls" or "simple_tls" or "plain" 'verify_certificates' => true, 'bind_dn' => 'CN=sa-gitlab,OU=services-account,OU=Ressources,DC=oowy,DC=lan', 'password' => 'Password91', 'smartcard_auth' => false, 'active_directory' => true, 'allow_username_or_email_login' => false, 'lowercase_usernames' => false, 'block_auto_created_users' => false, 'base' => 'OU=utilisateurs,OU=Ressources,DC=oowy,DC=lan', 'user_filter' => '', 'attributes' => { 'username' => ['uid', 'userid', 'sAMAccountName'], 'email' => ['mail', 'email', 'userPrincipalName'], 'name' => 'cn', 'first_name' => 'givenName', 'last_name' => 'sn' }, 'lowercase_usernames' => false }, }
Lancer la commande reconfigure
# gitlab-ctl reconfigure
Lancer un check
# gitlab-rake gitlab:ldap:check
Backup Gitlab
GitLab permet de prendre une copie de sauvegarde de votre plateforme en utilisant une simple commande.
» Gitlab 12.2 et supérieur.
# gitlab-backup create 2021-03-20 22:57:34 +0100 -- Dumping database ... Dumping PostgreSQL database gitlabhq_production ... [DONE] 2021-03-20 22:57:42 +0100 -- done 2021-03-20 22:57:42 +0100 -- Dumping repositories ... * gitlab-instance-b4b5ecbb.wiki (@groups/d4/73/d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35.wiki) ...
» Gitlab 12.1 et inférieur.
# gitlab-rake gitlab:backup:create 2020-11-29 20:58:14 +0100 -- Dumping database ... Dumping PostgreSQL database gitlabhq_production ... [DONE] 2020-11-29 20:58:16 +0100 -- done 2020-11-29 20:58:16 +0100 -- Dumping repositories ... * gitlab-instance-26a21388/monitoring (@hashed/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b) ... * gitlab-instance-26a21388/monitoring (@hashed/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b) ... [SKIPPED] * gitlab-instance-26a21388/monitoring.wiki (@hashed/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b.wiki) ... * gitlab-instance-26a21388/monitoring.wiki (@hashed/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b.wiki) ... [SKIPPED] * gitlab-instance-26a21388/monitoring.design (@hashed/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b.design) ... * gitlab-instance-26a21388/monitoring.design (@hashed/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b.design) ... [SKIPPED] ...
Le fichier tar de sauvegarde seront créés dans le répertoire “/var/opt/gitlab/backups” par défaut.
Restore Gitlab
GitLab permet de restaurer la copie de sauvegarde de votre plateforme.
Tout d'abord, vérifier que votre sauvegarde est bien présente dans le repertoire : /var/opt/gitlab/backups
Maintenant, arrêtez les processus qui sont liés à la base de données en utilisant les commandes suivantes.
# gitlab-ctl stop unicorn ... # gitlab-ctl stop sidekiq
Note:
Les commandes ci-dessus peuvent également être utilisées pour libérer temporairement une partie de la mémoire en les arrêtant
Vous pouvez vérifier l'état des services du GitLab en utilisant la commande ci-dessous
# gitlab-ctl status
Maintenant, restaurez la sauvegarde en utilisant l'horodatage de la copie de sauvegarde
# gitlab-rake gitlab:backup:restore BACKUP = 1606679901_2020_11_29_13.6.1-ee_gitlab_backup.tar
Une fois l'opération terminée, redémarrez les composants GitLab en utilisant la commande ci-dessous
# gitlab-ctl restart
Vérifiez maintenant le GitLab en nettoyant la base de données comme indiqué ci-dessous.
# gitlab-rake gitlab:check SANITIZE = true
Le paramètre SANITIZE = true supprime toutes les adresses électroniques parce qu'elles sont confidentielles, supprime les variables CI et les jetons d'accès tels qu'ils peuvent être utilisés dans l'instance de production.
Reset root password
Pour réinitialiser le mot de passe root, connectez-vous d'abord à votre serveur avec les privilèges de root.
Démarrez une console Ruby on Rails avec cette commande :
# gitlab-rails console -e production -------------------------------------------------------------------------------- GitLab: 13.0.3 (e2397fc2acb) FOSS GitLab Shell: 13.2.0 PostgreSQL: 11.7 -------------------------------------------------------------------------------- Loading production environment (Rails 6.0.3) irb(main):001:0>
Attendez que la console soit chargée.
Il existe de multiples façons de trouver votre utilisateur.
irb(main):001:0> user = User.where(id: 1).first => #<User id:1 @root>
Vous pouvez maintenant changer votre mot de passe :
irb(main):002:0> user.password = 'secret_pass' => "secret_pass" irb(main):003:0> user.password_confirmation = 'secret_pass' => "secret_pass"
N'oubliez pas de sauvegarder les modifications.
irb(main):004:0> user.save! Enqueued ActionMailer::DeliveryJob (Job ID: eceeb5ea-8f96-4189-98c1-a87babc41928) to Sidekiq(mailers) with arguments: "DeviseMailer", "password_change", "deliver_now", #<GlobalID:0x00007f00c053f5d0 @uri=#<URI::GID gid://gitlab/User/1>> => true
Sortez de la console et essayez de vous connecter avec votre nouveau mot de passe.
GitLab Container Registry
Troubleshooting
Suppression impossible repo
https://gitlab.com/gitlab-org/gitlab-foss/-/issues/27457
gitlab-rails console irb(main):001:0> Project.unscoped.where(pending_delete: true).map(&:name_with_namespace) => ["applaudience / filming-locations-map", "applaudience / showtime-data-scraper-sources"] irb(main):002:0> irb(main):003:0* Project.unscoped.where(pending_delete: true) => #<ActiveRecord::Relation [#<Project id:97 applaudience/filming-locations-map>, #<Project id:76 applaudience/showtime-data-scraper-sources>]> irb(main):004:0> p = Project.unscoped.find(76) => #<Project id:76 applaudience/showtime-data-scraper-sources> irb(main):005:0> p.pending_delete => true irb(main):006:0> p.pending_delete = false => false irb(main):007:0> p.save => true irb(main):008:0> p.errors.full_messages => [] irb(main):009:0> u = User.find_by_username('gajus') => #<User id:4 @gajus> irb(main):010:0> Projects::DestroyService.new(p, u, {}).execute Scoped order and limit are ignored, it's forced to be batch order and batch size => true
Annexe
https://about.gitlab.com/install/
https://docs.gitlab.com/omnibus/update/
https://docs.gitlab.com/ee/administration/auth/ldap/index.html
https://docs.gitlab.com/ee/raketasks/backup_restore.html
https://gitlab.oowy.fr/help/user/project/deploy_tokens/index.md
https://stackoverflow.com/questions/25689231/getting-gitlab-ci-to-clone-private-repositories