Scripts de gestion de configuration et de versions

Objectifs

La gestion de configuration consiste à gérer la description technique d’un système (et de ses divers composants), ainsi qu’à gérer l’ensemble des modifications apportées au cours de l’évolution du système.

Remarque : Pour le code source, celle-ci est réalisée à l’aide de logiciels de gestion de versions (subversion par exemple).

De manière générale dans un projet, la gestion de configuration permet d’identifier et de suivre la configuration (logicielle et matérielle) sur laquelle le système livrée fonctionne. Cela permettra par exemple de recréer son environnement de fonctionnement en cas de problème.

Ici, on se limitera à identfier les dépendances et les versions des outils et composants logiciels nécessaire au système réalisé.

Usage

On vous fournit trois scripts :

  • configuration.sh : identifie les caractéristiques techniques de la machine et de l’exécutable du projet et produit un fichier configuration.txt regroupant les informations essentielles
  • version.sh : identifie les versions des outils utilisés dans le projet et produit un fichier version.txt regroupant les informations essentielles
  • config.sh : regroupe en un seul script les deux précédents

Exemple sur un poste de développement :

$ ./configuration.sh ../src/Aquaberry/Aquaberry

Génère un fichier de configuration pour un exécutable
GNU GPL (C) 2016 Thierry Vaira <tvaira@free.fr> BTS SN-IR

Informations sur l'ordinateur

Distribution : Ubuntu 12.04.5 LTS
OS : GNU/Linux
Noyau : Linux
Version : 3.8.0-44-generic
Processeur : Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
Mémoire : 8129984 kB
Machine : x86_64

Informations sur l'exécutable

Nom : Aquaberry
Taille : 187270 octets (188k/183K)
Format : ELF 64-bit LSB executable
Machine : x86-64
Edition des liens : dynamique
OS : GNU/Linux 2.6.24

Continuer ? [O/n/q] 


Recherche des dependances sur les bibliotheques

libQtSql.so.4 => libqt4-sql
libQtGui.so.4 => libqtgui4
libQtCore.so.4 => libqtcore4
libpthread.so.0 => libc6
libstdc++.so.6 => libstdc++6-armel-cross
libgcc_s.so.1 => gcc-4.6-arm-linux-gnueabi
libc.so.6 => libc6-armel-cross
libfontconfig.so.1 => libfontconfig1
libaudio.so.2 => libaudio2
libglib-2.0.so.0 => libglib2.0-0
libpng12.so.0 => libpng12-0
libz.so.1 => zlib1g
libfreetype.so.6 => libfreetype6
libgobject-2.0.so.0 => libglib2.0-0
libSM.so.6 => libsm6
libICE.so.6 => libice6
libXi.so.6 => libxi6
libXrender.so.1 => libxrender1
libXext.so.6 => libxext6
libX11.so.6 => libx11-6
libm.so.6 => libc6-armel-cross
libdl.so.2 => libc6-armel-cross
librt.so.1 => libc6-armel-cross
/lib64/ld-linux-x86-64.so.2 => libc6
libexpat.so.1 => libexpat1
libXt.so.6 => libxt6
libXau.so.6 => libxau6
libpcre.so.3 => libpcre3
libffi.so.6 => libffi6
libuuid.so.1 => libuuid1
libxcb.so.1 => libxcb1
libXdmcp.so.6 => libxdmcp6

Toutes les dependances sont resolues par des paquets

Liste des paquets Qt nécessaires

libqt4-sql
libqtgui4
libqtcore4

Liste des autres paquets nécessaires

libc6
libstdc++6-armel-cross
gcc-4.6-arm-linux-gnueabi
libc6-armel-cross
libfontconfig1
libaudio2
libglib2.0-0
libpng12-0
zlib1g
libfreetype6
libglib2.0-0
libsm6
libice6
libxi6
libxrender1
libxext6
libx11-6
libc6-armel-cross
libc6-armel-cross
libc6-armel-cross
libc6
libexpat1
libxt6
libxau6
libpcre3
libffi6
libuuid1
libxcb1
libxdmcp6

Fichier configuration.txt génèré le samedi 21 mai 2016, 07:16:55 (UTC+0200)

Exemple sur un poste de développement :

$ ./version.sh ../src/Aquaberry/Aquaberry

...

Voulez-vous ajouter les versions des outils [O/n/q] 

g++ ? [O/n/q] 
g++ => g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

qmake ? [O/n/q] 
qmake => QMake version 2.01a

make ? [O/n/q] 
make => GNU Make 3.81

gdb ? [O/n/q]
gdb => GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04

svn ? [O/n/q] 
svn => svn, version 1.6.17 (r1128011)

geany ? [O/n/q] 
geany => geany 1.24.1 (construit le May 20 2014 avec GTK 2.24.10, GLib 2.32.4)

pandoc ? [O/n/q] 
pandoc => pandoc 1.9.1.1

espeak ? [O/n/q] 
espeak => eSpeak text-to-speech: 1.46.02  06.Jan.12  Data at: /usr/share/espeak-data

mysql ? [O/n/q] 
mysql => mysql  Ver 14.14 Distrib 5.5.49, for debian-linux-gnu (x86_64) using readline 6.2

moc ? [O/n/q] 
moc => Qt Meta Object Compiler version 63 (Qt 4.8.1)

qtcreator ? [O/n/q] 
qtcreator => Qt Creator 2.4.1 based on Qt 4.8.1

sqlite3 ? [O/n/q] 
sqlite3 => 3.7.9 2011-11-01 00:52:41 c7c6050ef060877ebe77b41d959e9df13f8c9b5e

cppunit-config ? [O/n/q] 
cppunit-config => 1.12.1

