La gestion des versions pose souvent des difficultĂ©s, en particulier pour les projets impliquant des mises Ă  jour frĂ©quentes et diffĂ©rents intervenants. L’implĂ©mentation d’un flux de travail optimisĂ© avec semantic-release a pour effet de simplifier le processus de validation et d’assurer un versionnage et une distribution cohĂ©rents.

semantic-release est un outil open source populaire utilisĂ© pour automatiser le versionnage et la publication d’applications logicielles. Il reprend les principes du versionnage sĂ©mantique, dans lequel les numĂ©ros de version livrent des informations sur les changements de code. GrĂące Ă  semantic-release, les dĂ©veloppeur·euse·s peuvent se concentrer davantage sur l’écriture de code sans avoir Ă  se soucier autant de la gestion des versions.

Le flux de travail

ConsidĂ©rons l’ensemble d’un peu plus prĂšs. Nous commencerons par une brĂšve introduction du sujet, avant de montrer les problĂšmes que semantic-release permet de rĂ©soudre. Lorsque l’on travaille sur un projet de logiciel avec plusieurs dĂ©veloppeur·euse·s et des mises Ă  jour frĂ©quentes, il est indispensable d’adopter un processus de publication standardisĂ©. La gestion manuelle des numĂ©ros de version, la crĂ©ation de change logs et la publication sur plusieurs canaux de distribution peuvent prendre Ă©normĂ©ment de temps et entraĂźner des erreurs. semantic-release rĂ©sout ce problĂšme en automatisant des tĂąches Ă  l’aide de rĂšgles prĂ©dĂ©finies et de conventions de message d'engagement.

Pour illustrer le flux de travail, nous prendrons l’exemple d’un projet de package de nodes. Ce projet respecte les conventions Git Branching, les diffĂ©rentes branches reprĂ©sentant ainsi les diffĂ©rents stades de dĂ©veloppement. Nous avons des branches « feature » ou « fix » pour le dĂ©veloppement en cours, une branche « next » pour la prĂ©paration de la prochaine version et une branche « main » pour la version de production stable. Il est Ă©galement courant d’utiliser une branche « develop », mais dans notre cas, nous pouvons simplement installer une version prĂ©-release publiĂ©e comme dĂ©pendance dans nos autres applications.

Configurer un projet

Avant de configurer semantic-release pour notre projet de node package, nous devons installer les dĂ©pendances nĂ©cessaires. Nous utilisons l’outil « npm » pour exĂ©cuter la commande suivante :

npm install semantic-release @semantic-release/changelog @semantic-release/git

Nous configurons ensuite semantic-release en créant un fichier release.config.js dans le répertoire racine du projet. Ce fichier de configuration spécifie les rÚgles de publication, les plug-ins et autres paramÚtres spécifiques au projet.

Pour utiliser l’assistant de configuration et la configuration elle-mĂȘme, il faut utiliser la commande suivante :

semantic-release-cli setup

Voici un exemple de configuration de release.config.js :

module.exports = {
  branches: [
    'main’,
    { name: 'next', prerelease: true },
    { name: 'develop', prerelease: 'beta' },
  ],
  plugins: [
    '@semantic-release/commit-analyzer',
    '@semantic-release/release-notes-generator',
    '@semantic-release/changelog',
    ['@semantic-release/git', {
      assets: ['CHANGELOG.md'],
    }],
    '@semantic-release/npm',
  ],
};

Il est Ă©galement possible d’utiliser un fichier releaserc. Dans ce cas, la configuration serait la suivante :

{
  "branches": [
    "main",
    { "name": "next", "prerelease": true },
    { "name": "develop", "prerelease": "beta" },
  ],
  "plugins": [
    "@semantic-release/commit-analyzer",
    "@semantic-release/release-notes-generator",
    "@semantic-release/npm",
    [
      "@semantic-release/git",
      {
        "assets": ["package.json"],
        "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
      }
    ]
  ]
}

