Docker-in-Docker (DinD) capabilities of public runners deactivated. More info

Commit 48868b5f authored by Cyril L'Orphelin's avatar Cyril L'Orphelin
Browse files

Premiere version compilée des présentations et TPs

parent 34916049
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/anf-qualite_logicielle.iml" filepath="$PROJECT_DIR$/.idea/anf-qualite_logicielle.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
</set>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
\ No newline at end of file
# ANF Qualité logicielle dans les projets
## Normes et bonnes pratiques
[Page Web initiale de l'ANF](https://ri3.pages.in2p3.fr/ecole-info/2021/anf-qualite-logicielle)
Présentations
==============
# Normes, bonnes pratiques et indicateurs
TP
===
- [Principes de bases de la qualité logicielle et situation globale actuelle](présentations/bases_qualite_logicielle.pdf) - *Clémence Agrapart*
- [Normes](présentations/normes.pdf) - *Clémence Agrapart*
- [Comment le code peut être une construction collective](présentations/construction_collective.pdf) - *Antoine Pérus*
- [Méthodologie: Règles de bases à appliquer](présentations/methodologies.pdf) - *William Recart*
- [Indicateurs de suivi de la qualité logicielle](présentations/indicateurs.pdf) - *William Recart*
- [Méthodologie : Retour d'expérience](présentations/rex_methodologies.pdf) - *William Recart*
- [Mise en place des pratiques de qualité logicielle](présentations)
### <i class="fab fa-gitlab fa-fw" style="color:rgb(107,79,187); font-size:.85em" aria-hidden="true"></i>
# Documentation, tests et analyse
## Documentation
- [Gestion de la documentation](présentations/documentation.pdf) - *Julien Peloton*
- [Méthodologie : Retour d'expérience sur la gestion de la documentation](présentations/Rex-docs_MXT.pdf) - *Antoine Pérus*
- [Outils de test](présentations/outils_test.pdf) - *Cyril L'Orphelin*
- [Outils d’analyse et de mesure de la qualité du code](présentations/outils_analyse.pdf) - *Cyril L'Orphelin*
- [Outils de construction du code final, d'intégration et de déploiement continus](présentations/outils_cicd.pdf) - *Cyril L'Orphelin*
Présentations
==============
# Outils de partage de code, outils collaboratifs, intégration continue
- [Partage de code et plateformes collaboratives](présentations/outils_collaboratifs.pdf) - *Cyril L'Orphelin*
- [Processus de traitement de la qualité logicielle: outils et notion d'usine logicielle](présentations/usine_logicielle.pdf) - *Alexis Chatillon*
TP
===
# Retours d'expériences
## Tests
- [Exemple d'application aux projets IN2P3: LSST et les pipelines de données](https://docs.google.com/presentation/d/1uKlPSIXn-yEX7raPGadSvSbmO15373wd3Ip1XH6e68A/edit#slide=id.ga2f7fb1a1f_0_70) - *Jim Bosch*
- [Retour d’expérience INSU sur la qualité logicielle appliquée au sein du projet logiciel vol PLATO](présentations/rex_plato.pdf) - *Philippe Plasson*
- [Retour d'expérience IN2P3 : plateforme d'intégration continue pour le développement du pipeline de données EUCLID](présentations/rex_euclid.pdf) - *Antoinre Boizard*
- [Retour d'expérience INSU : environnement de développement, d’integration et de test développé pour le segment sol de l’instrument RPW de la mission Solar Orbiter](présentations/rex_INSU_RPW.pdf) - *Xavier Bonnin, Sonny Lion*
- [Cas du spatial et de l’embarqué : spécificités et impacts sur le processus de qualité logicielle, exemple avec le logiciel de vol du spectro-imageur MAJIS de la mission JUICEe](présentations/rex_majis.pptx)
Présentations
==============
# TPs
<hr/>
En clonant ce repository vous aurez toutes les ressources nécessaires pour les TPs. <br/>
Les identifiants nécessaires pour l'accès aux différents outils (Notebook Jupyter, SonarQube) sont disponibles dans :
<br/><code>Gitlab > Settings > CI-CD > Variables</code>
TP
===
## Usine logicielle - Intégration Continue
<hr/>
Présentations
==============
- [TP1 : Prise en compte des normes et bonnes pratiques](TP1/ReadMe.md)
- [TP2 : Partage de code](TP2/ReadMe.md)
- [TP3 : Gestion de la documentation](TP3/ReadMe.md)
- [TP4 : Tests et mesure de la qualité du code](TP4/ReadMe.md)
- [TP5 : Outils de construction du code final, d'intégration et de déploiement continus](TP5/ReadMe.md)
TP
===
<?xml version='1.0'?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="CUNIT_TEST_RUN_REPORT">
<html>
<head>
<title> CUnit - Automated Test Run Summary Report </title>
</head>
<body bgcolor="#e0e0f0">
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="CUNIT_HEADER">
<div align="center">
<h3>
<b> CUnit - A Unit testing framework for C. </b> <br/>
<a href="http://cunit.sourceforge.net/"> http://cunit.sourceforge.net/ </a>
</h3>
</div>
</xsl:template>
<xsl:template match="CUNIT_RESULT_LISTING">
<p/>
<div align="center">
<h2> Automated Test Run Results </h2>
</div>
<table cols="4" width="90%" align="center">
<tr>
<td width="25%"> </td>
<td width="25%"> </td>
<td width="25%"> </td>
<td width="25%"> </td>
</tr>
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="CUNIT_RUN_SUITE">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="SUITE_NAME">
</xsl:template>
<xsl:template match="CUNIT_RUN_SUITE_SUCCESS">
<tr bgcolor="#f0e0f0">
<td colspan="4">
Running Suite <xsl:value-of select="SUITE_NAME"/>
</td>
</tr>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="CUNIT_RUN_GROUP">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="CUNIT_RUN_GROUP_SUCCESS">
<tr bgcolor="#f0e0f0">
<td colspan="4">
Running Group <xsl:apply-templates/>
</td>
</tr>
</xsl:template>
<xsl:template match="CUNIT_RUN_TEST_RECORD">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="CUNIT_RUN_TEST_SUCCESS">
<tr bgcolor="#e0f0d0">
<td> </td>
<td colspan="2">
Running test <xsl:apply-templates/>...
</td>
<td bgcolor="#50ff50"> Passed </td>
</tr>
</xsl:template>
<xsl:template match="CUNIT_RUN_TEST_FAILURE">
<tr bgcolor="#e0f0d0">
<td> </td>
<td colspan="2">
Running test <xsl:value-of select="TEST_NAME"/>...
</td>
<td bgcolor="#ff5050"> Failed </td>
</tr>
<tr>
<td colspan="4" bgcolor="#ff9090">
<table width="100%">
<tr>
<th width="15%"> File Name </th>
<td width="50%" bgcolor="#e0eee0">
<xsl:value-of select="FILE_NAME"/>
</td>
<th width="20%"> Line Number </th>
<td width="10%" bgcolor="#e0eee0">
<xsl:value-of select="LINE_NUMBER"/>
</td>
</tr>
<tr>
<th width="15%"> Condition </th>
<td colspan="3" width="85%" bgcolor="#e0eee0">
<xsl:value-of select="CONDITION"/>
</td>
</tr>
</table>
</td>
</tr>
</xsl:template>
<xsl:template match="CUNIT_RUN_SUITE_FAILURE">
<tr>
<td colspan="3" bgcolor="#f0b0f0">
Running Suite <xsl:value-of select="SUITE_NAME"/>...
</td>
<td bgcolor="#ff7070">
<xsl:value-of select="FAILURE_REASON"/>
</td>
</tr>
</xsl:template>
<xsl:template match="CUNIT_RUN_GROUP_FAILURE">
<tr>
<td colspan="3" bgcolor="#f0b0f0">
Running Group <xsl:value-of select="GROUP_NAME"/>...
</td>
<td bgcolor="#ff7070">
<xsl:value-of select="FAILURE_REASON"/>
</td>
</tr>
</xsl:template>
<xsl:template match="CUNIT_RUN_SUMMARY">
<p/>
<table width="90%" rows="5" align="center">
<tr align="center" bgcolor="skyblue">
<th colspan="6"> Cumulative Summary for Run </th>
</tr>
<tr>
<th width="15%" bgcolor="#ffffc0" align="center"> Type </th>
<th width="17%" bgcolor="#ffffc0" align="center"> Total </th>
<th width="17%" bgcolor="#ffffc0" align="center"> Run </th>
<th width="17%" bgcolor="#ffffc0" align="center"> Succeeded </th>
<th width="17%" bgcolor="#ffffc0" align="center"> Failed </th>
<th width="17%" bgcolor="#ffffc0" align="center"> Inactive </th>
</tr>
<xsl:for-each select="CUNIT_RUN_SUMMARY_RECORD">
<tr align="center" bgcolor="lightgreen">
<td> <xsl:value-of select="TYPE" /> </td>
<td> <xsl:value-of select="TOTAL" /> </td>
<td> <xsl:value-of select="RUN" /> </td>
<td> <xsl:value-of select="SUCCEEDED" /> </td>
<td> <xsl:value-of select="FAILED" /> </td>
<td> <xsl:value-of select="INACTIVE" /> </td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template match="CUNIT_FOOTER">
<p/>
<hr align="center" width="90%" color="maroon" />
<h5 align="center"> <xsl:apply-templates/> </h5>
</xsl:template>
</xsl:stylesheet>
\ No newline at end of file
## Prises en compte des normes et bonnes pratiques
**Note** : Les différentes phases de ce TP se feront en groupe de 5 personnes. <br/>
L'intérêt du TP réside dans les échanges au sein du groupe et avec les formateurs
---
1. Ouvrez les fichiers du projet (<a href="TP1.py">TP1.py</a>, <a href="log1">log1</a> , <a href="log2">log2</a>, <a href="CUnit-Run.xsl">CUnit-Run.xsl</a> ) , analysez les et essayez de comprendre ce que doit faire le script principal **~15 min**
2. Les encadrants du TP vont expliquer ce que fait réellement le script **~10 min**
3. Avec les éléments des présentations précédentes, formulez une analyse critique du contenu du script **~ 15 min**
4. Discutez de ces retours avec les encadrants **~5-10 min**
5. Essayez de définir une méthodologie possible qui aurait dû être appliquée **~15 min**
---
**Bonus** : Réécrivez / adaptez une partie du script en appliquant les règles de la méthodologie définie précédemment
**Solution** : Vous trouverez une partie des réponses dans [cette présentation](td_explications.pdf)
import sys
import os
import re
import shutil
import time
os.system('cls')
verboseMode = False
ttpExtension=[]
ttpPath=[]
ttpIncrement=[]
srcAjout=[]
srcFiles = []
ttpLine =[]
folderNumber=[]
## Update input file by removing the reference to unexisting files
# @param log file
def extract(logFile):
# Check current working directory.
workingDir = os.getcwd()
#verbose
if verboseMode == True :
print "current working directory is "+workingDir
print "log in parameter is "+logFile
#Change relative path for sourcePathFile from logDirectory
logDirectory, logFileName = os.path.split(logFile)
#sourcePathFile = os.path.relpath(sourcePathFile,logDirectory)
# change the current directry for the directory of the input file
os.chdir(logDirectory)
#verbose
if verboseMode == True :
print "log directory is "+logDirectory
#create XML directory
path_XML_extract = os.path.join(logDirectory, "XML_extract")
# check if directory already exits
if os.path.isdir(path_XML_extract) :
# delete directory to remove all previous files
shutil.rmtree(path_XML_extract, ignore_errors = False)
#tempo avant de recreer le repertoire
time.sleep(1) # Sleep for 1 seconds
#create directory
os.mkdir(path_XML_extract)
#verbose
if verboseMode == True :
print path_XML_extract+" directory has been created"
# reading of the log file
countLine = 0
tmpFilePath = ""
with open(logFileName, 'r') as f:
xmlFileName =""
for line in f:
countLine += 1
# Search for xml header in log file <?xml version="1.0" ?>
matchXML = re.search('\<\?xml version\=\"1.0\" \?\>', line)
if matchXML is not None:
# create temporary file
tmpFilePath = os.path.normpath(path_XML_extract + "/tmp.xml")
with open(tmpFilePath, 'a') as tmpfile:
tmpfile.close()
if verboseMode == True :
print "<?xml version=\"1.0\" ?> found at line "+str(countLine)
# complete file
if(os.path.isfile(tmpFilePath)):
#line to be ignore
matchIgnore = re.search('\<\!DOCTYPE CUNIT_TEST_RUN_REPORT', line)
if matchIgnore is None:
with open(tmpFilePath, 'a') as tmpfile:
matchXMLName = re.search('\<SUITE_NAME\>', line)
if matchXMLName is not None:
getNext =0
a= line.split(" ")
for i in a :
if getNext == 1 :
xmlFileName = i
getNext = 0
if i == "<SUITE_NAME>":
getNext =1
tmpfile.write(line + "\n")
tmpfile.close()
# Search for xml tag </CUNIT_TEST_RUN_REPORT> (end of xml file)
matchEndXML = re.search('\<\/CUNIT_TEST_RUN_REPORT\>', line)
if matchEndXML is not None:
if verboseMode == True :
print "</CUNIT_TEST_RUN_REPORT> found at line "+str(countLine)
if tmpFilePath != "":
os.rename(tmpFilePath, path_XML_extract+"/"+xmlFileName+".xml")
tmpFilePath = ""
f.close()
if __name__ == "__main__":
# argument for debuging
#sys.argv=r"foo -v ..\log".split()
import getopt
help = '''unit_test_extract_xml.py [-v] log
extract xml unit test from jenkin build log.
-v verbose mode
-h print help'''
try:
opts, args = getopt.getopt(sys.argv[1:],"v")
except getopt.GetoptError:
print help
sys.exit(2)
# check that one parameter is defined
if len(args) != 1 :
if len(args) == 0 :
print "one argument needed"
if len(args) > 2 :
print "parameter "+str(args[1:])+" not managed"
print help
sys.exit(2)
else:
if not os.path.isfile(args[0]):
print "input "+str(args[0])+" is not an existing file"
print help
sys.exit(2)
logDirectory, logFileName = os.path.split(args[0])
if logFileName[-4:-1]!="log":
print "input file "+str(args[0:])+" is not the log file"
print help
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print help
sys.exit(2)
elif opt == '-v':
print " *** verbose mode activated"
verboseMode = True
extract(args[0])
<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="CUnit-Run.xsl" ?>
<CUNIT_TEST_RUN_REPORT>
<CUNIT_HEADER/>
<CUNIT_RESULT_LISTING>
<CUNIT_RUN_SUITE>
<CUNIT_RUN_SUITE_SUCCESS>
<SUITE_NAME> Leon3 BSP </SUITE_NAME>
<CUNIT_RUN_TEST_RECORD>
<CUNIT_RUN_TEST_SUCCESS>
<TEST_NAME> Test of leon3 bsp : initMyLibTrapTable </TEST_NAME>
</CUNIT_RUN_TEST_SUCCESS>
</CUNIT_RUN_TEST_RECORD>
</CUNIT_RUN_SUITE_SUCCESS>
</CUNIT_RUN_SUITE>
</CUNIT_RESULT_LISTING>
<CUNIT_RUN_SUMMARY>
<CUNIT_RUN_SUMMARY_RECORD>
<TYPE> Suites </TYPE>
<TOTAL> 1 </TOTAL>
<RUN> 1 </RUN>
<SUCCEEDED> - NA - </SUCCEEDED>
<FAILED> 0 </FAILED>
</CUNIT_RUN_SUMMARY_RECORD>
<CUNIT_RUN_SUMMARY_RECORD>
<TYPE> Test Cases </TYPE>
<TOTAL> 1 </TOTAL>
<RUN> 1 </RUN>
<SUCCEEDED> 1 </SUCCEEDED>
<FAILED> 0 </FAILED>
</CUNIT_RUN_SUMMARY_RECORD>
<CUNIT_RUN_SUMMARY_RECORD>
<TYPE> Assertions </TYPE>
<TOTAL> 18 </TOTAL>
<RUN> 18 </RUN>
<SUCCEEDED> 18 </SUCCEEDED>
<FAILED> 0 </FAILED>
</CUNIT_RUN_SUMMARY_RECORD>
</CUNIT_RUN_SUMMARY>
<CUNIT_FOOTER> File Generated By CUnit v2.1-0 at Thu Jan 1 00:00:00 1970
</CUNIT_FOOTER>
</CUNIT_TEST_RUN_REPORT>
<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="CUnit-Run.xsl" ?>
<CUNIT_TEST_RUN_REPORT>
<CUNIT_HEADER/>
<CUNIT_RESULT_LISTING>
<CUNIT_RUN_SUITE>
<CUNIT_RUN_SUITE_SUCCESS>
<SUITE_NAME> MlCache </SUITE_NAME>
<CUNIT_RUN_TEST_RECORD>
<CUNIT_RUN_TEST_SUCCESS>
<TEST_NAME> Test of MlCache::flushDataCache() </TEST_NAME>
</CUNIT_RUN_TEST_SUCCESS>
</CUNIT_RUN_TEST_RECORD>
<CUNIT_RUN_TEST_RECORD>
<CUNIT_RUN_TEST_SUCCESS>
<TEST_NAME> Test of MlCache::flushInstructionCache() </TEST_NAME>
</CUNIT_RUN_TEST_SUCCESS>
</CUNIT_RUN_TEST_RECORD>
<CUNIT_RUN_TEST_RECORD>
<CUNIT_RUN_TEST_SUCCESS>
<TEST_NAME> Test of MlCache::getInstructionCacheTagErrors() </TEST_NAME>
</CUNIT_RUN_TEST_SUCCESS>
</CUNIT_RUN_TEST_RECORD>
<CUNIT_RUN_TEST_RECORD>
<CUNIT_RUN_TEST_SUCCESS>
<TEST_NAME> Test of MlCache::getInstructionCacheDataErrors() </TEST_NAME>
</CUNIT_RUN_TEST_SUCCESS>
</CUNIT_RUN_TEST_RECORD>
<CUNIT_RUN_TEST_RECORD>
<CUNIT_RUN_TEST_SUCCESS>
<TEST_NAME> Test of MlCache::getDataCacheTagErrors() </TEST_NAME>