Utiliser le format générique de rapports d'analyse de code

Si vous utilisez une solution non supportée par Themis, qu'elle soit open source, propriétaire ou développée en interne par vos soins, il est possible de synchroniser vos rapports d'analyse avec Themis par le biais d'un format générique de rapports.

Vous devez donc accomplir ce travail préliminaire, qui consiste à transformer vos rapports existants vers ce nouveau format.

Un rapport générique est au format XML, et s'inspire de formats standards tels que Checkstyle.

Description du format XML

Le rapport doit suivre le format suivant :

<?xml version="1.0" encoding="UTF-8"?>
<report>
    <file name="ProjetA/src/Foo.c">
        <error message="Local variable 'i' is never read" rule="unusedVariable" ruleDescription="http://url.to.doc.rule"/>
    </file>
    <file name="ProjetB/src/Bar.c">
        <error message="Function 'compute' is too long (400 characters)" rule="functionTooLong" ruleDescription="http://url.to.doc.rule"/>
    </file>
</report>

L'exemple ici est sur du code C, mais cela peut être d'autres fichiers écrits dans d'autres langages. 

Voici dans le détail la description des éléments :

  • Un noeud racine report englobe la totalité des données
  • Un nœud file est crée par fichier analysé. Chaque noeud contient l’attribut suivant :
    • name : il s’agit du chemin du fichier, si possible depuis la racine du dépôt de code source. Un sous-chemin peut être suffisant, mais implique des risques de conflits avec d’autres fichiers portant le même sous-chemin. A minima, le nom complet du fichier (nom+extension) est nécessaire.
  • Pour chaque erreur, on ajoute à l’intérieur du nœud file un nœud error avec les attributs suivants :
    • message : la description complète et contextualisée de l’erreur permettant à un développeur d’identifier la cause du problème et comment résoudre ce dernier ;
    • rule : l’identifiant unique de la règle (la bonne pratique à respecter) de qualimétrie concernée par le problème ;
    • ruleDescription : permet d’indiquer aux utilisateurs de Themis une description de la règle. Vous pouvez indiquer ici un lien vers un wiki interne ou autre ressource. Cet attribut est optionnel.

Il est possible de produire plusieurs rapports si besoin. En effet, seule une archive est transmise à Themis, celle-ci peut contenir un ou plusieurs rapports.

Préparer une source Themis à l'envoi de rapports génériques

Dans la partie Administration puis Projets, identifiez la source concernée par ces rapports d'analyse. Ajouter un plugin pour la pratique "Dette technique", puis sélectionnez l'option Rapports génériques linter

Ajoutez les extensions de fichier concernés par votre analyse de code. Ce point est important car il permettra à Themis de ne prendre en compte sur votre dépôt de code source que les fichiers concernés par l'analyse.

Ainsi, si vous indiquez ".js", seuls les fichiers avec des extensions .js seront pris en compte. Si des fichiers avec extensions ".js" n'apparaissent pas dans vos rapports (ce qui arrive généralement quand aucun défaut n'est détecté dans ce fichier), Themis les prendra tout de même en compte en considérant qu'il n'y a pas de défauts. 

Envoi des rapports à Themis par l'API REST

Si vous n'utilisez pas Jenkins, ou ne souhaitez pas utiliser le plugin Jenkins, il est possible d'utiliser l'API de Themis pour synchroniser les rapports d'analyse de code au format générique. Voici un exemple de script BASH que vous pouvez implémenter dans un autre langage si vous le souhaitez (les variables au début sont à adapter dans votre contexte) :

#!/bin/bash

#TOCHANGE THEMIS_URL="http://mythemis.com" SOURCE_KEY="da4e11f4-5489-4b2a-a028-20d071b1c671" API_KEY="NWJjZWQ3ZmNhYTJhYzkwMWRmNGZhYTYx" GENERIC_REPORT_FILE="generic_report_themis.xml" CURRENT_COMMIT=$(git rev-parse HEAD) #Current GIT commit
#For SVN : $(svn info --show-item last-changed-revision) CURRENT_DATE=$(date +%s)"000" WORKSPACE=$(pwd) #the root directory of the source code repository REPORT_ARCHIVE="themis_report.zip" #First of all, create an archive with all generic reports REPORT_DIR=$(mktemp -d -p /tmp) find . -name $GENERIC_REPORT_FILE -exec cp --parents \{\} $REPORT_DIR \; if [ -e $REPORT_ARCHIVE ];then echo "Remove existing archive" rm $REPORT_ARCHIVE else echo "File "$REPORT_ARCHIVE" does not exist" fi #Create archive to send to Themis zip -r $REPORT_ARCHIVE $REPORT_DIR curl -i \ -H "Content-Type: multipart/form-data" \ -H "Accept: application/json,application/zip" \ -H "themis-api-key:$API_KEY" \ -X POST \ -F 'metadata={ "executionDate" : "'$CURRENT_DATE'", "dataType" : "generic-report", "commit" : "'$CURRENT_COMMIT'", "dataWorkspace" : "'$WORKSPACE'"};type=application/json' \ -F "archive=@"$REPORT_ARCHIVE";type=application/zip" \ $THEMIS_URL/api/reportFiles/$SOURCE_KEY rm -rf $REPORT_DIR
rm $REPORT_ARCHIVE

 

Cet article vous a-t-il été utile ?
Utilisateurs qui ont trouvé cela utile : 0 sur 0

Commentaires

0 commentaire

Veuillez vous connecter pour laisser un commentaire.