Qu'est-ce que la gestion de version et pourquoi devriez-vous vous en soucier ?
Un gestionnaire de version est un système qui enregistre l'évolution d'un fichier ou d'un ensemble de fichiers au cours du temps de manière à ce qu'on puisse rappeler une version antérieure d'un fichier à tout moment.
Si vous êtes un dessinateur ou un développeur web, et que vous voulez conserver toutes les versions d'une image ou d'une mise en page (ce que vous souhaiteriez assurément), un système de gestion de version (VCS en anglais pour Version Control System) est un outil qu'il est très sage d'utiliser. Il vous permet de ramener un fichier à un état précédent, ramener le projet complet à un état précédent, comparer les changements au cours du temps, voir qui a modifié quelque chose qui pourrait causer un problème, qui a introduit un problème et quand, et plus encore.
Utiliser un VCS signifie aussi généralement que si vous vous trompez ou que vous perdez des fichiers, vous pouvez facilement revenir à un état stable. De plus, vous obtenez tous ces avantages avec une faible surcharge de travail.
Les systèmes de gestion de version distribués ou DVCSs en anglais pour Distributed Version Control Systems (tel que Git, Mercurial, Bazaar or Darcs), les clients n'extraient plus seulement la dernière version d'un fichier, mais ils dupliquent complètement le dépôt. Ainsi, si le serveur disparaît, et si les systèmes collaboraient via ce serveur, n'importe quel dépôt d'un des clients peut être copié sur le serveur pour le restaurer. Chaque extraction devient une sauvegarde complète de toutes les données.
De plus, un grand nombre de ces systèmes gère particulièrement bien le fait d'avoir plusieurs dépôts avec lesquels travailler, vous permetant de collaborer avec différents groupes de personnes de manière différentes simultanément dans le même projet. Cela permet la mise en place de différentes chaînes de traitement qui ne sont pas réalisables avec les systèmes centralisés, tels que les modèles hiérarchiques.
Git est un gestionnaire de version, libre et très performant. Il possède de nombreux avantages par rapport à svn, notamment, la possibilité de travailler localement. C’est à dire de faire des “commits” local et de les éditer localement avant de les pousser vers un serveur pour qu'ils soient intégrés au dépôt central.
Voici une liste d’avantage que possède git par rapport à svn :
Gitea est un fork de Gogs. Un outil pour gérer des dépôts Git via une interface web. Cela propose une gestion des tickets attachés au projet, des pages de Wiki, une gestion des utilisateurs et des groupes d'utilisateurs et des liens vers de l'intégration continue.
Gitea, tout comme Gogs, se veut être multiplateforme, léger, en un binaire unique et Open Source !
L'équipe de Gitea explique sur son blog pourquoi elle a forké le projet. Je résumerais la chose ainsi : Gogs ne possède qu'une et une seule porte d'entrée aux contributions, c'est à dire un seul développeur. Ce qui, à long terme, ne permet probablement pas d'en assurer la pérennité. Gitea résout le problème en proposant plusieurs personnes pour maintenir le projet. Personnes précédemment choisies par la communauté.
Pour nous aider à déterminer si Gitea est adapté à nos besoins, voici comment il se compare aux autres options auto-hébergées de Git.
Sachez que nous ne vérifions pas régulièrement les modifications apportées aux fonctionnalités des autres produits pour que cette liste soit obsolète.
Symboles utilisés dans le tableau:
✓ - pris en charge
/ - pris en charge avec des fonctionnalités limitées
✘ - non pris en charge
Caractéristiques générales
| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE |
|---|---|---|---|---|---|---|---|
| Open source and free | ✓ | ✓ | ✘ | ✓ | ✘ | ✘ | ✓ |
| Low resource usage (RAM/CPU) | ✓ | ✓ | ✘ | ✘ | ✘ | ✘ | ✘ |
| Multiple database support | ✓ | ✓ | ✘ | ⁄ | ⁄ | ✓ | ✓ |
| Multiple OS support | ✓ | ✓ | ✘ | ✘ | ✘ | ✘ | ✓ |
| Easy upgrade process | ✓ | ✓ | ✘ | ✓ | ✓ | ✘ | ✓ |
| Markdown support | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Static Git-powered pages | ✘ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
| Integrated Git-powered wiki | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ |
| Deploy Tokens | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Repository Tokens with write rights | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✓ |
| Built-in Container Registry | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
| External git mirroring | ✓ | ✓ | ✘ | ✘ | ✓ | ✓ | ✓ |
| FIDO U2F (2FA) | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
| Built-in CI/CD | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
| Subgroups: groups within groups | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✓ |
Code management
| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE |
|---|---|---|---|---|---|---|---|
| Repository topics | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
| Repository code search | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Global code search | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Git LFS 2.0 | ✓ | ✘ | ✓ | ✓ | ✓ | ⁄ | ✓ |
| Group Milestones | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
| Granular user roles (Code, Issues, Wiki etc) | ✓ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
| Verified Committer | ✘ | ✘ | ? | ✓ | ✓ | ✓ | ✘ |
| GPG Signed Commits | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Reject unsigned commits | ✘ | ✘ | ✓ | ✓ | ✓ | ✘ | ✓ |
| Repository Activity page | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Branch manager | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Create new branches | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
| Web code editor | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Commit graph | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
Issue Tracker
| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE |
|---|---|---|---|---|---|---|---|
| Issue tracker | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ |
| Issue templates | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ |
| Labels | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ |
| Time tracking | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
| Multiple assignees for issues | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
| Related issues | ✘ | ✘ | ⁄ | ✘ | ✓ | ✘ | ✘ |
| Confidential issues | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
| Comment reactions | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
| Lock Discussion | ✘ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
| Batch issue handling | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ |
| Issue Boards | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
| Create new branches from issues | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
| Issue search | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
| Global issue search | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
| Issue dependency | ✓ | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ |
Pull/Merge requests
| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE |
|---|---|---|---|---|---|---|---|
| Pull/Merge requests | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Squash merging | ✓ | ✘ | ✓ | ✘ | ✓ | ✓ | ✓ |
| Rebase merging | ✓ | ✓ | ✓ | ✘ | ⁄ | ✘ | ✓ |
| Pull/Merge request inline comments | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Pull/Merge request approval | ✓ | ✘ | ⁄ | ✓ | ✓ | ✓ | ✓ |
| Merge conflict resolution | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
| Restrict push and merge access to certain users | ✓ | ✘ | ✓ | ⁄ | ✓ | ✓ | ✓ |
| Revert specific commits or a merge request | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
| Pull/Merge requests templates | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ |
| Cherry-picking changes | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ |
3rd-party integrations
| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE |
|---|---|---|---|---|---|---|---|
| Webhook support | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Custom Git Hooks | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| AD / LDAP integration | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Multiple LDAP / AD server support | ✓ | ✓ | ✘ | ✘ | ✓ | ✓ | ✓ |
| LDAP user synchronization | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
| OpenId Connect support | ✓ | ✘ | ✓ | ✓ | ✓ | ? | ✘ |
| OAuth 2.0 integration (external authorization) | ✓ | ✘ | ⁄ | ✓ | ✓ | ? | ✓ |
| Act as OAuth 2.0 provider | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ |
| Two factor authentication (2FA) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ |
| Mattermost/Slack integration | ✓ | ✓ | ⁄ | ✓ | ✓ | ⁄ | ✓ |
| Discord integration | ✓ | ✓ | ✓ | ✘ | ✘ | ✘ | ✘ |
| External CI/CD status display | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ |
Installation de git.
[root@git ~]# yum -y install git
Création d'un utilisateur gitea.
[root@git ~]# useradd -m -s /bin/bash gitea
Création de l'arborescence et Affectation des privilèges sur la plateforme.
[root@git ~]# mkdir -p /etc/gitea [root@git ~]# chmod 750 /etc/gitea
[root@git ~]# mkdir -p /opt/gitea/{data,log,custom} [root@git ~]# mkdir -p /opt/gitea/custom/{https,mailer} [root@git ~]# chmod 770 /opt/gitea [root@git ~]# chown -Rf gitea:gitea /opt/gitea
On se rend dans l'arborescence dans le répertoire qui va contenir le binaire gitea.
[root@git ~]# cd /usr/local/bin/
Note:
Tous les téléchargements sont fournis avec le support SQLite, MySQL et PostgreSQL, et sont construits avec des ressources incorporées. Cela peut être différent pour les anciennes versions.
Choisissez le fichier correspondant à la plate-forme de destination dans la page de téléchargement, copiez l'URL :
[root@git bin]# wget -O gitea https://dl.gitea.io/gitea/1.4.3/gitea-1.4.3-linux-amd64 --2018-08-09 23:20:42-- https://dl.gitea.io/gitea/1.4.3/gitea-1.4.3-linux-amd64 Résolution de dl.gitea.io (dl.gitea.io)... 104.27.142.155, 104.27.143.155, 2400:cb00:2048:1::681b:8e9b, ... Connexion vers dl.gitea.io (dl.gitea.io)|104.27.142.155|:443...connecté. requête HTTP transmise, en attente de la réponse...200 OK Longueur: 53675088 (51M) [application/octet-stream] Sauvegarde en : «gitea» 100%[================================================================================>] 53 675 088 320KB/s ds 2m 3s 2018-08-09 23:22:46 (425 KB/s) - «gitea» sauvegardé [53675088/53675088]
On modifie le user/group du binaire
[root@git bin]# chown root:root gitea
On rend le binaire exécutable
[root@git bin]# chmod 755 gitea
Après avoir obtenu le fichier binaire, il peut être testé avec “./gitea web”. Une fois gitea démarré , nous pouvons “tuer” le processus en utilisant Ctrl + C lorsqu'il est lancé manuellement
[root@git bin]# ./gitea web 2018/08/09 23:26:24 [T] AppPath: /opt/gitea/bin/gitea 2018/08/09 23:26:24 [T] AppWorkPath: /opt/gitea/bin 2018/08/09 23:26:24 [T] Custom path: /opt/gitea/bin/custom 2018/08/09 23:26:24 [T] Log path: /opt/gitea/bin/log 2018/08/09 23:26:24 [I] Gitea v1.4.3 built with: bindata, sqlite 2018/08/09 23:26:24 [I] Log Mode: Console(Info) 2018/08/09 23:26:24 [I] XORM Log Mode: Console(Info) 2018/08/09 23:26:24 [I] Cache Service Enabled 2018/08/09 23:26:24 [I] Session Service Enabled 2018/08/09 23:26:24 [I] SQLite3 Supported 2018/08/09 23:26:24 [I] Run Mode: Development 2018/08/09 23:26:24 [I] Listen: http://0.0.0.0:3000 2018/08/09 23:26:24 Serving [::]:3000 with pid 1442 [CONTROL+C] 2018/08/09 23:26:30 Exiting pid 1442. [root@localhost bin]#
[root@git ~]# vi /etc/systemd/system/gitea.service
[Unit] Description=Gitea git server After=syslog.target After=network.target [Service] # Modify these two values and uncomment them if you have # repos with lots of files and get an HTTP error 500 because # of that ### #LimitMEMLOCK=infinity #LimitNOFILE=65535 RestartSec=2s Type=simple User=gitea Group=gitea ExecStart=/usr/local/bin/gitea web -c /etc/gitea/gitea.ini Restart=on-failure WorkingDirectory=/opt/gitea [Install] WantedBy=multi-user.target
[root@git ~]# systemctl daemon-reload [root@git ~]# systemctl enable gitea
Nous allons nous servir d'un serveur web comme reverse-proxy pour rendre accessible notre plateforme de version ingénieur à travers une URL précise.
[root@git ~]# yum install nginx
Pour la création du fichier qui va nous permettre d'utiliser Nginx comme reverse-proxy, il faut se positionner dans le répertoire conf.d du programme:
[root@git ~]# cd /etc/nginx/conf.d
Nous allons créer le reverse-proxy avec une configuration très simple.
[root@git conf.d]# nano gitea.conf
vhost : gitea.conf
upstream gitea{ server 127.0.0.1:3000; } server{ listen 80; server_name gitea.oowy.lan; access_log /var/log/nginx/gitea.access.log; error_log /var/log/nginx/gitea.error.log; ignore_invalid_headers off; location / { proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_request_buffering off; proxy_buffering off; proxy_pass http://gitea; proxy_read_timeout 90; proxy_redirect http://127.0.0.1:3000 http://gitea.oowy.lan; } }
On démarre le serveur web Nginx.
[root@git ~]# systemctl start nginx
On active le lancement automatique du programme au (re)démarrage du serveur:
[root@git ~]# systemctl enable nginx
Et on démarre gitea :
[root@git bin]# systemctl start gitea
Une fois toutes les étapes réalisées, nous allons procéder à la configuration du produit.
Se rendre à l'URL : http://<NOM_FQDN_SERVER_GITEA>/
Note:
Par défaut, tout les champs concernant les répertoires de Gitea (data/log/etc…) sont déjà configurés.
Il ne restera qu'a choisir le type de base de donnée voulu. Ici, nous allons sélectionner SQLite.
Attention:
Mettre à jour le champs “Domain” et “Application URL” avec votre nom de domaine.
Exemple : git.oowy.fr au lieu de localhost.
Une fois l'installation terminée, il suffira de créer un user.
Attention:
Si le compte administrateur n'est pas renseigné dans la section “Admin Account Settings” de l'installeur alors le premier user qui sera crée sur la plateforme Gitea sera automatiquement promu “Administrateur”.
Notre plateforme Gitea est opérationnelle.
Après avoir installé le serveur de gestion de code Gitea, la prochaine action est probablement la bonne gestion des utilisateurs. La méthode d'authentification utilisateur standard dans la plupart des entreprises est LDAP/AD. Il n'est pas justifié de gérer une base de données utilisateur distincte pour l'authentification de Gitea si vous utilisez un serveur LDAP.
Nous allons donc configurer le backend LDAP comme base de données pour l'authentification des utilisateurs.
Les pré-requis pour cette configuration sont:
Serveur LDAP existant ( Active Directory / FreeIPA) Serveur Gitea installé et fonctionnel Administrateur LDAP
Accédez à votre serveur LDAP(FreeIPA) et créez un compte de service via la ligne de commande.
[root@auth01 ~]# nano ServiceAccounts.ldif dn: uid=sa-gitea,cn=sysaccounts,cn=etc,dc=oowy,dc=lan changetype: add objectclass: account objectclass: simplesecurityobject uid: sa-gitea userPassword: <your_password> passwordExpirationTime: 20380119031407Z nsIdleTimeout: 0
Importez le LDIF (changez localhost par le serveur IPA si nécessaire). Une invite pour le mot de passe Directory Manager sera présentée
[root@auth01 ~]# ldapmodify -h localhost -p 389 -x -D "cn=Directory Manager" -W -f ServiceAccounts.ldif Enter LDAP Password: adding new entry "uid=sa-gitea,cn=sysaccounts,cn=etc,dc=oowy,dc=lan"
Nous allons ensuite créer 2 groupes.
Ajoutez un groupe IPA pour la gestion des utilisateurs “gitea_users”
[root@auth01 ~]# ipa group-add --desc="Gitea Users" gitea_users
Ajoutez un groupe IPA pour la gestion des administrateurs “gitea_admins”
[root@auth01 ~]# ipa group-add --desc="Gitea Admins" gitea_admins
Note:
Pour les erreurs concernant les informations d'identification IPA, exécutez kinit admin et fournissez le mot de passe du compte d'administrateur de domaine.
Arrivé à cette étapes nous allons tout simplement ajouter une nouvelle source d'authentification. Cliquer sur : Site Administration > Authentication Sources > Add Authentication Sources
Dans le cadre de notre plateforme, le type LDAP (via BindDN) est utilisé car une option de synchronisation est disponible, et les valeurs saisies sont en relation avec l'installation faite de FreeIPA
Accédez à votre serveur Active Directory et créez un compte de service.
Nous allons créer un utilisateur “sa-gitea”
Nous allons ensuite créer 2 groupes.
Maintenant que nous disposons d'un compte de service ainsi que de nos 2 groupes, Nous allons configurer Gitea.
Arrivé à cette étapes nous allons tout simplement ajouter une nouvelle source d'authentification. Cliquer sur : Site Administration > Authentication Sources > Add Authentication Sources
Dans le cadre de notre plateforme, le type LDAP (via BindDN) est utilisé car une option de synchronisation est disponible, et les valeurs saisies sont en relation avec l'installation faite sur notre Active Directory.
Dans le précédent formulaire, l'option Enable user synchronization est activé afin d'avoir un référencement d'utilisateurs à jour en fonction de l'annuaire.
Note:
La synchronisation est réalisée une fois par jour par défaut. Ceci est modifiable dans le fichier app.ini, section cron.sync_external_users.
Cependant, il est possible de déclencher manuellement la synchronisation depuis l'onglet Dashboard. Un ensemble d'opération est disponible et il faut exécuter Synchronize external user data.
Mise à jour vers une nouvelle version
Nous pouvons mettre à jour une nouvelle version de gitea en stoppant gitea et en remplaçant le binaire dans “/opt/gitea/bin/” et en redémarrant l'instance. Le nom du fichier binaire ne doit pas être modifié pendant la mise à jour pour éviter les problèmes dans les référentiels existants.
Il est recommandé de faire une sauvegarde avant de mettre à jour l'installation.
Nous commençons par arrêter le service.
[root@srv ~]# systemctl stop gitea Redirecting to /bin/systemctl stop gitea.service
On renomme l'ancien binaire.
[root@gitea bin]# mv gitea gitea.1.4
On télécharge la nouvelle version.
[root@gitea bin]# wget -O gitea https://dl.gitea.io/gitea/1.5/gitea-1.5-linux-amd64 --2018-08-30 00:17:23-- https://dl.gitea.io/gitea/1.5/gitea-1.5-linux-amd64 Résolution de dl.gitea.io (dl.gitea.io)... 104.27.143.155, 104.27.142.155, 2400:cb00:2048:1::681b:8f9b, ... Connexion vers dl.gitea.io (dl.gitea.io)|104.27.143.155|:443...connecté. requête HTTP transmise, en attente de la réponse...200 OK Longueur: 60473144 (58M) [application/octet-stream] Sauvegarde en : «gitea» 100%[====================================================================================================================>] 60 473 144 222KB/s ds 2m 26s 2018-08-30 00:19:50 (404 KB/s) - «gitea» sauvegardé [60473144/60473144]
On rend le binaire executable.
[root@gitea bin]# chmod +x gitea
On relance Gitea.
[root@gitea bin]# systemctl start gitea
https://docs.gitea.io/en-us/authentication/
Quelques explications sur la source d'authentification
| Paramètre | Valeur |
|---|---|
| Authentication Name | FreeIPA/ActiveDirectory - Nom, affiché dans l'interface, de la source de connexion. |
| Security Protocol | Unencrypted - Type de connexion |
| Host | auth01.oowy.lan - FQDN / IP du serveur d'authentification |
| Port | 389 |
| Bind DN | uid=sa-gitea,cn=sysaccounts,cn=etc,dc=oowy,dc=lan - Le compte utilisé pour se connecter à l'annuaire lors de la synchronisation. |
| Bind Password | Mot de passe du compte Bind DN. Un message d'avertissement est présenté indiquant qu'il est préférable d'utiliser un compte en lecture seule. |
| User Search Base | cn=users,cn=accounts,dc=oowy,dc=lan - La base de recherche des utilisateurs. |
| User Filter | (&(memberOf=CN=gitea_users,CN=groups,CN=accounts,DC=oowy,DC=lan)(uid=%s)) - L'appartenance au groupe gitea-Users est mis en place dans ce filtre. |
| Admin Filter | (memberOf=CN=gitea_admins,CN=groups,CN=accounts,DC=oowy,DC=lan) - Ce filtre permet d'identifier si l'utilisateur est dans le groupe gitea-Admins afin de donner les droits d'administration. |
| Username attribute | uid - Correspond à l'attribut pour le nom de l'utilisateur, pourrait être laissé vide pour utilisateur l'identifiant de connexion. |
| First name attribute | givenName - Attribut contenant le prénom de l'utilisateur. |
| Surname attribute | sn - Attribut contenant le nom de l'utilisateur. |
| Email attribute | mailAttribut - contenant le mail de l'utilisateur. |