Articles avec #integration continue tag

Publié le 11 Juillet 2014

Maintenant qu'on arrive à stocker nos compteurs dans hostedgraphite il serait sympa de pouvoir y accéder depuis une autre application comme un backoffice par exemple.

 

Rien de plus facile avec la "render API" de Graphite. Depuis hosted graphite il faut tout d'abord créer une clé d'accès (access key). Ce qui va nous fournir une URL personnalisé pour accéder à nos données.

 

Ensuite il suffit d'utiliser la render API pour récupérer les données. Par exemple pour récupérer le graphe d'un compteur on utilisera une url du type:

https://www.hostedgraphite.com/ded7a6f3/56223ce4-6e63-424c-b4f5-67fd6554ed43/graphite/render?from=-2h&target=mon.compteur

Récupérer des données Graphite depuis une appli externe

Et si jamais on veut les données aux format json au lieu d'une image il suffit d'ajouter un paramètre "format=json".

Pour afficher plusieurs compteurs sur le même graphe on peut ajouter plusieurs paramètres "target".

Super pratique! Plus d'info sur la render API: http://graphite.wikidot.com/url-api-reference

Voir les commentaires

Rédigé par Bliz

Publié dans #Intégration continue

Repost 0

Publié le 9 Juillet 2014

Il s'avère en fait très facile de mettre en place une solution sur mesure de monitoring d'une application, d'un site web, etc.

Pour cela il faut utiliser statsd. Il existe des clients pour tous les principaux langages.

Statsd n'est pas basé sur TCP mais UDP pour l'envoi des messages. Cela permet d'avoir un débit plus rapide en contrepartie du risque de perdre quelques messages (UDP n'acknowledge pas les messages).

 

Côté application

Votre application ou site doit donc envoyer des messages (compteurs, timers, etc) en utilisant le client statsd. Cette partie doit être codée dans l'application un peu de la même façon que des messages de logs.

Il faut bien réfléchir aux données qu'on veut surveiller et choisir des noms de compteurs en conséquence.

 

Serveur Statsd

Ensuite il faut un serveur statsd qui va recevoir toutes les mesures émises par votre application. Le rôle du serveur ici est assez simple car il va juste transférer les mesures vers graphite qui nous permettra de visualiser tout ça.

Le servers statsd est basé sur nodejs. Il faut donc avoir nodejs d'installer ensuite l'application est assez simple.

Il suffit de cloner le repo git de statsd:

git clone https://github.com/etsy/statsd.git
cd statsd
cp exampleConfig.js maConfig.js

 

Graphite

Ensuite avant de modifier la config statsd nous allons d'abord créer un compte sur hostedgraphite. C'est un service payant mais il y a 14 jours gratuits ce qui permet de tester tranquillement.

Une fois votre compte créer il vous faut récupérer votre API key.

Il faut aussi télécharger le backend statsd pour hostedgraphite et le copier dans le rep ./backends https://raw.githubusercontent.com/hostedgraphite/statsdplugin/master/hostedgraphite.js

Maintenant nous sommes prêts à éditer notre fichier maConfig.js pour mettre à jour la config de statsd:

{ graphitePort: 2003
, graphiteHost: "carbon.hostedgraphite.com"
, port: 8125
, backends: [ "./backends/hostedgraphite" ]
, dumpMessages: true
, debug: true
, hostedGraphiteAPIKey: "3fe05a3e-a3e6-45b2-a5e2-bab153599423"
}

 

Voilà on peut maintenant démarrer notre serveur statsd:

node stats.js msmConfig.js

 

Maintenant il n'y a plus qu'à aller sur votre compte graphite et visualiser toutes vos mesures.

Voir les commentaires

Rédigé par Bliz

Publié dans #Intégration continue

Repost 0

Publié le 21 Novembre 2012

Encore une fois, il y a un plugin pour ça. Et plus exactement un connector vers des serveurs Jenkins.

Ce plugin est intégrer dans Mylyn ce qui signifie qu'il est facilement installable :

Help > Install new software ...

Sélectionner l'URL correspondant à votre version d'Eclipse, par exemple pour Juno :

http://download.eclipse.org/releases/juno

Ensuite le plugin se trouve sous :

Collaboration > Mylyn Builds Connector: Hudson/Jenkins

Plus qu'à l'installer, redémarrer Eclipse.

Ensuite il faut afficher la vue "Builds", configurer un serveur et sélectionner les jobs à monitorer.

Voir les commentaires

Rédigé par Bliz

Publié dans #Intégration continue

Repost 0

Publié le 24 Novembre 2011

Jenkins permet de builder automatiquement ses projets mais il permet aussi de publier les fichiers générés sur des machines distantes.

