2016-11-30 07:03:20 +01:00
## Contribuer au cœur de YunoHost
2016-11-27 04:57:00 +01:00
2016-11-30 07:03:20 +01:00
Vous souhaitez ajouter une nouvelle fonctionnalité au cœur de YunoHost, mais ne
2016-11-27 04:57:00 +01:00
savez pas comment procéder ? Ce guide parcours les étapes du développement et du
processus de contribution.
Si vous chercher quelque chose à implémenter ou un bug à réparer, le
2018-06-05 16:02:47 +02:00
bug tracker est [ici ](https://github.com/yunohost/issues/issues ) !
2016-11-27 04:57:00 +01:00
2019-10-14 17:44:26 +02:00
**Venez dire coucou sur le [salon de dev ](/chat_rooms )** !
2016-11-27 04:57:00 +01:00
### Mettre en place un environnement de développement
- **Utilisez [ynh-dev ](https://github.com/YunoHost/ynh-dev )** (voir le README)
pour mettre en place un environnement de développement - en local sur une
2018-03-06 20:28:31 +01:00
machine virtuelle, ou bien sur un VPS.
2016-11-30 07:03:20 +01:00
Ceci installera une instance fonctionelle de YunoHost, en utilisant
directement les dépôts git à l'aide de liens symboliques. De cette façon, il
2016-11-27 04:57:00 +01:00
vous sera possible de modifier les fichiers, de tester les changements en
temps réel, et de commiter et push/pull directement depuis cet environnement.
- **Implémentez et testez votre fonctionnalité**. Suivant ce sur quoi vous
voulez travailler :
2019-10-14 17:44:26 +02:00
- **Cœur Python/ligne de comande** : allez dans `/ynh-dev/yunohost/`
- **Interface d'administration web** : allez dans `/ynh-dev/yunohost-admin/`
2016-11-27 04:57:00 +01:00
- Vous pouvez aussi travailler sur les autres projets liés sur lesquels
2016-11-30 07:03:20 +01:00
s'appuie YunoHost (SSOwat, moulinette) de façon similaire.
2016-11-27 04:57:00 +01:00
2019-10-22 16:39:44 +02:00
### Vue d'ensemble des 4 morceaux principaux de YunoHost
##### Moulinette
C'est un petit framework "fait maison". [Son rôle principal ](https://moulinette.readthedocs.io/en/latest/actionsmap.html )
est de permettre de construire une API Web et une API en ligne de commande à partir d'un même code Python et d'un schéma YAML que nous appelons
[l'actionmap] (https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/actionsmap/yunohost.yml).
Il prend en charge d'autres mécanismes tels que l'authentification, l'internationalisation
et des petites fonctions utilitaires techniques (par ex. lecture/écriture de fichiers json).
Moulinette dispose de sa propre documentation [ici ](https://moulinette.readthedocs.io/en/latest/ ).
##### Yunohost
C'est le coeur même de YunoHost. Il contient :
- [le code python ](https://github.com/YunoHost/yunohost/tree/stretch-unstable/src/yunohost ) qui gère les utilisateurs, domaines, applications, services et autres
- des [helpers bash ](https://github.com/YunoHost/yunohost/tree/stretch-unstable/data/helpers.d ) principalement utilisés par les packageurs d'applications dans les scripts de ces applications
- des [hooks ](https://github.com/YunoHost/yunohost/tree/stretch-unstable/data/hooks ) et [templates ](https://github.com/YunoHost/yunohost/tree/stretch-unstable/data/templates ) qui sont utilisés pour configurer les différents éléments de l'écosystème tels que nginx, postfix, ....
- des [chaînes internationalisées ](https://github.com/YunoHost/yunohost/tree/stretch-unstable/locales )
- des [tests ](https://github.com/YunoHost/yunohost/tree/stretch-unstable/src/yunohost/tests )
##### SSOwat
C'est le système de connexion unique (single sign-on) de YunoHost. Il contient principalement:
- [du code LUA ](https://github.com/YunoHost/ssowat ) interfacé directement avec nginx et qui gère tous les aspects "techniques" de l'authentification et de la gestion des accès aux ressources.
- le [portail web utilisateur ](https://github.com/YunoHost/SSOwat/tree/stretch-unstable/portal ) qui est l'interface finale visible pour les utilisateurs de YunoHost
SSOwat est configuré via `/etc/ssowat/conf.json` qui est généré par YunoHost.
##### Yunohost-admin
C'est une dépendance *optionnelle* de YunoHost et correspond à une interface pour l'API web créée par YunoHost et Moulinette (service `yunohost-api` ).
Il contient essentiellement :
- [des templates pour les vues ](https://github.com/YunoHost/yunohost-admin/tree/stretch-unstable/src/views )
- les [contrôleurs javascript ](https://github.com/YunoHost/yunohost-admin/tree/stretch-unstable/src/js/yunohost/controllers ) correspondants, qui interagissent avec l'API Yunohost
- et es [chaînes internationalisées ](https://github.com/YunoHost/yunohost-admin/tree/stretch-unstable/src/locales )
2016-11-30 07:03:20 +01:00
### Travailler sur le cœur Python / ligne de commande
2016-11-27 04:57:00 +01:00
2019-10-14 17:44:26 +02:00
- Allez dans `/ynh-dev/yunohost/` .
2016-11-27 04:57:00 +01:00
2019-10-14 17:44:26 +02:00
- Exécutez `cd /ynh-dev && ./ynh-dev use-git yunohost` .
2016-11-27 04:57:00 +01:00
2016-11-30 07:03:20 +01:00
- Le fichier actionsmap (`data/actionsmap/yunohost.yml`) définit les différentes
catégories, actions et arguments de la ligne de commande YunoHost. Choisissez
comment vous voulez que les utilisateurs utilisent votre fonctionnalité, et
2016-11-27 04:57:00 +01:00
ajoutez/éditez les catégories, actions et arguments correspondants. Par
exemple, dans `yunohost domain add some.domain.tld` , la catégorie est
`domain` , l'action est `add` et `some.domain.tld` est un argument.
- Moulinette va automatiquement faire le lien entre les commandes de
l'actionsmap et les fonctions python (ainsi que leurs arguments) dans
`src/yunohost/` . Par exemple, `yunohost domain add some.domain.tld`
déclenchera un appel de `domain_add(domainName)` dans `domain.py` , avec l'argument
`domainName` qui vaudra `"some.domain.tld"` .
##### Helpers / style de code
2019-10-14 17:44:26 +02:00
- Pour gérer les exceptions, il existe un type `YunohostError()`
2016-11-27 04:57:00 +01:00
- Pour aider avec l'internationalisation des messages, utilisez `m18n.n('some-message-id')`
et mettez le message correspondant dans `locales/en.json` . Vous pouvez aussi
utiliser des arguments pour construire les messages, avec `{{some-argument:s}}` .
Ne modifiez pas de fichiers de locales autres que en.json, la traduction sera
faite avec [weblate ](https://translate.yunohost.org/ ) !
2016-11-30 07:03:20 +01:00
- YunoHost essaye de suivre le style de code [pep8 ](http://pep8.org/ ). Des
2016-11-27 04:57:00 +01:00
outils existent pour vérifier automatiquement la conformité du code.
- Mettre un `_` devant les noms des fonctions "privées".
### Travailler sur l'interface d'administration web
2019-10-14 17:44:26 +02:00
- Allez dans `/ynh-dev/yunohost-admin/src/` .
2016-11-27 04:57:00 +01:00
2019-10-14 17:44:26 +02:00
- Exécutez `cd /ynh-dev && ./ynh-dev use-git yunohost-admin` . Ceci lance gulp, de sorte
2016-11-30 07:03:20 +01:00
qu'à chaque fois que vous modifiez les sources, il recompilera le code
2016-11-27 04:57:00 +01:00
(js) et vous pourrez voir les changements dans le navigateur web (Ctrl+F5).
Pour stopper la commande, faites simplement Ctrl+C.
2016-11-30 07:03:20 +01:00
- L'interface web utilise une API pour communiquer avec YunoHost. Les
commandes/requêtes de l'API sont également définies dans l'actionsmap. Par
2016-11-27 04:57:00 +01:00
exemple, accéder à la page ```https://domain.tld/yunohost/api/users```
2016-11-30 07:03:20 +01:00
correspond à une requete `GET /users` vers l'API YunoHost. Cette requête
2016-11-27 04:57:00 +01:00
est mappée sur `user_list()` . Accéder à cette URL devrait afficher le json
2016-12-07 16:19:34 +01:00
retourné par cette fonction. Les requêtes 'GET' sont typiquement destinées à
demander de l'information au serveur, tandis que les requêtes 'POST' sont
2016-11-27 04:57:00 +01:00
destinées à demander au serveur de modifier/changer des informations ou de
réaliser des actions.
2016-11-30 07:03:20 +01:00
- `js/yunohost/controllers` contiens les parties javascript, et définit quelles
2016-11-27 04:57:00 +01:00
requêtes faire à l'API pendant le chargement d'une page donnée de l'interface,
2018-04-12 00:09:24 +02:00
et comment traiter les données récupérées pour générer la page, en utilisant
2016-11-27 04:57:00 +01:00
des templates.
2016-11-30 07:03:20 +01:00
- `views` contient les templates des pages de l'interface. Dans le template,
2016-11-27 04:57:00 +01:00
les données venant du javascript peuvent êtres utilisées avec la syntaxe
`{{some-variable}}` , qui sera remplacée pendant la construction de la page.
Il est également possible d'avoir des conditions avec la syntaxe
d'[handlebars.js](http://handlebarsjs.com) : ```{{#if
some-variable}}< p > du HTML conditionnel ici !< / p > {{/if}}```
- Pour l'internationalisation des messages, utilisez `y18n.t('some-string-code')`
dans le javascript, ou `{{t 'some-string-code'}}` dans le template HTML, et
mettez votre message dans `locales/en.json` . Ne modifiez pas de fichiers de
locales autres que en.json, la traduction sera faite avec
[weblate ](https://translate.yunohost.org/ ) !
##### N'oubliez pas
- À chaque modification de l'actionsmap, il faut redémarrer l'API yunohost :
```service yunohost-api restart```
(Il faudra retaper le mot de passe administrateur dans l'interface web)
2016-11-30 07:03:20 +01:00
- Il faudra peut-être régulièrement forcer le rafraîchissement du cache
2016-11-27 04:57:00 +01:00
navigateur pour propager correctement le javascript et/ou HTML (à chaque fois
que l'on change quelque chose dans `js` ou `views` , donc).
2016-11-30 07:03:20 +01:00
### Votre fonctionnalité est prête et vous souhaitez qu'elle soit intégrée dans YunoHost
2016-11-27 04:57:00 +01:00
2016-11-30 07:03:20 +01:00
- Forkez le dépòt correspondant sur Github, et commitez vos changements dans
2016-11-27 04:57:00 +01:00
une nouvelle branche, Il est recommandé de nommer la branche avec la
convention :
2019-10-14 17:44:26 +02:00
- Pour une nouvelle fonctionnalité ou amélioration : `enh-ISSUENUMBER-description-fonctionnalité`
2016-11-27 04:57:00 +01:00
- Pour une correction de bug : `fix-REDMINETICKET-description-correctif`
2019-10-14 17:44:26 +02:00
- `ISSUENUMBER` est optionnel et correspond au numéro du ticket sur le bug tracker
2016-11-27 04:57:00 +01:00
- Une fois prêt, ouvrez une Pull Request (PR) sur Github. De préférence, inclure
`[fix]` ou `[enh]` au début du titre de la PR.
- Après relecture, test et validation par les autres contributeurs, votre
2019-10-14 17:44:26 +02:00
branche sera mergée dans `unstable` !
2016-11-27 04:57:00 +01:00