Ouvrir le menu Fermer le menu

Générer des livrables fiables avec Jenkins

trait de séparation
Temps de lecture : 8 minutes

Pour maximiser la compatibilité avec l’environnement de production, certaines applications ou exigences clients peuvent nécessiter l’utilisation d’une machine de génération spécifique. Cette approche permet de standardiser les versions des outils de génération et de s’assurer que les livrables fonctionneront de manière optimale sur les machines cibles.

Afin d’atteindre cet objectif, il est recommandé de développer et de générer les logiciels sur un système d’exploitation identique à celui utilisé en production. Pour ce faire, nous mettons généralement en place une machine dédiée, qui est équipée des outils nécessaires à la génération et au packaging des logiciels.

Pourquoi industrialiser ?

Dans un contexte où l’optimisation des coûts et l’efficacité opérationnelle sont cruciaux, il est essentiel de limiter les interventions manuelles, surtout pour des tâches à faible valeur ajoutée. Si la génération d’une release est une étape indispensable, les étapes de génération intermédiaires le sont beaucoup moins. Néanmoins, il est important de s’assurer régulièrement que l’application est correctement compilée et empaquetée, en particulier dans un environnement où plusieurs développeurs contribuent simultanément au même code source.

Ainsi, l’utilisation d’une machine dédiée qui nécessite l’intervention manuelle des développeurs pour créer les livrables va à l’encontre de cet objectif. Cela pose encore plus de problèmes dans les projets complexes, où la génération peut prendre entre 15 et 30 minutes !

Quelles-sont les solutions ?

Heureusement, cette problématique n’a pas échappé à la communauté informatique qui a créé diverses solutions pour répondre à ce besoin. Certaines sont propriétaires et imposent une exposition sur Internet, comme GitHub action ou CircleCI. D’autres sont plus respectueuses des politiques de confidentialité, et permettent d’héberger les solutions directement sur une infrastructure privée. Nous retrouvons alors les produits comme GitLab ou Jenkins. Quelle que soit la situation, ces solutions permettent aux équipes de développement de définir des pipelines qui automatisent diverses opérations, y compris le processus de génération.

Intégration avec Jenkins

L’infrastructure privée sur laquelle notre équipe intervient propose les outils GitLab et Jenkins. Cependant, la DSI privilégie Jenkins pour l’exécution de pipelines. Ils mettent donc à disposition des équipes projets des nœuds génériques. Cependant, la criticité du logiciel que nous développons nécessite une machine de génération avec un système d’exploitation et des outils précis.

Pour rentrer dans les détails, nous déployons l’application sur une machine Linux RedHat 8 64 bits, et elle se décompose en trois modules :
  • Un module écrit en C pour réaliser des calculs lourds, ou pour appeler des API système ;
  • Un second écrit en Java capable de communiquer avec le module C, et qui réalise les traitements de gestion ;
  • Un dernier pour le frontend écrit en JavaScript, HTML et CSS. Il expose à un tableau de bord qui présente les résultats de traitement des processus C et Java.
L’application doit donc être générée manuellement sur une machine virtuelle (VM) où sont installés le système d’exploitation RedHat 8, et les outils de compilation de chaque module (make, gcc, maven, node).

Afin d’automatiser les tâches de génération sur cette machine, nous devons déclarer cette VM comme slave Jenkins. Elle pourra alors exécuter les pipelines de génération spécifiques à ce logiciel.

Note : Si votre DSI privilégie l’utilisation des GitLab Runner plutôt que Jenkins, sachez qu’il est également possible de définir vos propres runners en utilisant une machine dédiée plutôt que les runners génériques.

De la Configuration de la VM ( installation de Java 11, user Jenkins) , à la déclaration de l'agent (création, configuration du noeud ) jusqu'à l'Installation de l’agent ( Déploiement, test et gestion de l’agent) : découvrez l'intégration détaillée ici

Conclusion

Dans un contexte où la sécurité et l’isolation des processus sont des préoccupations majeures, l’utilisation d’une machine dédiée est parfois indispensable pour la génération de logiciels. Lorsque l’équipe de développement souhaite adopter une approche DevOps, l’intégration et la livraison continue sont des pratiques centrales qui requièrent la mise en place de pipelines automatisés.

La procédure précédente détaille comment transformer une machine Linux dédiée à la génération, en un slave Jenkins. Cet agent est capable de répondre aux attentes d’automatisation d’une équipe projet pour laquelle les contraintes de génération sont importantes.
Cependant, l’utilisation de Jenkins pour ajouter des agents peut s’avérer difficile, car elle nécessite une collaboration étroite avec l’administrateur du master Jenkins. Cette problématique est moins prononcée avec d’autres solutions telles que les GitLab Runner, qui offrent une plus grande autonomie dans la gestion des agents.

En conclusion, il est essentiel d’évaluer l’opportunité d’interfacer des machines spécifiques avec un ordonnanceur. Un tel système peut contribuer à l’automatisation d’une partie du cycle de livraison d’une application. La décision d’intégrer cette technologie doit être prise en considérant les objectifs spécifiques de l’organisation, et les compétences techniques de l’équipe en matière de pratiques DevOps.

0

Ces articles peuvent vous intéresser

image blog article

Analyse Statique grâce aux outils SAST et SCA

Replay des webinars à la demande !

image blog article

Accélérer l’analyse SAST

Pourquoi équilibrer les résultats et les ressources des tests de sécurité des applications est-ce important ?