Pour ma part je l'utilise pour déployer le dernier build automatiquement sur la machine de test.

Cela se fait au moyen du plugin "Publish Over SSH".

Il s'installe depuis le menu "manage Jenkins / manage plugins".

Une fois installé il faut définir la machine distante à laquelle on va se connecter: Cela se fait depuis le menu "manage Jenkins / configure system" dans la section SSH.

On peut également configurer les clés SSH directement dans Jenkins. Pour ma part j'ai configuré les clés SSH pour ne pas utiliser de mot de passe comme expliqué dans cet article.

Ensuite il faut sélectionner le projet qui effectue le build puis aller dans configure à la section "Build environment" et cocher l'option "Send files or execute commands over SSH after the build runs".

Toute une nouvelle section apparît alors. On va pouvoir séléctionner la machine distante configurée précédemment et préciser les fichier à uploader. Noter le "remove prefix" très pratique pour ne pas recréer l'arborescence des fichiers sur la machine distante.

On peut également exécuter une commande distante qui permet de démarrer automatiquement les tests après la mise à jour par exemple.

Tous les détails de la configuration du plugin "Public Over SSH" se trouve ici: https://wiki.jenkins-ci.org/display/JENKINS/Publish+Over+SSH+Plugin

Voir les commentaires

Rédigé par Bliz

Publié dans #Intégration continue

Repost 0

Publié le 22 Novembre 2011

SVN permet de définir des actions (hooks) en fonction des évènements de gestion conf. Il permet de définir les hooks suivant:

  • post-commit: déclenché après un commit
  • post-lock: déclenché après le lock d'un fichier ou d'un repertoire
  • post-revprop-change: déclenché après un changement de propriétés SVN
  • post-unlock: déclenché après la libération d'un lock
  • pre-commit: déclenché avant un commit
  • pre-lock: déclenché avant l'obtention d'un lock
  • pre-revprop-change: déclenché avant le changement de propriétés SVN
  • pre-unlock: déclenché avant la libération d'un lock
  • start-commit: déclenché avant l'opération de commit ne soit créé (avant le pre-commit).

Pour configurer un hook il faut placer un fichier exécutable (script, binaire, etc ..) dans le repertoire hooks de SVN, le nom du fichier devant être le nom du hook: http://svnbook.red-bean.com/en/1.5/svn.reposadmin.create.html#svn.reposadmin.create.hooks

Dans notre cas, seul le hook post-commit nous intéresse: Il faut donc créé un fichier nommé post-commit (sans .sh à la fin) et lui donner les drois 755 (soit rwxr-xr-x).

Le contenu du script doit être:

#!/bin/sh
#
REPOS="$1"
REV="$2"
UUID=`svnlook uuid $REPOS`
/usr/bin/wget \
  --header "Content-Type:text/plain;charset=UTF-8" \
  --post-data "`svnlook changed --revision $REV $REPOS`" \
  --output-document "-" \
  --timeout=2 \
  http://localhost/subversion/${UUID}/notifyCommit?rev=$REV

Penser à remplacer localhost par l'adresse du serveur Jenkins.

Comme on peut le voir lors d'un commit une commande wget sera exécutée pour envoyer une requête HTTP au serveur Jenkins.

Attention à bien activer le 'Poll SCM' dans la configuration du job Jenkins pour que le hook fonctionne (dans le cas contraire Jenkins ne déclenchera pas le build). Comme on a un déclenchement automatique on peut augmenter largement l'intervalle des vérifications SVN (une fois / jour par exemple).

Tout ceci est expliqué sur la page de configuration du plugin SVN : https://wiki.jenkins-ci.org/display/JENKINS/Subversion+Plugin

Voir les commentaires

Rédigé par Bliz

Publié dans #Intégration continue

Repost 0

Publié le 22 Novembre 2011

J'ai récemment ajouté l'analyse des sources dans Sonar à l'aide du SCM Activity plugin (voir article précédent) et tout marche nickel sauf pour un projet pour lequel Sonar fait systématiquement échouer le build.

En cherchant dans les logs du build j'ai trouvé l'erreur suivante:

[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Can not execute Sonar

Embedded error: Fail to load SCM data as there are local modifications: 
[com/over-blog/patatos/xml/AuthenticationType.java:modified]
        [...]
[INFO] ------------------------------------------------------------------------
[INFO] Trace
org.apache.maven.lifecycle.LifecycleExecutionException: Can not execute Sonar
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:719)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:284)
        ....
