commit 61c3a806af2f8b73e57e86b9d76a3970b9ac13a8 Author: arthur.dambrine Date: Fri Feb 10 10:19:06 2023 +0100 backup formation 2020 diff --git a/01_poste_de_travail/01_ligne_de_commande.md b/01_poste_de_travail/01_ligne_de_commande.md new file mode 100644 index 0000000..1be304e --- /dev/null +++ b/01_poste_de_travail/01_ligne_de_commande.md @@ -0,0 +1,184 @@ +# Ligne de commande + +Je ne connais pas WSL. Mais voici ce que j'attends d'une ligne de commande correctement configurée. + +- Prompt avec nom de branches + modifications en cours + + Libre à chacun de choisir s'il souhaite quelque chose de léger ou non. + +- Autocomplétion Git + +- Quelques alias Git (lol, st, co...) + + Ceux-là, ceux de "Oh my zsh", peu importe. + + ``` + [alias] + st = status + co = checkout + lol = log --oneline --decorate --graph + lola = log --oneline --decorate --graph --all + amend = commit --amend --no-edit + last = log -1 HEAD + inprogress = branch --no-merged dev + changelog = log --format=%s --no-merges --reverse + ``` + +- Alias gti=git ^^ + +- z/autojump/... + + N'importe quelle commande qui vous permet de sauter dans un projet sans chercher son chemin. + + [autojump](https://github.com/wting/autojump) + +- jenv/fnm|nvm + + C'est à dire un moyen d'avoir un environnement "souple" et non pas s'appuyer sur l'unique version globale. + +- Un minimum de configuration/connaissance Vim [On en reparle.] + +- Connaître des raccourcis clavier + +## Raccourcis clavier Unix + +| Commande | Effet | +| ---------- | -------------------------------------------------------------- | +| `Ctrl + r` | Recherche dans les commandes précédentes | +| `Ctrl + a` | Début de ligne | +| `Ctrl + e` | Fin de ligne | +| `Ctrl + k` | Supprime jusqu'à la fin de la ligne | +| `Ctrl + w` | Supprime le "mot" avant le curseur | +| `Ctrl + y` | Colle le texte supprimé avec les 2 commandes précédentes | +| `Ctrl + d` | Quitte le shell en cours (utile pour sortir d'une session ssh) | + +## Modifier un fichier + +`vim`, `nano` ou même `ed` pour intervenir sur les serveurs sans UI. + +L'intérêt de Vim, c'est que les connaissances sont transférables dans less et dans git. + +### Configuration + +Dans le fichier `~/.vimrc` + +``` +set number " Show current line number +set relativenumber " Show relative line numbers +``` + +Ce qui donne quelque chose comme ça : + +``` + 4 # Formation pour l'AMSOM + 3 + 2 Dates : 5, 6, 7, 8 Janvier 2020 + 1 +5 ## Thèmes + 1 + 2 - Environnement et outils du développeur Web + 3 - Git & Gitlab +``` + +### Navigation + +| Commande | Effet | +| -------------------- | -------------------------------------- | +| `gg` | Aller au début du fichier | +| `Shift + g` | Aller à la fin du fichier | +| `:` | Se rendre à un numéro de ligne | +| `:` | Se rendre à un numéro de ligne relatif | +| `/` | Recherche du pattern | +| `n` | Prochaine occurence du pattern | +| `:q` | Quitter | + +### Edition + +Attention aux modes ! + +Avant de taper du texte, pensez à passer en mode "insertion" via `i` et avant d'utiliser les commandes pensez à en sortir via `esc` + +| Commande | Effet | +| --------------------- | ----------------------------------------------------------------------------------------------- | +| `:wq` | Sauvegarder et quitter | +| `:m` | Déplace la ligne courante sous la ligne citée | +| `dd` | Supprime la ligne en cours (et copie) | +| `d10` | Supprime 10 lignes | +| `u` | Undo | +| `ciw` | Supprime le mot (w) en cours et passe en mode insertion (peut-être dérivé en `ci(` par exemple) | +| `:%s/Git/Kit` | Remplace toutes les occurences de Git par Kit | + +Le copier-coller dans Vim est un art que je ne maîtrise pas, ci-dessous les deux commandes de bases. + +| Commande | Effet | +| -------- | ----------------------- | +| `yy` | Copie la ligne en cours | +| `p` | Colle la copie | + +[Pour en savoir plus](https://vim.fandom.com/wiki/Copy,_cut_and_paste) + +## Les outils Unix + +### Lire un fichier + +``` +less +``` + +Contrairement à `cat` permet la navigation dans le fichier. Les commandes sont les mêmes que pour `vim`. + +### Chercher dans un fichier + +``` +grep MyException logs/error.log +``` + +### Afficher les dernières lignes d'un fichier + +``` +tail logs/error.log +``` + +En mode "watch" avec une vue élargie + +``` +tail -f -n 20 logs/access.log +``` + +### Extraire des données + +`sed` est une commande qui n'est pas évidente, mais il faut l'avoir en tête et ne pas hésitez à "googler" son usage au besoin. + +### Combinaisons via `|` + +Avec le fichier `fake.log` suivant + +``` +ezorihzeoh numcompte : 12345 +oeihroeih reoirhoeirh oiehro ziehrozeflksnlsdb +eoirhedcdaz numcompte : 38787 +oeihoe oeirh oeihr oeir oihe +zepzplcns numcompte : 12345 +eeropijpzejk zeorj zepo rzef ozerh z +eoiheola numcompte : 38787 +sqldkfhzohsdohzeorih +eorihonenc numcompte : 98765 +``` + +``` +grep numcompte fake.log | sed -E 's/.*numcompte : ([0-9]+).*/\1/' | sort | uniq +``` + +Donne + +``` +12345 +38787 +98765 +``` + +## Pour aller plus loin + +- tmux + +Personnellement, je n'en suis pas encore là, mais c'est très souvent cité comme "must-have". diff --git a/01_poste_de_travail/02_editeur.md b/01_poste_de_travail/02_editeur.md new file mode 100644 index 0000000..aa5589b --- /dev/null +++ b/01_poste_de_travail/02_editeur.md @@ -0,0 +1,41 @@ +# Editeur de code + +Nous nous ne parlerons que de VS Code, mais il n'y a pas de contre-indications à utiliser autre chose (Sublime Text, Atom, Emacs, Vim, ...). + +Je vous laisse adapter les conseils à votre éditeur favori. + +## Accès via le terminal + +J'ouvre mes projets uniquement via le terminal. (La combinaison de ça avec `z` est un grand gain de temps.) + +``` +code . +``` + +## Plugins + +- GitLens + + Pour Git, je suis plutôt partisan du "tout ligne de commande", mais j'ai entendu du bien de ce plugin. + + Personnellement, quand je suis sur Emacs j'ai Magit, alors j'utilise "edamagit" dans VS Code. Un des avantages (très Emacsien), c'est de rester dans son éditeur de code et de ne pas naviguer entre 36 outils. + +- Gitlab Workflow + + Je l'utilise uniquement pour l'option "Créer une nouvelle Merge Request sur la branche en cours". Encore une fois, dans l'objectif de rester concentrer. + +- Live Share + + Nécessaire en ces temps de confinement. + +- PHP DocBlocker/PHP Intelephense/PHP Sniffer & Beautifier + + Le dernier remplace correctement Prettier pour le PHP. + +- Prettier + + Pour CSS et JS. + +- UUID Generator + + Pour créer un UUID dans un test par exemple. diff --git a/02_git/01_index.md b/02_git/01_index.md new file mode 100644 index 0000000..a31f655 --- /dev/null +++ b/02_git/01_index.md @@ -0,0 +1,70 @@ +# Git + +## Savez-vous (vraiment) utiliser Git ? + +[Slides](../resources/git-slides.key) + +[Exercice](./02_exercice.md) + +## Petites astuces de configuration + +- De meilleurs [diffs](https://github.com/so-fancy/diff-so-fancy) + +- `git config --global push.default simple` + Plus utile, puisque par défaut pour git 2.0. + +## Formalisme des messages de commit + +``` +Première ligne courte, c'est le "titre". +// Une ligne vide +Le corps du message pour donner des détails expliqués le POURQUOI du commit. +``` + +Si vous souhaitez un formalisme officiel, le plus connu est celui issu du projet [Angular](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#-commit-message-format). + +## Conflits et fusion + +Pas de grandes leçons sur les stratégies pour résoudre des conflits, ... + +Mais une des règles de base est d'avoir un historique assez linéaire et de résoudre les conflits sur votre branche locale et pas dans Gitlab sur la Merge Request. + +- `git pull --rebase` + +- `git rebase dev` + +## Branches + +- Branche dev ? + +- "Short-living branches" + +- Pourquoi faire une MR ? Qu'attendre d'une MR ? (Exercice) + +## Qui a fait la boulette ? + +``` +git blame +``` + +## Git, un système distribué + +- Pourquoi `origin` ? + +- C'est quoi un remote exactement ? + +## Branche master vs main + +Depuis quelques temps, la branche par défaut sur Github est `main`. + +[Explications](https://github.com/github/renaming) + +## Références + +Tuto interactif - [lien](https://learngitbranching.js.org/) + +Devoxx FR 2014 - Git++ : Passez au niveau supérieur de la gestion de version - [vidéo](https://www.youtube.com/watch?v=m0_C2cfM9IM) + +Git Better - [vidéo](https://www.youtube.com/watch?v=jtEthlTz1Q0) + +Savez-vous (vraiment) utiliser Git ? - [lien](https://github.com/Charlynux/presentations/tree/master/201902_DoYouActuallyKnowGit) diff --git a/02_git/02_exercice.md b/02_git/02_exercice.md new file mode 100644 index 0000000..af7f96f --- /dev/null +++ b/02_git/02_exercice.md @@ -0,0 +1,77 @@ +# Exercice + +## Repository + +Créer un repository distant pour plusieurs avec un fichier README.md à la racine. + +Chaque membre clone ce repository. + +## Commandes locales + +L'objectif est de jouer avec les commandes suivantes. + +``` +git status + +git show +``` + +Faites des modifications sur le fichier README.md + +``` +git diff + +git add -p + +git diff --staged + +git reset -- +``` + +Effectuez quelques commits + +``` +git reset --soft HEAD~1 + +git commit --amend + +git rebase -i ~1 +``` + +``` +git reset --hard +``` + +Observez le résultat de cette commande. + +``` +git reflog ou git log -g +``` + +Quelques commandes supplémentaires + +``` +git cherry-pick + +git revert + +git branch + +git checkout -b + +git stash + +git stash pop +``` + +Faites des modifications sur une autre branche et sur votre master. Et réalignez l'historique avec la commande suivante. + +``` +git rebase master +``` + +Pour trouver le commit à l'origine d'un bug. + +``` +git bisect +``` diff --git a/03_bonnes_pratiques/01_les_outils.md b/03_bonnes_pratiques/01_les_outils.md new file mode 100644 index 0000000..1c9c30e --- /dev/null +++ b/03_bonnes_pratiques/01_les_outils.md @@ -0,0 +1,21 @@ +# Bonnes pratiques - Les outils + +## Composer/NPM/Maven, même combat + +[Rapide normalement] + +- Intégration de scripts "utilitaires" dans le JSON (pour Composer et NPM) + +## Linter vs Prettier + +## PHP Stan + +On ne l'utilise pas (encore), mais ça peut-être un bon complément. + +[Doc](https://github.com/phpstan/phpstan) + +## Tests automatisés + +[PHPUnit](https://phpunit.de/) + +[Behat](https://docs.behat.org/en/latest/) diff --git a/03_bonnes_pratiques/02_code.md b/03_bonnes_pratiques/02_code.md new file mode 100644 index 0000000..4ff7ea1 --- /dev/null +++ b/03_bonnes_pratiques/02_code.md @@ -0,0 +1,32 @@ +# Bonnes pratiques - Le code + +## Tests automatisés + +### Pourquoi ? Comment ? Quand ? + +[Slides](../resources/tests-slides.key) + +Pour plus de références : [Lien](https://github.com/Charlynux/tester-douter) + +### Exercice + +Kata, à choisir parmi : + +- Roman Numerals Kata +- Fizz Buzz Kata +- Gilded Rose Kata + +[Détails](https://kata-log.rocks) + +## Bonnes pratiques et Pattern de développement + +C'est assez large, mais il y a des choses à dire autour de : + +- OO +- Les boucles FOR, c'est pour les faibles - [Lien](https://github.com/Charlynux/boucles-for-faibles) +- DRY or not +- Tiny controllers, Big models +- Lien avec les tests +- SQL > PHP + +[Slides](./resources/best-pratices-slides.pdf) diff --git a/04_gitlab_ci/01_index.md b/04_gitlab_ci/01_index.md new file mode 100644 index 0000000..d1cfb77 --- /dev/null +++ b/04_gitlab_ci/01_index.md @@ -0,0 +1,78 @@ +# Gitlab CI + +## Tests & co + +Maintenant qu'on a des process de vérification, on peut les faire tourner "tout le temps". + +[Slides](./resources/ci-slides.pdf) + +Exemple de GitlabCI + +``` +image: edbizarro/gitlab-ci-pipeline-php:7.4-alpine + +services: + - mysql:5.7 + +before_script: + - composer install -n --prefer-dist + +variables: + # For MySQL service + MYSQL_DATABASE: "gitlab_test" + MYSQL_ROOT_PASSWORD: "test" + # For CakePHP App + DATABASE_HOST: "mysql" + DATABASE_DB: "gitlab_test" + DATABASE_TEST_DB: "gitlab_test" + DATABASE_USER: "root" + DATABASE_PASSWORD: "test" + MAIL_FROM: "gitlabci@cef.fr" + +cache: + paths: + - ./vendor/ + +job:runtests: + stage: test + script: + - composer run test -- --log-junit junit.xml + artifacts: + reports: + junit: junit.xml + +job:codesniffer: + stage: test + script: + - composer run cs-check -- --report=junit --report-file=codesniffer.xml + artifacts: + reports: + junit: codesniffer.xml +``` + +## Déploiement + +[Joel Test](https://www.joelonsoftware.com/2000/08/09/the-joel-test-12-steps-to-better-code/) - Question #2 + +Exemple de GitlabCI vers Dokku + +``` +job:deploy: + stage: deploy + image: ilyasemenov/gitlab-ci-git-push + services: [] + before_script: [] + environment: + name: staging + url: https://$DOKKU_APP_NAME.tests.iteracode.com + script: + - git-push dokku@tests.iteracode.com:$DOKKU_APP_NAME + only: + - dev +``` + +### Build Docker image on Gitlab CI + +[Doc officielle](https://docs.gitlab.com/ee/ci/docker/using_docker_build.html) + +[Build + Deploy](https://gist.github.com/t3easy/3ef49a8848338a9cd457f95034a6a16e) diff --git a/05_divers/01_gitlab_tooling.md b/05_divers/01_gitlab_tooling.md new file mode 100644 index 0000000..a79cbf2 --- /dev/null +++ b/05_divers/01_gitlab_tooling.md @@ -0,0 +1,9 @@ +# Gitlab Tooling + +- Wiki + +- Gitlab Pages [Doc officielle](https://docs.gitlab.com/ee/user/project/pages/) + +- Issues + - Time spent + - Lien avec les commits diff --git a/05_divers/02_ssh.md b/05_divers/02_ssh.md new file mode 100644 index 0000000..555a454 --- /dev/null +++ b/05_divers/02_ssh.md @@ -0,0 +1,22 @@ +## SSH + +- Clés SSH publiques + Disponibles sur Gitlab (ex. https://gitlab.com/Charlynux.keys) + +- ~/.ssh/config + +``` +Host * + AddKeysToAgent yes + UseKeychain yes + IdentityFile ~/.ssh/id_ecdsa + +Host some-name + HostName 111.111.111.111 + User root + +Host another-name + HostName 222.222.222.222 + User ubuntu + IdentityFile ~/.ssh/id_rsa +``` diff --git a/05_divers/03_test_api.md b/05_divers/03_test_api.md new file mode 100644 index 0000000..b54173c --- /dev/null +++ b/05_divers/03_test_api.md @@ -0,0 +1,65 @@ +# Tester des API + +## Postman + +- Collections +- Variables +- Tests + +## jq + +[dispo sur Windows](https://stedolan.github.io/jq/download/) + +"sed for JSON data" + +### Extraction de dates + +```cmd +cat ~/Documents/maquigny.json| jq '.meetings|map(.estimated_date)|sort|.[]' | uniq +``` + +### Calculs de crédit/débit depuis un fichier de log + +```cmd +jq --slurp --arg kindCredit 'credit' --arg kindDebit 'debit' + 'def sum(kind): .entry_movements + | map(select(.operation_kind==kind)) + | map(.amount_in_cents) + | add; .[] + | { name: .entry_name, credit: sum($kindCredit), debit: sum($kindDebit) } + | { name : .name, delta : (.credit - .debit)} ' +``` + +## ngrok + +### Solution rapide + +La ligne de commande vous permet de créer un tunnel rapidement. + +``` +ngrok http http://192.168.33.10:80 +``` + +### Avec un fichier de configuration + +Vous pouvez aussi créer un fichier `~/.ngrok2/ngrok.yml` qui contiendra vos différentes configurations (à l'instar de `~/.ssh/config`). + +``` +tunnels: + homestead: + proto: http + addr: homestead.test + host_header: homestead.test +``` + +`addr` indique l'adresse que vous voulez exposer. + +`host_header` permet au serveur de savoir qu'on l'a appelé via "homestead.test", ce qui peut être utile si vous avez plusieurs sites sur la même IP. + +Pour les configurations plus avancées, vous pouvez vous reporter à la [documentation officielle](https://ngrok.com/docs#config). + +Dans ce cas, la commande sera : + +``` +ngrok start homestead +``` diff --git a/README.md b/README.md new file mode 100644 index 0000000..19c7461 --- /dev/null +++ b/README.md @@ -0,0 +1,80 @@ +# Formation pour l'AMSOM + +Dates : 5, 6, 7, 8 Janvier 2020 + +## Thèmes + +- Environnement et outils du développeur Web +- Git & Gitlab + +## Points d'intérêts remontés par le client + +### Environnement et outils du développeur Web + +- Tester des API (+++) +- Outils : VS Code (+) +- Serveur local virtuel : Homestead (-) +- Ligne de commande (+) +- Jour 2 (+++) + +[Lien](https://academie.iteracode.fr/product/environnement-et-outils-du-developpeur-web/) + +### Git & Gitlab + +- Introduction/Principes (-) +- Commandes de base (+++) +- Branches (+++) +- Merge Requests (+++) +- Intégration continue (+++) +- Déploiement continu (+++) +- Outils intégrés (+++) + +[Lien](https://academie.iteracode.fr/product/git-gitlab/) + +## Stratégie de formation + +Le programme de la formation n'est pas figé. Si vous souhaitez passer plus de temps sur un sujet, approfondir avec un exercice supplémentaire, ... tout est possible. + +L'objectif est que cette formation vous soit profitable. + +## Programme + +Une grande partie des actions du jour 2 prennent tout leur sens lorsque l'on dispose d'un serveur d'intégration continue. De même, avant d'entamer les commandes Git, il est souhaitable d'avoir une ligne de commande correctement configurée. + +Afin de profiter au maximum des différents sujets, nous allons donc naviguer entre les deux formations. + +### Mardi + +- Configuration du poste de travail + + - [Ligne de commande](./01_poste_de_travail/01_ligne_de_commande.md) + - [Editeur](./01_poste_de_travail/02_editeur.md) + - Présentation rapide de Homestead + +- [Savez-vous (vraiment) utiliser Git ?](./02_git/01_index.md) + +- [Git Tips + Branches](./02_git/01_index.md) + +### Mercredi + +- Exercice "Merge Requests" + +- Divers + + - [Gitlab Tooling](./05_divers/01_gitlab_tooling.md) + - [SSH](./05_divers/02_ssh.md) + - [Tester des API](./05_divers/03_test_api.md) + +- Bonnes pratiques - [Les outils](./03_bonnes_pratiques/01_les_outils.md) + +### Jeudi + +- Bonnes pratiques - [Les tests](./03_bonnes_pratiques/02_code.md) + +- Gitlab CI - [Les tests](./04_gitlab_ci/01_index.md) + +### Vendredi + +- Bonnes pratiques - [Le code](./03_bonnes_pratiques/02_code.md) + +- Gitlab CI - [Le déploiement](./04_gitlab_ci/01_index.md) diff --git a/resources/best-pratices-slides.key b/resources/best-pratices-slides.key new file mode 100755 index 0000000..dec53a3 Binary files /dev/null and b/resources/best-pratices-slides.key differ diff --git a/resources/best-pratices-slides.pdf b/resources/best-pratices-slides.pdf new file mode 100644 index 0000000..ee6b0b1 Binary files /dev/null and b/resources/best-pratices-slides.pdf differ diff --git a/resources/ci-slides.key b/resources/ci-slides.key new file mode 100755 index 0000000..30d5eaa Binary files /dev/null and b/resources/ci-slides.key differ diff --git a/resources/ci-slides.pdf b/resources/ci-slides.pdf new file mode 100644 index 0000000..80a61a4 Binary files /dev/null and b/resources/ci-slides.pdf differ diff --git a/resources/git-slides.key b/resources/git-slides.key new file mode 100644 index 0000000..8eba1e3 Binary files /dev/null and b/resources/git-slides.key differ diff --git a/resources/git-slides.pdf b/resources/git-slides.pdf new file mode 100644 index 0000000..de7a22e Binary files /dev/null and b/resources/git-slides.pdf differ diff --git a/resources/tests-slides.key b/resources/tests-slides.key new file mode 100755 index 0000000..5dc5a99 Binary files /dev/null and b/resources/tests-slides.key differ diff --git a/resources/tests-slides.pdf b/resources/tests-slides.pdf new file mode 100644 index 0000000..4424812 Binary files /dev/null and b/resources/tests-slides.pdf differ