Dans cette configuration, trois branches sont dĂ©finies : « main » pour les versions stables, « next » pour les prĂ©-versions et « develop » pour le dĂ©veloppement en cours. D’autre part, on dĂ©finit les plug-ins nĂ©cessaires Ă  l’analyse des engagements, Ă  la crĂ©ation des notes de version et des change logs, Ă  la publication sur GitLab et Ă  la publication sur « npm ».

Une fois la configuration de semantic-release achevĂ©e, il est possible d’utiliser les commandes permettant d’automatiser la gestion de publication. Voici les commandes semantic-release les plus utilisĂ©es :

semantic-release

Cette commande engage le processus de diffusion. Elle analyse l’historique des engagements, dĂ©termine la version appropriĂ©e en fonction des rĂšgles de versionnage sĂ©mantique, gĂ©nĂšre des notes de version et des change logs, met Ă  jour la version du package et publie la version sur le canal de distribution indiquĂ©.
En rĂšgle gĂ©nĂ©rale, on procĂšde Ă  un test avant la publication. Pour cela, on utilise l’option « --dry-run » aprĂšs la commande ou on attribue la valeur « true » Ă  la propriĂ©tĂ© dryRun dans la configuration ci-dessus.

semantic-release-cli setup

Cette commande mÚne vers un assistant de configuration qui aide à créer le fichier « release.config.js » et à configurer semantic-release pour le projet.

Configurer l’intĂ©gration continue

En plus des commandes, l’intĂ©gration de semantic-release avec Continuous-Integration (CI) amĂ©liore encore davantage le processus d’automatisation des diffusions. En dĂ©clenchant semantic-release pour certains Ă©vĂ©nements – par exemple le dĂ©placement de modifications vers certaines branches ou la fusion de pull requests – on peut ĂȘtre sĂ»r que les diffusions seront automatiquement dĂ©clenchĂ©es et mises Ă  disposition.

Si on utilise par exemple des services de CI courants tels que Travis CI ou GitHub Actions, il est possible de configurer le pipeline de CI de sorte que la commande semantic-release soit exĂ©cutĂ©e sur les branches correspondantes aprĂšs des builds rĂ©ussis. Ainsi, semantic-release sera dĂ©clenchĂ© chaque fois que de nouvelles modifications sont enregistrĂ©es, ce qui a pour effet d’automatiser le processus de diffusion.

De plus amples informations sur la configuration avec différents services CI sont disponibles dans la documentation semantic-release.

Une fois la configuration achevée, semantic-release analyse automatiquement les engagements, détermine la prochaine version appropriée en fonction des rÚgles de versionnage sémantique, crée des notes de version et des change logs, met à jour la version du package et publie la version via les canaux de distribution spécifiés.

Conclusion

On peut dire que la mise en place d’un flux de dĂ©veloppement avec semantic-release permet d’automatiser et de simplifier les processus de diffusions complexes dans le cadre de projets logiciels. Une fois configurĂ©, semantic-release prend en charge la gestion des versions, la crĂ©ation de change logs et la publication. De cette maniĂšre, les dĂ©veloppeur·euse·s peuvent se concentrer sur l’écriture du code et assurer un cycle de diffusion fluide.

Cet exemple montre comment semantic-release est configurĂ© pour un exemple de projet et les avantages qu’il prĂ©sente pour la gestion de flux de travail complexes pour la diffusion. En respectant les conventions et les meilleures pratiques de semantic-release, il est possible d’amĂ©liorer considĂ©rablement le processus de dĂ©veloppement et de fournir sans problĂšme des logiciels de qualitĂ©.

Il ne faut pas oublier toutefois que la configuration doit ĂȘtre adaptĂ©e aux contraintes spĂ©cifiques du projet et aux canaux de distribution. L’intĂ©gration de semantic-release Ă  la boĂźte Ă  outils de dĂ©veloppement permet de rendre les processus de diffusion plus efficaces, plus uniformes et plus fluides.

La documentation de semantic-release contient des informations et des instructions complémentaires pour répondre à différentes configurations et utilisations.