Caused by: org.apache.maven.plugin.MojoExecutionException: Can not execute Sonar
at org.codehaus.mojo.sonar.Bootstraper.executeMojo(Bootstraper.java:103)
at org.codehaus.mojo.sonar.Bootstraper.start(Bootstraper.java:79)
at org.codehaus.mojo.sonar.SonarMojo.execute(SonarMojo.java:88)
at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)
... 17 more
Caused by: org.sonar.api.utils.SonarException: Fail to load SCM data as there are local modifications:
        [com/over-blog/patatos/xml/AuthenticationType.java:modified]
        [...]
at org.sonar.plugins.scmactivity.LocalModificationChecker.doCheck(LocalModificationChecker.java:69)
at org.sonar.plugins.scmactivity.LocalModificationChecker.check(LocalModificationChecker.java:50)
at org.sonar.plugins.scmactivity.ScmActivitySensor.analyse(ScmActivitySensor.java:80)
at org.sonar.batch.phases.SensorsExecutor.execute(SensorsExecutor.java:64)
at org.sonar.batch.phases.Phases.execute(Phases.java:93)
at org.sonar.batch.bootstrap.ProjectModule.doStart(ProjectModule.java:143)
        ...
... 21 more
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2 minutes 23 seconds
[INFO] Finished at: Tue Nov 22 02:07:15 CET 2011
[INFO] Final Memory: 109M/448M
[INFO] ------------------------------------------------------------------------
Build step 'Sonar' changed build result to FAILURE
Build step 'Sonar' marked build as failure
Finished: FAILURE

Comme indiquer dans les logs le SCM Activity plugin a trouvé une différence entre les sources compilées et les sources sous SVN et donc il fait échouer le build.

Effectivement il a bien une différence au niveau des sources car les fichiers concernés sont des sources générées lors du build à l'aide d'XMLBeans. Certes ces fichiers ne devraient pas être présent dans la gestion de conf mais on tout n'est pas parfait en ce monde et ici, je dois faire avec. 

Heureusement Sonar a prévu le coup: il faut désactiver le check des sources pour ce projet là et rien de plus simple, il suffit de changer un paramètre de config pour ce projet:

  • Se connecter à Sonar en tant qu'admin via l'interface web
  • Sélectionner le projet incriminé
  • Aller dans 'Settings' dans le menu de gauche
  • Choisir la catégory 'SCM Activity'
  • Passer 'Ignore local modifications' (sonar.scm.ignoreLocalModifications) à true
  • Enregistrer les modifications

Et voilà maintenant tout mes projets build à nouveau avec l'analyse des sources !!

Voir les commentaires

Rédigé par Bliz

Publié dans #Intégration continue

Repost 0

Publié le 28 Octobre 2011

Après un article sur comment afficher sa dette technique avec Sonar, voici comment la maitriser en suivant jour après jour les nouvelles violations des règles de codage introduites dans le code.

Le but est de suivre l'évolution des 'Rules compliances' build après build. Cela est possible directement dans sonar avec l'option 'since previous analysis' ou 'over 5 days'.

Cela permet déjà de trouver les nouvelles violations et de les corriger. Et oui c'est le but!!

 

Mais sur un projet assez conséquent avec plusieurs développeurs il peut être plus rapide que chaque personne répare ses propres erreurs. De plus cela permettra à la personne de se former plus rapidement en prenant conscience de ces erreurs de codage... (et je me sens aussi concerné quand j'écris ceci ).

 

Pour revenir à la configuration de sonar il faudra installer le plugin 'SCM Activity' qui permettra de suivre l'évolution du projet depuis l'outils de gestion de conf (ici SVN mais il fonctionne aussi avec d'autres).

Dans la configuration du plugin il faudra renseigner le login à utiliser pour se connecter au SCM.

Il faut également veiller à ce que dans le pom.xml du projet il soit bien déclarer l'url de connection à SVN.

Pour plus de détail sur la configuration du plugin voir ici: http://docs.codehaus.org/display/SONAR/SCM+Activity+Plugin.

 

Et voilà c'est tout. Lors de la prochaine analyse, il s'affichera dans la marge du code source le nom de la personne ayant commiter le changement avec les violations. Plus qu'à le prévenir pour effectuer les corrections!!

Cool, non ?

Voir les commentaires

Rédigé par Bliz

Publié dans #Intégration continue

Repost 0

Publié le 24 Octobre 2011

Sonar est très connu pour permettre de suivre la qualité du code d'un logiciel, il va même jusqu'à afficher la dette technique accumulé sur un projet.

Après avoir installé Sonar et analysé mon projet, je voulais avoir une estimation de la dette technique mais impossible de trouver cette information dans l'interface web de sonar.

En fait les infos sur la dette technique ne sont pas présente par défaut sous Sonar. Il faut pour cela ajouter le plugin 'Technical Debt'.

Cela se fait très facilement en utilisant l'interface d'administration.

Voir les commentaires

Rédigé par Bliz

Publié dans #Intégration continue

Repost 0