SlideShare une entreprise Scribd logo
Validation de code
Code défensif
Paris Puppet DevOps Meetup
30/03/2017
Sommaire
• Les Hooks Git
– Emplacement
– Timeline
• Validation de code
– Commande
• Qualité de code
– Linter
• Code défensif
• Aller plus loin…
Hooks Git ?
• Description git-scm.com
Git dispose d'un moyen de lancer des scripts personnalisés
quand certaines actions importantes ont lieu.
Il y a deux groupes de crochets : ceux côté client et ceux
côté serveur.
Les crochets côté client concernent les opérations de
client telles que la validation et la fusion.
Les crochets côté serveur concernent les opérations de
serveur Git telles que la réception de commits
Différents systèmes,
une même implémentation
Timeline des hooks
Client
• prepare-commit-
msg
• commit-msg
• post-commit
GIT PUSH
Serveur
• pre-receive
• update
• post-
receive
Deux groupes de hooks:
côté client
Généralement des opérations de validation
côté serveur
Généralement des triggers
Validation de code
Quand valider ?
git
add
git
commit
git
push
Que valider en pre-commit ?
.pp -> syntaxe manifest Puppet
.epp -> syntaxe template Puppet epp
.erb -> syntaxe template Puppet erb
.rb -> syntaxe extention Puppet
Fact : présence de confine
.yaml -> structure yaml hieradata
.json -> structure json metadonnées
repo -> arborescences et fichiers cachés
facts.d -> présence du shebang
Puppetfile -> syntaxe Puppetfile
Commandes unitaires
Extension Commande
.pp puppet parser validate class.pp
.epp puppet epp validate <fichier>.epp
.erb erb -x -T '-' <fichier>.erb | ruby -c
.rb ruby -c <fichier>.rb
(facts) grep -e
'^s*confines*:kernel.*=>'
<fichier>.rb
.yaml ruby -e "require 'yaml';
YAML.load_file('<fichier>.yaml')"
.json python -mjson.tool <fichier>.json
Mais aussi…
Check Commande
repo folders='manifests files lib templates
examples facts.d spec functions types
tests'
for i in $(ls -d */); do
if ! [[ ${folders[*]} =~ ${i%%/} ]]
then
echo "${i%%/} > Folder name error"
error=1
fi
done
facts.d head -n1 <file>| grep -e '^#!/‘
Qualité de code
Le code poussé doit être conforme à des
standards de qualité, aux différents style guide.
Exemple de checks en utilisant puppet-lint:
https://github.com/rodjek/puppet-lint
gem install puppet-lint
% puppet-lint init.pp
WARNING: top-scope variable being used without explicit namespace on line 81
ERROR : define defined inside a class on line 59
ERROR: single quoted string containing a variable on line 124
WARNING: string containing only a variable on line 81
WARNING: => on line isn't properly aligned for resource on line 71
ERROR: two-space soft tabs not used on line 50
WARNING: line has more than 80 characters on line 83
ERROR: trailing whitespace found on line 163
ERROR: mode should be represented as a 4 digit value on line 55
ERROR: no default in case statement
Linter
Différents linter existent pour valider les fichiers
d’un module.
Généralement sous forme de package Ruby
Cible Install
.pp gem install puppet-lint
metadata.json gem install metadata-json-lint
.json gem install jsonlint
.yaml gem install yaml-lint
Code défensif
Ce type de check interdit l’utilisation de certains
type ou resource type Puppet.
Cela permet de forcer l’utilisation d’un wrapper,
défini par une autre équipe en charge de cette
ressource.
Code défensif
Exemples:
En situation :
grep -e '^s*users*{.*[:|,]'
<file.pp>
Action Regex
Interdire la ressource user ^s*users*{.*[:|,]
Interdire la ressource group ^s*groups*{.*[:|,]
Interdire la ressource yumrepo ^s*yumrepos*{.*[:|,]
Et les control repos ?
Les control repos sont des repos Git permettant de
mapper une branche Git à un environnement
Puppet et son contenu.
Validation de la syntaxe des Puppetfile :
r10k puppetfile check
Aller plus loin …
Trigger
Scripts / API
git
add
git
commit
git
push
Aller plus loin …
• Fichiers cachés hors standard
• Repo comportant des RPM
• git tag = metadata.json tag
• …
What else ?
Questions ?

Contenu connexe

Similaire à Validation de code Puppet avec les Git Hook, Code défensif

Outils de gestion de projets
Outils de gestion de projetsOutils de gestion de projets
Outils de gestion de projets
ECAM Brussels Engineering School
 
Ez18n Annotation Processing Tool in a nutshell
Ez18n Annotation Processing Tool in a nutshellEz18n Annotation Processing Tool in a nutshell
Ez18n Annotation Processing Tool in a nutshell
gdigugli
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeure
Jonathan Bonzy
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureMarc Nazarian
 
20080923 04 - Selenium web application testing system
20080923 04 - Selenium web application testing system20080923 04 - Selenium web application testing system
20080923 04 - Selenium web application testing system
LeClubQualiteLogicielle
 
AFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open APIAFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open API
Romain Cambien
 
Pourquoi versionner ses githooks.pdf
Pourquoi versionner ses githooks.pdfPourquoi versionner ses githooks.pdf
Pourquoi versionner ses githooks.pdf
Chris Saez
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
Arnaud Héritier
 
Industrialisation PHP - Canal+
Industrialisation PHP - Canal+Industrialisation PHP - Canal+
Industrialisation PHP - Canal+
ekino
 
Presentation
PresentationPresentation
Presentation
Bayrem GHARSELLAOUI
 
Industrialisation des développements logiciels
Industrialisation des développements logicielsIndustrialisation des développements logiciels
Industrialisation des développements logiciels
Sylvain Leroy
 
20080115 02 - Panorama des outils de recueil de métriques PHP Open Source
20080115 02 - Panorama des outils de recueil de métriques PHP Open Source20080115 02 - Panorama des outils de recueil de métriques PHP Open Source
20080115 02 - Panorama des outils de recueil de métriques PHP Open Source
LeClubQualiteLogicielle
 
Introduction à Symfony
Introduction à SymfonyIntroduction à Symfony
Introduction à Symfony
Abdoulaye Dieng
 
Chef - Paris BlockCamp - Nov 09
Chef - Paris BlockCamp - Nov 09Chef - Paris BlockCamp - Nov 09
Chef - Paris BlockCamp - Nov 09
Olivier Gutknecht
 
Developpement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdfDeveloppement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdf
rachidimstapha
 
[FR] C'est quoi une API ?
[FR] C'est quoi une API ?[FR] C'est quoi une API ?
[FR] C'est quoi une API ?
OVHcloud
 
WordCamp Lille 2018 : Comprendre et utiliser l'API REST de WooCommerce
WordCamp Lille 2018 : Comprendre et utiliser l'API REST de WooCommerceWordCamp Lille 2018 : Comprendre et utiliser l'API REST de WooCommerce
WordCamp Lille 2018 : Comprendre et utiliser l'API REST de WooCommerce
Vaisonet
 
Omnilog 2016 - Apéro techno : Rex Identicar sur l'intégration continue
Omnilog 2016 - Apéro techno : Rex Identicar sur l'intégration continueOmnilog 2016 - Apéro techno : Rex Identicar sur l'intégration continue
Omnilog 2016 - Apéro techno : Rex Identicar sur l'intégration continue
Xavier Callens
 
Symfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiquesSymfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiques
Noel GUILBERT
 
Mon environnement de travail a-t-il encore un avenir ?
Mon environnement de travail a-t-il encore un avenir ?Mon environnement de travail a-t-il encore un avenir ?
Mon environnement de travail a-t-il encore un avenir ?
Frederic Dewinne
 

Similaire à Validation de code Puppet avec les Git Hook, Code défensif (20)

Outils de gestion de projets
Outils de gestion de projetsOutils de gestion de projets
Outils de gestion de projets
 
Ez18n Annotation Processing Tool in a nutshell
Ez18n Annotation Processing Tool in a nutshellEz18n Annotation Processing Tool in a nutshell
Ez18n Annotation Processing Tool in a nutshell
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeure
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeure
 
20080923 04 - Selenium web application testing system
20080923 04 - Selenium web application testing system20080923 04 - Selenium web application testing system
20080923 04 - Selenium web application testing system
 
AFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open APIAFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open API
 
Pourquoi versionner ses githooks.pdf
Pourquoi versionner ses githooks.pdfPourquoi versionner ses githooks.pdf
Pourquoi versionner ses githooks.pdf
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
 
Industrialisation PHP - Canal+
Industrialisation PHP - Canal+Industrialisation PHP - Canal+
Industrialisation PHP - Canal+
 
Presentation
PresentationPresentation
Presentation
 
Industrialisation des développements logiciels
Industrialisation des développements logicielsIndustrialisation des développements logiciels
Industrialisation des développements logiciels
 
20080115 02 - Panorama des outils de recueil de métriques PHP Open Source
20080115 02 - Panorama des outils de recueil de métriques PHP Open Source20080115 02 - Panorama des outils de recueil de métriques PHP Open Source
20080115 02 - Panorama des outils de recueil de métriques PHP Open Source
 
Introduction à Symfony
Introduction à SymfonyIntroduction à Symfony
Introduction à Symfony
 
Chef - Paris BlockCamp - Nov 09
Chef - Paris BlockCamp - Nov 09Chef - Paris BlockCamp - Nov 09
Chef - Paris BlockCamp - Nov 09
 
Developpement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdfDeveloppement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdf
 
[FR] C'est quoi une API ?
[FR] C'est quoi une API ?[FR] C'est quoi une API ?
[FR] C'est quoi une API ?
 
WordCamp Lille 2018 : Comprendre et utiliser l'API REST de WooCommerce
WordCamp Lille 2018 : Comprendre et utiliser l'API REST de WooCommerceWordCamp Lille 2018 : Comprendre et utiliser l'API REST de WooCommerce
WordCamp Lille 2018 : Comprendre et utiliser l'API REST de WooCommerce
 
Omnilog 2016 - Apéro techno : Rex Identicar sur l'intégration continue
Omnilog 2016 - Apéro techno : Rex Identicar sur l'intégration continueOmnilog 2016 - Apéro techno : Rex Identicar sur l'intégration continue
Omnilog 2016 - Apéro techno : Rex Identicar sur l'intégration continue
 
Symfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiquesSymfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiques
 
Mon environnement de travail a-t-il encore un avenir ?
Mon environnement de travail a-t-il encore un avenir ?Mon environnement de travail a-t-il encore un avenir ?
Mon environnement de travail a-t-il encore un avenir ?
 

Validation de code Puppet avec les Git Hook, Code défensif

  • 1. Validation de code Code défensif Paris Puppet DevOps Meetup 30/03/2017
  • 2. Sommaire • Les Hooks Git – Emplacement – Timeline • Validation de code – Commande • Qualité de code – Linter • Code défensif • Aller plus loin…
  • 3. Hooks Git ? • Description git-scm.com Git dispose d'un moyen de lancer des scripts personnalisés quand certaines actions importantes ont lieu. Il y a deux groupes de crochets : ceux côté client et ceux côté serveur. Les crochets côté client concernent les opérations de client telles que la validation et la fusion. Les crochets côté serveur concernent les opérations de serveur Git telles que la réception de commits
  • 5. Timeline des hooks Client • prepare-commit- msg • commit-msg • post-commit GIT PUSH Serveur • pre-receive • update • post- receive Deux groupes de hooks: côté client Généralement des opérations de validation côté serveur Généralement des triggers
  • 6. Validation de code Quand valider ? git add git commit git push
  • 7. Que valider en pre-commit ? .pp -> syntaxe manifest Puppet .epp -> syntaxe template Puppet epp .erb -> syntaxe template Puppet erb .rb -> syntaxe extention Puppet Fact : présence de confine .yaml -> structure yaml hieradata .json -> structure json metadonnées repo -> arborescences et fichiers cachés facts.d -> présence du shebang Puppetfile -> syntaxe Puppetfile
  • 8. Commandes unitaires Extension Commande .pp puppet parser validate class.pp .epp puppet epp validate <fichier>.epp .erb erb -x -T '-' <fichier>.erb | ruby -c .rb ruby -c <fichier>.rb (facts) grep -e '^s*confines*:kernel.*=>' <fichier>.rb .yaml ruby -e "require 'yaml'; YAML.load_file('<fichier>.yaml')" .json python -mjson.tool <fichier>.json
  • 9. Mais aussi… Check Commande repo folders='manifests files lib templates examples facts.d spec functions types tests' for i in $(ls -d */); do if ! [[ ${folders[*]} =~ ${i%%/} ]] then echo "${i%%/} > Folder name error" error=1 fi done facts.d head -n1 <file>| grep -e '^#!/‘
  • 10. Qualité de code Le code poussé doit être conforme à des standards de qualité, aux différents style guide. Exemple de checks en utilisant puppet-lint: https://github.com/rodjek/puppet-lint gem install puppet-lint % puppet-lint init.pp WARNING: top-scope variable being used without explicit namespace on line 81 ERROR : define defined inside a class on line 59 ERROR: single quoted string containing a variable on line 124 WARNING: string containing only a variable on line 81 WARNING: => on line isn't properly aligned for resource on line 71 ERROR: two-space soft tabs not used on line 50 WARNING: line has more than 80 characters on line 83 ERROR: trailing whitespace found on line 163 ERROR: mode should be represented as a 4 digit value on line 55 ERROR: no default in case statement
  • 11. Linter Différents linter existent pour valider les fichiers d’un module. Généralement sous forme de package Ruby Cible Install .pp gem install puppet-lint metadata.json gem install metadata-json-lint .json gem install jsonlint .yaml gem install yaml-lint
  • 12. Code défensif Ce type de check interdit l’utilisation de certains type ou resource type Puppet. Cela permet de forcer l’utilisation d’un wrapper, défini par une autre équipe en charge de cette ressource.
  • 13. Code défensif Exemples: En situation : grep -e '^s*users*{.*[:|,]' <file.pp> Action Regex Interdire la ressource user ^s*users*{.*[:|,] Interdire la ressource group ^s*groups*{.*[:|,] Interdire la ressource yumrepo ^s*yumrepos*{.*[:|,]
  • 14. Et les control repos ? Les control repos sont des repos Git permettant de mapper une branche Git à un environnement Puppet et son contenu. Validation de la syntaxe des Puppetfile : r10k puppetfile check
  • 15. Aller plus loin … Trigger Scripts / API git add git commit git push
  • 16. Aller plus loin … • Fichiers cachés hors standard • Repo comportant des RPM • git tag = metadata.json tag • … What else ?