doc/build_system_fr.md

199 lines
8.9 KiB
Markdown
Raw Normal View History

2014-10-04 13:51:00 +02:00
#Création de paquet Debian
2014-10-09 13:08:07 +02:00
## Architecture
2015-02-04 11:32:19 +01:00
Le système se compose de `rebuildd` qui est un front-end pour `pbuilder`, des chroot pbuilder pour i386, amd64, armhf et de `reprepro` pour le système de repo debian.
2014-10-04 13:51:00 +02:00
2014-10-09 13:10:16 +02:00
---
2014-10-04 13:51:00 +02:00
## Workflow
2015-05-01 17:47:54 +02:00
Il existe trois repo (`unstable`, `testing` et `stable`):
* Les paquets du repo `unstable` (aussi appelé `daily` à certains endroits) correspondent à la dernière version du git, et sont reconstruits de façon automatisée toutes les nuits.
2014-10-04 13:51:00 +02:00
2015-05-01 17:47:54 +02:00
* Le repo `testing` (aussi appelé `test` à certains endroits) permet de mettre en place une nouvelle version d'un paquet qui sera ensuite testé
2015-02-04 12:15:45 +01:00
2015-05-01 17:47:54 +02:00
* Le repo `stable` (aussi appelé `megusta` à certains endroits) contient la version de production
2015-02-04 12:15:45 +01:00
Le but du workflow est d'éviter toute intervention manuelle (lancement d'un script, ...) sur le serveur, et de maîtriser la gestion des paquets via GitHub uniquement.
2015-05-01 17:47:54 +02:00
Ansi, les dépôts de chaque paquet yunohost possèdent 3 branches correspondant aux trois dépôts (`unstable`, `testing` et `stable`). Le serveur de build construit et déploie **automatiquement** les paquets source et binaires Debian correspondant à l'état de ces trois branches sur GitHub.
2015-02-04 12:15:45 +01:00
2015-05-01 17:47:54 +02:00
### Branche unstable
2015-02-04 12:15:45 +01:00
2015-05-01 17:47:54 +02:00
Aucun commit dans la branche unstable ne modifie le fichier `debian/changelog` car celui-ci est modifié automatiquement lors du build quotidien, avec une version correspondant à la date/heure de construction.
2015-02-04 12:22:23 +01:00
2015-05-01 17:47:54 +02:00
Tout commit modifiant fonctionnellement les paquets doit se faire d'abord dans cette branche `unstable`.
2015-02-04 12:15:45 +01:00
2015-05-01 17:47:54 +02:00
**`TODO`** ajouter un pre-commit hook pour éviter les erreurs ?
2015-02-04 12:15:45 +01:00
2015-05-01 17:47:54 +02:00
### Branche testing et stable - workflow standard
2015-02-04 12:15:45 +01:00
2015-05-01 17:47:54 +02:00
Aucun commit fonctionnel n'est effectué directement dans ces branches. On ne fait que des merges (merge de `unstable` dans `testing` et merge de `testing` dans `stable`).
2015-02-04 12:15:45 +01:00
2015-05-01 17:47:54 +02:00
Les seules modifications spécifiques à ces dépôts sont les changements de versions (modification de `debian/changelog`, puis tag).
2015-02-04 12:15:45 +01:00
Des outils à destinations des mainteneurs de paquets sont disponibles sur le dépôt [yunohost-debhelper](https://github.com/YunoHost/yunohost-debhelper)
```bash
2015-05-01 17:47:54 +02:00
git clone https://github.com/YunoHost/yunohost-debhelper
yunohost-debhelper/setup_git_alias.sh
2015-02-04 12:15:45 +01:00
```
2015-02-04 12:22:23 +01:00
Ceci va configurer un nouvel alias git nommé `yunobump`, global (stocké dans `~/.gitconfig` et donc accessible depuis n'importe quel dépôt git local).
2015-05-01 17:47:54 +02:00
<div class="alert alert-warning">
**Attention :** Pour le moment ce helper `yunobump` ne fonctionne que sous Ubuntu ou Debian Jessie. Vous **devez** installer les paquets `git` et `git-buildpackage` pour que le helper fonctionne correctement.
</div>
#### Sans helper
1. Rendez-vous dans le repo du paquet que vous voulez builder
2. Assurez-vous que la branche `unstable` contient toutes les modifications que vous voulez intégrer dans votre build
3. Récupérez le numéro de version actuel : `head debian/changelog`
4. Rendez-vous sur la branche `testing` ou `stable`
5. Mergez ou cherry-pickez les commits que vous voulez intégrer à la version depuis la branche `unstable`
6. Modifiez le `debian/changelog` en intégrant les messages de commits correspondant aux modifications que vous avez intégré (ou utilisez `git-dch` pour le faire automatiquement)
2015-05-01 17:47:54 +02:00
7. Taggez la branche actuelle (`testing` ou `stable`) du numéro de version juste supérieur à l'actuel
8. Pushez vos modifications **ainsi que vos tags** sur le repo GitHub
9. Retournez sur la branche `unstable`
10. Mergez le changelog mis à jour précédemment
11. Pushez la branche `unstable`
#### Avec helper
2015-02-04 12:15:45 +01:00
```bash
2015-05-01 17:47:54 +02:00
# You Only Clone Once
2015-02-04 15:09:01 +01:00
$ git clone git@github.com:YunoHost/yunohost-config-nginx.git
$ cd yunohost-config-nginx
# Be sure to be up-to-date, and don't forget to get the tags !
$ git fetch --tags
2015-04-30 12:59:26 +02:00
# Checkout your branch : stable or testing
$ git checkout testing
2015-02-04 15:09:01 +01:00
2015-05-01 17:47:54 +02:00
# Do your 'functional' modifications: either merge unstable in testing, or merge testing in stable
$ git pull origin unstable
# Or just
$ git merge unstable
2015-02-04 15:09:01 +01:00
# What is the current version number in test ?
$ dpkg-parsechangelog | grep "^Version" | cut -d ' ' -f 2
2015-05-01 17:47:54 +02:00
# Or just
$ head debian/changelog
2015-02-04 15:09:01 +01:00
2015-05-01 17:47:54 +02:00
# Update changelog and do a proper tag (explained below)
2015-02-04 14:50:45 +01:00
$ git yunobump x.y.z-p
2015-02-04 15:09:01 +01:00
2015-05-01 17:47:54 +02:00
# Push the branch state AND the tags to the remote repository
$ git push origin --tags testing:testing
2015-02-04 12:15:45 +01:00
2015-05-01 17:47:54 +02:00
# Merge changelog modifications to the `unstable` branch
$ git checkout unstable
$ git merge testing
$ git push origin unstable
```
2015-02-04 12:22:23 +01:00
2015-02-04 14:50:45 +01:00
**`TODO`** politique sur les format de tag, actuellement $branch/$version pour autoriser la même version dans deux branches différentes. est-ce vraiment souhaitable ?
2015-02-04 12:15:45 +01:00
2015-02-04 14:50:45 +01:00
**`TODO`** normalement à chaque push sur test ou stable, le dernier commit est un commit de changelog et il est taggué proprement. on doit pouvoir implémenter un hook git de pre-push qui empêche de pousser des trucs à moitié fait (une erreur dans git yunobump, un git tag -d, un commit à la main...)
2015-02-04 14:12:02 +01:00
2015-05-01 17:47:54 +02:00
#### Branche test et stable - faire un hotfix
2015-02-04 12:15:45 +01:00
Il peut arriver, de façon exceptionnelle, qu'on ait besoin de faire un hotfix (de sécurité par exemple) sur les paquets en `stable` ou en `test`, pour lequel le merge de la branche daily n'est pas acceptable (car trop de nouvelles fonctionnalités en développement sur daily).
** Cette situation doit rester exceptionnelle **
2015-02-04 14:50:45 +01:00
**`TODO`** à décrire
2015-02-04 12:22:23 +01:00
2015-02-04 14:50:45 +01:00
**`TODO`** dev un helper 'git yunohotfix ...' qui commit dans stable et cherry-pick tout de suite dans daily ? ou l'inverse ?
2014-10-11 13:38:36 +02:00
2014-10-09 13:08:07 +02:00
#### Paquets non YunoHost
2014-10-04 13:51:00 +02:00
2015-05-01 17:47:54 +02:00
Pour les paquets « non-YunoHost » (par exemple `python-bottle`) le paquet ne passe pas par le repo `unstable`, une fois les tests effectués sur ce paquet, ils devront être envoyés manuellement dans le repo `backport`.
---
## Numéros de version
YunoHost est en version **2** globalement, donc le numéro de la version doit, jusqu'à nouvel ordre, être sous la forme **2.x.x**.
La deuxième partie s'incrémente lors d'un changement fonctionnel important : Ajout d'une nouvelle fonctionnalité, modification d'une façon de fonctionner. Pour l'instant tous les paquets se trouvent en version **2.1.x**.
La troisième partie s'incrémente quasi-arbitrairement, lors d'un bugfix ou d'un changement fonctionnel mineur. On trouve actuellement des paquets en **2.1.3** ou **2.1.5** par exemple.
Enfin, une quatrième partie est réservée dans les cas exceptionnels de bugfixes en stable. Dans ce cas, on veut faire passer un changement unique directement dans la branche stable, on préfixe donc le numéro par **-x**, **x** étant le numéro du hotfix. Donnant par exemple **2.1.3-1**.
2014-10-04 13:51:00 +02:00
2014-10-09 13:10:16 +02:00
---
2014-10-04 13:51:00 +02:00
2015-05-01 17:47:54 +02:00
## Gestion des paquets
2014-10-04 13:51:00 +02:00
2014-10-09 13:08:07 +02:00
#### Daily build
Un cron défini pour l'utilisateur `pbuilder` se lance **tous les jours à 01:00**. Ce script va mettre à jour le repo git `packages` et ses submodules (`ssowat`, `moulinette`, `moulinette-yunohost` et `admin_js`).
Une fois les sources mises à jour, le script va rebuilder les paquets qui ont été mis à jour la veille.
Pour ce faire on va créer des paquets sources qui vont ensuite être mis dans le répertoire `/var/www/repo.yunohost.org/daily/incomming`.
2014-10-04 13:51:00 +02:00
2014-10-09 13:08:07 +02:00
Lancer ensuite l'ajout de ces fichiers source au repo, ce lancera automatiquement un job dans `rebuildd` (voir configuration du repo daily dans `/var/www/repo.yunohost.org/daily/conf/distribustion`).
2014-10-04 13:51:00 +02:00
2015-05-01 17:47:54 +02:00
Une fois les paquets buildés, ils sont ajoutés au repo `unstable`.
2014-10-04 13:51:00 +02:00
2014-10-09 13:08:07 +02:00
#### (Re)build d'un paquet YunoHost
2014-10-04 13:51:00 +02:00
2014-10-09 13:08:07 +02:00
Il est possible de relancer manuellement le build d'un paquet.
2014-10-04 13:51:00 +02:00
```bash
2015-02-04 14:50:45 +01:00
$ daily_build -p nom_du_paquet
2014-10-04 13:51:00 +02:00
```
2014-10-09 13:08:07 +02:00
#### Build d'un paquet non YunoHost
2014-10-04 13:51:00 +02:00
2014-10-11 13:27:33 +02:00
```bash
2015-02-17 14:39:47 +01:00
$ build_deb /path/du/paquet
2014-10-11 13:27:33 +02:00
```
2014-10-04 13:51:00 +02:00
2015-02-17 14:41:18 +01:00
**`TODO`** à décrire : besoin de bump la version pour un passage test->stable
2014-10-09 13:08:07 +02:00
### Passage de `daily` à `test`
2014-10-04 13:51:00 +02:00
```bash
2015-02-04 14:50:45 +01:00
$ push-packages-test -p nom_du_paquet
2014-10-04 13:51:00 +02:00
```
2014-10-09 13:08:07 +02:00
Il est possible d'utiliser l'option `-v` pour définir manuellement la version du paquet.
2014-10-04 13:51:00 +02:00
2014-10-09 13:08:07 +02:00
Le script va récuperer les sources du paquet dans `daily` puis ouvrir le changelog pour y définir la version et la liste des changements. Le build paquet sera ensuite ajouté à la liste des jobs de rebuildd qui le passera dans le repo `test`.
2014-10-04 13:51:00 +02:00
2014-10-09 13:08:07 +02:00
**Attention :** le nom de version ne doit pas contenir `daily` sinon le paquet sera ajouté au repo `daily`.
2014-10-04 13:51:00 +02:00
2014-10-09 13:11:22 +02:00
### Passage de `test` à `stable`
2014-10-04 13:51:00 +02:00
```bash
2015-02-04 14:50:45 +01:00
$ push-package-stable -p nom_du_paquet
2014-10-04 13:51:00 +02:00
```
2014-10-09 13:08:07 +02:00
Cette commande passe simplement le paquet du repo `test` à `stable`, sans rebuild.
2014-10-04 13:51:00 +02:00
2014-10-09 13:08:07 +02:00
### Gestion du repo avec `reprepro`
2014-10-04 13:51:00 +02:00
2014-10-09 13:08:07 +02:00
* Suppression d'un paquet
2014-10-04 15:16:16 +02:00
```bash
2015-02-04 14:50:45 +01:00
$ reprepro -V -b /var/www/repo.yunohost.org/nom_du_repo/ remove megusta nom_du_paquet
2014-10-04 13:51:00 +02:00
```
2014-10-09 13:08:07 +02:00
* Ajout d'un paquet debian dans un repo
2014-10-04 13:51:00 +02:00
```bash
2015-02-04 14:50:45 +01:00
$ reprepro -V -b /var/www/repo.yunohost.org/nom_du_repo/ includedeb megusta nom_du_paquet.deb
2014-10-04 13:51:00 +02:00
```
2015-01-06 11:12:49 +01:00
### Gestion des backports
Pour la gestion des paquets venant du dépôt backport il est possible de les intégrer rapidement dans le repo test de yunohost
Pour ce faire il faut ajouter le nom du paquet dans le fichier `/var/www/repo.yunohost.org/test/conf/list` puis lancer la commande
```bash
2015-02-04 14:50:45 +01:00
$ reprepro -V -b /var/www/repo.yunohost.org/test update megusta
2015-01-06 11:12:49 +01:00
```
Les paquets vont être télécharger et ajouté au repo `test`