- Contribuer au site d’offres d’emploi des CaenCamp.s
En participant, vous devez respecter le code de conduite du projet.
Beaucoup de choses, l’écriture de code n’étant pas l’unique manière de contribuer au projet !
Concernant le design, tout est à faire. Nous pouvons certainement partir sur un look à la bootstrap, mais si certains d’entre vous se sentent inspirés, ce sera un gros plus.
Pour l’instant, nous n’avons qu’un logo qui d’ailleurs ne demande qu’à évoluer.
Cela peut-être une occasion de collaboration entre développeurs/intégrateur/designer/ergonome/...
Les issues concernant le design sont associées au tag design
.
Lors de l’édition #7 des Coding CaenCamp, nous avons choisi en commun les technos sur lesquelles nous allons démarrer le projet. Et pour une question de simplicité, nous avons choisi le Javascript. La partie back/API devrait donc être réalisée en s’appuyant sur Koa et la partie front sur Svelte.
Il parait que chaque bug relevé sauve un chaton. En tout cas, la technique du ZBSD (Zero-Bug Software Development) semble porter ses fruits, comme le rapporte Andrew Fulton.
Donc, si à chaque bug rencontré quelqu’un ouvre une issue avec le label bug
, ce seront des familles entières de chats qui seront sauvées.
Dans ce cas, ouvrez une nouvelle issue de type feature
ou improvement
en décrivant bien votre idée.
Quelle que soit votre type d’implication, ce peut-être une bonne chose que d’installer le projet sur votre machine pour pouvoir visualiser votre contribution avant de la proposer sur Github.
Tout d’abord vous devez avoir un compte GitHub ainsi que git installé sur votre ordinateur. Ensuite vous devez "forker" le dépôt du projet et le cloner localement si vous ne faites pas partie de la team codingCaenCamp. Vous venez au CodingCaenCamp ? N’oubliez pas de demander un un mebre de vous ajouter à l’équipe, afin de pouvoir intervenir directement sur le repo, sans passer par la case fork.
Enfin, vous devez faire un choix :
- Soit vous décidez d’installer Node.js en version 12.14 (LTS) sur votre ordinateur. Node est un environnement d’exécution JavaScript .js (comme l’est un navigateur). C’est un bon choix, mais les recettes du fichier
Makefile
utilisent Docker ! Vous devrez donc lancer les différents serveurs « à la main » en utilisant les scripts des fichierspackage.json
. Le projet utilise workspaces Yarn. Vous devez donc également installer Yarn et l’utiliser comme gestionnaire de dépendances sur le projet à la place denpm
. Enfin, le projet utilise une base de données PostgreSQL : vous devrez donc l'installer si ce n'est pas déjà fait. - Soit vous préférez ne pas installer Node.js, et dans ce cas, vous devrez installer Docker. Docker va vous permettre d’exécuter Node.js au sein d’un container (une sorte de machine virtuelle), ainsi que de disposer d'e la base de données PostgreSQL sans avoir à l'installer. C’est aussi un bon choix. En plus de Docker, vous devrez aussi installer Docker Compose afin de lancer les diffentes applications en même temps.
Si vous ne savez pas que choisir, Docker présente l’avantage de bien isoler les dépendances du projet de votre OS ainsi que de rendre un peu plus facile le lancement des différentes applications en parallèle ou l’exécution des tests.
Vous avez donc décidez d’installer PostgreSQL, Node.js et Yarn. La première chose à faire est d’installer les dépendances du projet :
yarn
Ensuite, vous devez lancer le serveur de developpement de l’application web :
cd apps/front
yarn dev
Ainsi que le serveur d’API dans une seconde console :
cd apps/api
yarn dev
Si vous souhaitez lancer le storybook, il faudra également entrer dans une autre console :
cd apps/front
yarn storybook
Vous pouvez ainsi acceder à :
- l’API sur http://localhost:3001
- l’application web sur http://localhost:5000
- le storybook sur http://localhost:6006
Dans les premières phases de développement du projet, nous utiliserons un faux serveur d’API afin de mettre en place rapidement et facilement le modèle du projet. Ce serveur "mocked" d’api doit être lancer en plus des autres applications :
cd apps/api-mocked
yarn start
L’API simulée est alors disponible sur http://localhost:3000
Si vous avez choisi Docker, vous pouvez utiliser les recettes du fichier makefile
pour lancer les commandes du projet.
La première commande à lancer permettant d’installer les dépendances du projet est :
make install
Ensuite, voici les deux principales commandes à connaitre :
make start
Vous pouvez ainsi accéder à :
- l’application web sur http://localhost:8000
- l’api sur http://localhost:8001
- l’api mockée sur http://localhost:8002
- la documentation de l'API sur http://localhost:8003
- le storybook sur http://localhost:8010
Pour arrêter le projet, faites un :
make stop
Tips : Vous pouvez voir toutes les commandes disponibles en tappant juste make
.
Voici l’organisation des principaux répertoires du projet :
- .github : On trouve ici les fichiers d’aide sur le projet et les templates pour Github.
- apps/front : On trouve ici le code de l’application web.
- apps/api : On trouve ici le code de l’api.
- apps/admin : On trouve ici le code de l'administration réalisée avec React Admin. Ce code est dans un répertoire spécifique car l'administration se base sur une application CRA qui n'est pas compatible avec les workspaces de Yarn.
Le projet utilise donc PostgreSQL comme moteur de base de données, et aussi Knex pour faciliter la gestion des requêtes.
Knex permet entre autre de gérer les migrations de la base de données, et c'est donc la première chose que vous devrez faire après avoir initialiser le projet : jouer toutes les migrations existantes
make migrate-latest
Vous pourrez également peupler la base de données de quelques exemples d'offres d'emploi grâce à la recette :
make import-fixed-fixtures
Vous pouvez créer une migration lorsque le modèle évolue. Pour cela, utiliser la recette
make migrate-create title="nom-de-la-migration"
Vous pourrez une fois la migration écrite (les migrations sont créées dans le répertoire apps/api/migrations
) la jouer ou l'annuller avec la commande
make migrate-up
make migrate-down
Enfin, vous pouvez lister toutes les migrations déjà écrites, ainsi que leur état (jouées ou non) avec la commande :
make migrate-list
- Tout doit être nommé en
snake_case
. Knex est configuré pour faire la transformationcamelCase
<=>snake_case
aussi bien en entrée qu'en sortie de requêtes. 2 ) Le nom des tables doit être au singulier ! Par exemple,job_posting
plutôt quejob_postings
.
C'est un sujet toujours compliqué sur un projet ... Voici ce que nous avons mis en place pour le moment.
Nous utilisons les ADR.s (Architectural Decision Records) pour documenter les prises de décisions liées à l'architecture du projet.
Il existe par exemple un ADR sur la mise en place des ADR.s :)
Vous pouvez lister tous les ADR.s du projet grâce à la recette de makefile :
make adr-list
Et pour ajouter un nouvel ADR, il suffit d'utiliser la recette :
make adr-new title="Le titre de votre ADR"
La modélisation et la documentation de l'API se fait via un contrat d'API en OpenAPI.
Vous trouverez le contrat dans apps/api/openapi/openapi.yaml
.
La documentation est servie par koa-oas3 (en plus de la validation des entrées et sorties de l'API, validation s'appuyant sur le schema OpanAPI) à l'adresse http://localhost:3001/documentation
Si vous ne connaissez pas bien OpenAPI, vous pouvez jeter un coup d'oeil à la vidéo de l'édition #48 des CaenCamp qui en parle : OpenAPI: un contrat pour vos API.s.
Le contrat est dans un unique fichier, on ne peut donc que conseiller l'utilisation d'un outil tel que StopLight Studio pour facilliter l'édition de ce fichier.
Et enfin, si vous effectuer des modifications au contrat, il faut penser à valider le contrat mis à jour grace à la recette
make openapi-validate
L'application développée SvelteJS est découpée en composant.
Un composant accepte des propriétés qui sont parfois des strings, des booléens ou un objet JSON. Afin de pouvoir facilement s'y retrouver dans les composants que nous auront, il convient de les documenter sur un Storybook. Un nouveau contributeur pourra facilement s'y retrouver s'il souhaite utiliser nos boutons, liens, cartes ou tout autre composant susceptible d'être réutilisé pour accélérer nos développements.
De plus, de cette manière, nous pourrons même développer directement nos composants depuis cette interface afin de s'assurer que le composant puisse facilement être réutilisable. Dans le Storybook, le composant est totalement isolé du reste de l'application.
Si vous n’avez encore jamais fait de Pull Request (PR), la lecture du tutorial Github Understanding the GitHub Flow est sûrement un bon point de départ.
Si vous n’aviez pas encore de compte Github, en voici une bonne introduction.
Pour le projet, nous utilisons le workflow suivant :
- Le projet principal ne possède qu’une branche
master
. - Chaque participant réalise un fork du dépôt principal puis ouvre une branche depuis son fork pour chaque nouvelle feature.
- Une PR est créée depuis la branche du fork vers la branche
master
du dépôt principal.
Si vous vous sentez un peu perdu.e, la lecture de Using the Fork-and-Branch Git Workflow devrait vous rendre plus serein.ne.
Le code suit le style de code basé sur ESLint et Prettier. Nous vous conseillons d’utiliser l’integration du linter avec votre ide, d’autant plus qu’un pre-commit Hook git validera le formatage de votre code avant de pouvoir ajouter vos modifications à l’index git.
Vous pouvez exécuter vous-même les vérifications du style de code avec les commandes suivantes :
make lint
pour afficher les erreursmake format
pour corriger les erreurs
Nous utilisons la convention de commit dîte conventionnelle provenant de conventional commits initiée par Angular.
Ils doivent être écrits en français et respecter la convention.
Tout comme la convention de codage, le formatage de commit est validé par un hook git.
Afin de facililiter l’intégration (le merge) de vos PR, surtout si elles contiennent du code, celles-ci devront contenir les tests couvrant vos propositions.
Il y a deux grands types de tests sur le projet:
Les tests sont lancés sur la plateforme d’intégration continue de Github via les Github actions.
Par convention, les tests unitaires se trouvent à côté du fichier testé, en utilisant l’extension .spec.js
. Par exemple tools.spec.js
pour les tests des fonctions écrites dans le fichier tools.js
.
Les tests sont lancés avec Jest et profitent du workspace yarn, c’est à dire que les tests des l’api et du front peuvent être lancés depuis la racine du site, tout en ayant leur configuration propre (voir la documentation).
Les tests du front utilisent la librairie Testing Libray pour les tests des composants Svelte. C’est la même librairie qui est utilisée pour les tests e2e du front réalisés avec Cypress.io.
Les tests unitaires peuvent être lancés au sein de Docker. Pour cela, il y a deux commandes à connaitre :
make test-unit
pour lancer la suite de tests,make test-unit-watch
pour lancer les tests en mode watch.
La suite de tests peut également être lancée sans Docker :
- soit depuis la racine du projet pour lancer tous les tests (
yarn test
etyarn test:watch
), - soit depuis le répertoire d’un projet pour ne lancer que les tests du projet (par exemple
cd apps/api && yarn test:watch
).
Contrairement aux tests unitaires, les tests e2e sont regroupés dans le répertoire tests-e2e
. Ils sont lancés sur une build de production du code. Ce build s’execute dans un container Docker, avec la commande make test-env-start
.
Il existe des tests e2e pour l’api (dans le répertoire /tests-e2e/api
) utilisant les framework de test Frisby.js. Ces tests peuvent être lancés, une fois l’environnement de test démarré, avec les commandes :
make test-env-run
,make test-env-watch
pour avoir le mode watch.
Les tests e2e du front sont eux basé sur Cypress.io. Pour démarrer Cypress, il faut donc avoir au préalable lancé l’environnement de test, puis utilisez la commande make cypress
.
Si vous voulez utiliser Cypress, il faut que vous l’installiez sur votre environnement en utilisant la commande
make install-cypress
!
Lorsque vous avez terminer les tests e2e, pensez à stopper l’environnement de test avec la commande make test-env-stop
.
Remarque: l’intégralité des tests (unitaires et e2e) peuvent être lancés en une seule commande :
make test
.
La bonne pratique, c’est de faire des PR, et puis c’est tout.
Mais voici quelques conseils qui peuvent les rendre encore meilleures :
- Faites des commits courts et bien commentés.
- Faites des PR courtes, toute une tache (une issue) n’a pas forcement besoin d’être adressée dans une seule PR.
- Faites référence à l’issue que la PR adresse.
- N’hésitez pas à joindre des captures d’écran, fixes ou animées.
- Ajouter une description et une todo list en ouvrant la PR.
- N’attendez pas que la PR soit terminée pour l’ouvrir : la communauté viendra plus facilement en aide en découvrant tôt la PR.
- Utilisez les labels
WIP
(Work In Progress) etRFR
(Ready For Review) pour indiquer l’avancement de la PR. - dernier point : tous les textes (titre, description, commentaires, etc.) sont fait en français. En effet, même si la norme en opensource c’est l’anglais, nous avons collectivement décidé d’utiliser le français pour le projet.
Le système d’issues du Github est très bien pensé et permet de facilement réagir, commenter, noter... Donc si une issue vous intéresse mais qu’elle ne vous semble pas claire, c’est directement dans l’issue que vous pouvez poser des questions.
Si vous avez commencé une PR, mais que vous êtes bloqué, vous pouvez écrire un commentaire dessus décrivant votre problème et ajouter le label help wanted
.
Il existe un channel coding-caen-camps sur le slack Web@Caen. N’hésitez pas à demander une invitation puis à y poser vos questions. L’une des tâches de cette refonte concerne d’ailleur la mise en place d’un sytème d’invitation simplifié pour rejoindre le Slack des CaenCamp.s .
Le wiki d’un projet est souvent difficile à maintenir. C’est portant une manière simple et efficace de noter des « astuces » et autres commentaires documentant la vie du projet. Vous pouvez aller y jeter un coup d’œil, quelquefois qu’une bonne âme se serait donné la peine d’y noter quelque chose.
Nous nous réunissons une fois par mois pour passer quelques heures ensemble. Pour être tenu au courant des prochaines sessions, le plus simple est de s’inscrire sur la newsletter des CaenCamp et de nous suivre sur Tweeter
Ce projet est un projet uniquement lié aux bonnes volontés. Tous nous travaillons et il n’est donc pas question de mettre en place un Roadmap.
Mais, ce serait chouette de voir une première version en ligne pour 2020 ;)