doxygen ? [O/n/q] 
doxygen => 1.7.6.1

Voulez-vous ajouter les versions des outils bouml papyrus planner [O/n/q] 

bouml ? [O/n/q] 
bouml => Bouml 4.23

papyrus ? [O/n/q] 
papyrus => Papyrus 1.1.3

planner ? [O/n/q] 
planner => Planner 0.14.5

Fichier version.txt génèré le samedi 21 mai 2016, 07:18:21 (UTC+0200)

Les dépendances sur les bibliothèques dynamiques (voir plus loin) peuvent être représentées dans un diagramme de composants en UML :

Principe

Les informations sur la machine et l’exécutable sont obtenues sous GNU/Linux en utilisant les commandes et fichiers suivants :

  • uname
  • file
  • type
  • ldd
  • dpkg
  • les fichiers /etc/lsb-release, /etc/os-release, /proc/cpuinfo et /etc/meminfo

Pour obtenir les informations de versions, on utilise l’option --version ou -v des outils utilisés.

La commande ldd affiche les bibliothèques partagées nécessaires pour le programme (ou bibliothèques) passé en argument de la commande :

$ ldd sai
    linux-vdso.so.1 =>  (0x00007fffb4aff000)
    libQtSql.so.4 => /usr/lib/x86_64-linux-gnu/libQtSql.so.4 (0x00007f45e0ec6000)
    libQtGui.so.4 => /usr/lib/x86_64-linux-gnu/libQtGui.so.4 (0x00007f45e01f8000)
    libQtNetwork.so.4 => /usr/lib/x86_64-linux-gnu/libQtNetwork.so.4 (0x00007f45dfeab000)
    libQtCore.so.4 => /usr/lib/x86_64-linux-gnu/libQtCore.so.4 (0x00007f45df9d9000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f45df6d9000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f45df3dc000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f45df1c6000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f45dee08000)
...

Les fichiers .so (shared object) sous GNU/Linux sont des bibliothèques à lien dynamique. Les bibliothèques listées ici sont considérées comme des dépendances du programme à exécuter.

La commande dpkg est le gestionnaire de paquet pour Debian. L’option -S (ou --search) affiche tous les paquets contenant le fichier indiqué en tant que critère de recherche.

$ dpkg -S libQtSql.so.4
libqt4-sql: /usr/lib/x86_64-linux-gnu/libQtSql.so.4

Bibliothèques logicielles

Les bibliothèques logicielles se distinguent des exécutables dans la mesure où elles ne représentent pas une application. Elles ne sont pas complètes, elles ne possèdent pas l’essentiel d’un programme comme une fonction principale (main) et par conséquent ne peuvent pas être exécutées directement. Les bibliothèques logicielles regroupent uniquement des fonctions (ou la définition de classes logicielles en POO).

Pour que le code exécutable puisse accéder aux instructions d’une fonction d’une bibliothèque qu’il utilise, il faut que chaque appel de fonction dans le code soit associé à l’adresse effective de la première instruction de la fonction appelée dans la bibliothèque.

L’édition de liens (linker) assure la mise en place, dans le code exécutable de l’application, des instructions de branchement vers les fonctions externes (issues d’une ou de plusieurs bibliothèques).

Si l’édition de lien est dynamique, un chargeur intervient permettant, lors de l’exécution du programme, d’amener en mémoire les fonctions des bibliothèques utilisées, de sorte que lorsqu’une fonction est appelée, son code soit disponible en mémoire.

Si l’édition est statique, le code des fonctions utilisées par l’application est intégré au code de l’application qui devient donc autonome.

Une bibliothèque à lien dynamique (Dynamic Link Library) aura pour extension .dll pour Windows et .so (shared object) sous GNU/Linux.

Les avantages des bibliothèques dynamiques sont :

  • la réduction de la taille d’un exécutable, puisque certaines parties du logiciel se situent en dehors,
  • et la mise à jour possible des fonctions utiles pour toutes les applications qui les utilisent. Les applications bénéficient alors automatiquement des corrections ou des améliorations fonctionnelles de la bibliothèque.

Une bibliothèque dynamique est donc utilisée à l’exécution de l’application. Une bibliothèque à lien statique est utilisée à la fabrication de l’exécutable et intégrée à celui-ci.

Paquets

Un paquet ou parfois paquetage (package) est une archive (souvent compressée) comprenant les fichiers, les informations et procédures nécessaires à l’installation d’un logiciel (ou bibliothèques, …) sur un système d’exploitation en s’assurant de la cohérence fonctionnelle du système ainsi modifié.

L’utilisation d’un paquetage logiciel est un élément constitutif d’une bonne pratique d’intégration logicielle.

deb est le format de fichier des paquets logiciels de la distribution Debian GNU/Linux. Presque toutes les distributions basées sur Debian utilisent aussi ce format (Ubuntu par exemple).

Voir aussi :

  • rpm (Red Hat Package) est un système de gestion de paquets de logiciels utilisé sur certaines distributions GNU/Linux. C’est le format utilisé par Linux Standard Base (LSB)

  • Pacman (contraction de package-manager) est le gestionnaire de paquets officiel de la distribution Linux Arch Linux. Pacman utilise des archives .tar.gz, .bz2 ou .xz pour ses paquets

  • tgz (fichier archive créé avec tar et ensuite compressé généralement avec gzip). Généralement, la procédure est la suivante : ./configure, make, make install

  • msi pour les fichiers d’installation pour Windows Installer

Sous GNU/Linux, les paquets sont généralement distribués par le réseau Internet sous forme de mirroirs ce qui rend l’installation de logiciels pratiquement transparente.