graphtour - workday: tracking activity with neo4j (french version)
TRANSCRIPT
• François Ritaly
• Build Engineer (Build Engineering Team)
• Situé à Paris
• Responsabilités
‒ Développement de plugins Gradle réutilisables
‒ Administration d’Artifactory
‒ Développement d’outils sur mesure
‒ Support aux équipes de développment (builds principalement)
‒ Sentinel (Le sujet de cette présentation)
Qui suis-je ?
Workday Confidential
• Définir les bonnes pratiques pour les
équipes de développement (dependency
locking, promotion d’artefacts, gestion des
meta-données)
• Fournir des outils génériques (Plugins
Gradle & autres outils sur mesure)
• Administrer les services communs
(Artifactory)
• Assister les équipes de développment
Build Engineering – Notre mission
Workday Confidential
• S’assurer que les règles sont bien suivies
• Chez Workday, les ingénieurs ont beaucoup de
liberté !
‒ Netflix: The Paved Road
• Les outils proposés sont-ils pertinents ?
• Comprendre comment les équipes de
développement travaillent
On a besoin de réponses a ces questions !
Why We Need Monitoring
Workday Confidential
• Artefacts (Jars, Rpms, “Deliveries”, etc)
• CI Builds (Bamboo, Team City &Jenkins)
• SCM changes (BitBucket, GitHub, Gerritt, etc)
• Dépendences (entre Artifacts, Builds, etc)
• Tickets JIRA (suivi du code)
• Promotions (d’artefacts)
• Meta-données en général
Ce qui nous intéresse…
Workday Confidential
• Pas de source de vérité unique avec toute l’information nécessaire !
• La donnée est disséminée à travers plusieurs systèmes (AF, CI, JIRA…)
• … est securisée avec des comptes différents (AD, LDAP)
• … est stockée sous différents formats (JSON, XML, CSV, etc)
• … n’est pas toujours facilement accessible
• Accéder à une source est (habituellement) facile
• Accéder à deux sources est déjà plus compliqué
• Pas de language de requête pour requêter la donnée aggregée
Problème: La donnée est partout !!
Workday Confidential
• Accès simple à l’information
• Modèle de données intuitif et unifié
• Language de requête puissant
• Donnée aussi fraîche que possible
Fréquentes mises à jour
Mises à jour rapides (performance)
• Capacité de facilement faire évoluer le modèle de données
• Capacité d’exposer l’information aux équipes de développement
(automatisation)
Les besoins
Workday Confidential
• Ne pas compter sur l’utilisateur pour fournir l’information (ou alors
en tout dernier recours) !
• L’information que nous recherchons habituellement existe déjà
ou alors peut-être dérivée, utilisons-la !
Mais surtout !
Workday Confidential
Architecture
Workday Confidential
REST API
Web UI
Data
Miner
…
JIRA
Artifactory
Bamboo
BitBucket
Data SourcesUne fondation pour résoudre nos problèmes actuels et futurs
Neo4j
Aggregation
Sanitization
Normalization
• Outil en ligne de commande (écrit en Groovy)
• Fat jar exécutable
• S’exécute toutes les 15 mins depuis Bamboo
• Scanne les data sources contenant l’information utile
• Extrait, nettoie et normalise de manière préemptive l’information
• Détecte les mises à jour de manière incrémentale (performance)
• Crash-proof
• Enchaînement de 59 commandes en séquence
• Un scan dure entre 8 mins et 23 mins
L’extracteur de données
Workday Confidential
• Base de données NoSQL de type graph
• Paradigme adapté à notre problème
• Trés flexible et facile d’utilisation
• Schema-less
• Excellente performance
• Donnée stockée à un seul endroit
• Cypher (Language de requête) !
La base de données: Neo4j
Workday Confidential
• UI consistée de tableaux de bords HTML et graphiques dynamiques
• API REST
• Spring Boot, Thymeleaf, D3.js, Swagger
Les Services
Workday Confidential
• Les noeuds ont des propriétés (comparable à une Map<String, ?>)
• … peuvent avoir 0-N labels (Typage, Polymorphisme)
Neo4j - Noeuds
Workday Confidential
core
1.0.5 jar
Artifact ArtifactoryFile Workday id com.workday:core
group com.workday
artifact core
version 1.0.5
created 1458713182201
• Les relations représentent un lien entre 2 noeuds
• … ont un nom
• … peuvent être dirigées
• … peuvent avoir des propriétés
Neo4j - Relations
Workday Confidential
Artifact
core
1.0.5 jar
Git Commit
core
5ce1f767
HAS_COMMIT
Language de requête de Neo4j
Un noeud ()
Un noeud avec un label (:Person)
Une relation entre 2 noeuds ()--()
Une relation dirigée avec un label ()-[:PARENT_OF]->()
MATCH (parent:Person)-[:PARENT_OF]->(child:Person)
RETURN parent.name, COLLECT(child.name)
Neo4j - Cypher
Workday Confidential
Tout démarre avec Artifactory
Workday Confidential
• Dépôt officiel des artefacts, rpms, images Docker
• L’API REST permet de détecter les nouveaux artefacts
Etape 1: Artefacts
Workday Confidential
• URI: com/workday/core/1.0.5/core-1.0.5-javadoc.jar
Group com.workday
Module core
Version 1.0.5
Type jar
Classifier javadoc
ID: “com.workday:core:1.0.5:javadoc@jar”
Artifact
core 1.0.5 jar
javadoc
Etape 2: Module Versions
Workday Confidential
• L’artefact est associé à une “Module Version”
Group com.workday
Module core
Version 1.0.5
ID: “com.workday:core:1.0.5”
ModuleVersion
core 1.0.5
Etape 3: Modules
Workday Confidential
• La module version est associée à un “Module”
Group com.workday
Module core
ID: “com.workday:core”
Module
core
Les 3 concepts ensembles
Workday Confidential
Module
coreArtifact
jar
Artifact
javadoc
jar
Artifact
sources
jar
ARTIFACT_OF
Artifact
jar
Artifact
javadoc
jar
Artifact
sources
jar
ARTIFACT_OF
Version
1.0.5
Version
1.0.7
VERSION_OF VERSION_OF
Version
1.0.6
Etape 4: Résolution des dépendences
Workday Confidential
• Descripteurs Maven / Ivy Dépendences
• Dépendences Relations DEPENDS_ON
services
2.0.0DEPENDS_ON
gson
2.2.2
core
1.0.5DEPENDS_ON
Etape 5: Extraction des méta-données
Workday Confidential
• Alimentées au moment du build (plugin Gradle propriétaire)
• Capturent l’information suivante:
‒ Gradle, JDK, Machine de build
‒ Builds (Bamboo, Jenkins…)
‒ SCM changes (Git commit)
• Auto-documente les artefacts
Manifest Metadata – SCM Info
Workday Confidential
• WD-Git-Origin ssh://[email protected]/core/core.git
• WD-Git-Commit e28a60b96f452680c57cb76798def09fd171011f
Artifact
core
1.0.5 jar
Git Commit
core
e28a60…
HAS_COMMIT
Liste de tous les artefacts Workday
Workday Confidential
Group Module Latest
Version
Age
(days)
SCM url SCM
change
Build
URL
Latest
JIRAs
com.workday core 1.0.5 120.2 core.git e28a60b9 URL CORE-120
com.workday foo-services 1.3.0 29.1 foo-services.git 146ae135 URL FOO-57
com.workday bar-services 2.2.8 54.8 bar-services.git b538c156 URL BAR-70
… … … … … … … …
Page web accessible avec toutes les dernières versions (donnée toujours à jour)
→ Où se trouve le build associé à ce fichier jar ?
→ Où sont les sources de ce fichier jar ?
Identification des dépendences 1/x (directes)
Workday Confidential
MATCH (dependent:ModuleVersion)-[:DEPENDS_ON]->(dependency:ModuleVersion)
WHERE dependency.id = "com.workday:core:1.0.5”
RETURN dependent.id AS dependent
Service REST disponible
Dependent
com.workday:foo-
services:1.3.0
com.workday:foo-
services:1.2.5
com.workday:bar-
services:2.2.8
com.workday:bar-
services:2.2.7
…
Orchestration de builds
Workday Confidential
Producing build Consuming build
Bamboo Build
CORE
BUILT
Artifact
core 1.0.5
jar
ModuleVersion
core 1.0.5
AR
TIF
AC
T_
OF
ModuleVersion
foo-services 1.3.0
AR
TIF
AC
T_
OF
Bamboo Build
FOO-SERVICES
Artifact
foo-services 1.3.0
jar
BUILT
DE
PE
ND
S_
ON
DEPENDS_ON
Release notes automatisées
Workday Confidential
Version 1 Version 2
Bamboo Build
CORE #11
BUILT
Artifact
core v1
jar
Git Commit
core
5ce1f767
HA
S_
RE
VIS
ION
Git Commit
core
ee2a0e22
HA
S_
RE
VIS
ION
Bamboo Build
CORE #12
Artifact
core v2
Jar
BUILT
PA
RE
NT
_R
EV
ISIO
N
JIRA Issue
CORE-120
LINKS_TO
Identifier les changements associés à un JIRA
Workday Confidential
Trouver toutes les mentions d’un JIRA dans les
commentaires de commit
Input: JIRA issue
Output: Set of SCM changes
JIRA Issue
CORE-120
Git Commit
core
5ce1f767
Git Commit
core
5954ff88
Git Commit
core
ee2a0e22
Règle: “Aucune dépendence dynamique permise”
Raison: Les builds doivent être reproductibles
Dynamic versions: 1.+, LATEST, [1.0, 2.0[
Détection des violations de règles
Workday Confidential
Page HTML listant toutes les infractions à la règle
ModuleVersion
baz 4.2.10
ModuleVersion
pmd-checks
1.+
DEPENDS_ON
Conclusion
Workday Confidential
• Service mis en production
• Neo4j est l’outil parfait pour capturer la donnée qui nous intéresse
‒ Très facile de refactorer / enrichir la donnée
• Cypher nous permet de comprendre la donnée aggregée
• Fondation solide pour de futurs services
‒ Partie difficile: Extraire la donnée
‒ Partie facile: Créer de nouvelles requêtes sur la donnée existante
• Decisions basées sur des faits ! Plus de suppositions
• Approche holistique