Automatiser la génération de changelogs et la publication sur npm depuis GitHub Actions sans se perdre dans des scripts maison, c'est l'un de ces petits gains de productivité qui payent sur le long terme. J'ai testé plusieurs approches et, dans cet article, je partage des méthodes simples et robustes que j'utilise pour garder un workflow clair : peu de scripts, beaucoup d'actions réutilisables. Je pars du principe que vous avez un package JavaScript/TypeScript dans un repo GitHub et que vous voulez publier automatiquement quand une release est créée ou quand un commit suit une convention.

Pourquoi éviter les scripts complexes

Les scripts personnalisés finissent souvent par accumuler des cas particuliers : gestion des versions, génération de notes, formatting du changelog, erreurs d'authentification. En s'appuyant sur des actions maintenues par la communauté (ou par les équipes qui créent ces outils), on gagne en fiabilité et en lisibilité du pipeline. De plus, les actions bien conçues prennent déjà en compte la plupart des bonnes pratiques (sécurité des tokens, compatibilité Node, retries, etc.).

Deux approches simples

Selon le niveau d'automatisation souhaité et votre discipline de commits, je recommande l'une des deux approches suivantes :

  • Approche "tout automatique" : semantic-release — analyse vos commits (conventionnels), bump la version, publie le changelog sur GitHub et publie sur npm.
  • Approche "contrôlée" : Release Drafter ou release-please pour préparer automatiquement les notes de release, puis une action dédiée pour publier sur npm quand vous validez la release.
  • Pré-requis

    Avant tout :

  • Utiliser des commits structurés est fortement recommandé (conventional commits : feat/fix/chore, etc.). Cela facilite la génération automatique de changelogs et le bump de version.
  • Configurer vos secrets GitHub : NPM_TOKEN (token d'accès npm) et, le cas échéant, utiliser GH_TOKEN ou le GITHUB_TOKEN fourni par GitHub Actions.
  • Avoir un fichier package.json valide et, si vous publiez des packages scoped, vérifier les permissions et le publishConfig si nécessaire.
  • Approche 1 — semantic-release (max d'automatisation, peu de configuration)

    semantic-release est un outil éprouvé qui analyse vos commits, calcule la nouvelle version (semver), génère les notes de release, met à jour le changelog et publie sur npm et GitHub. L'intérêt : vous n'avez presque rien à écrire côté scripts.

    Étapes clés :

  • Installer semantic-release (ou utiliser l'action GitHub officielle).
  • Configurer des plugins si besoin (ex : @semantic-release/release-notes-generator, @semantic-release/changelog, @semantic-release/npm, @semantic-release/github).
  • Assurer la discipline de commit conventional-commit.
  • Exemple minimal de workflow GitHub Actions :

    name: Releaseon:  push:    branches:      - mainjobs:  release:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4        with:          fetch-depth: 0      - name: Setup Node        uses: actions/setup-node@v4        with:          node-version: 18          registry-url: https://registry.npmjs.org/      - name: Install dependencies        run: npm ci      - name: semantic-release        env:          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}        run: npx semantic-release

    Points importants :

  • fetch-depth: 0 est nécessaire pour accéder à l'historique des commits.
  • Vous pouvez remplacer le run par l'action dédiée semantic-release/semantic-release-action si vous préférez.
  • NPM_TOKEN doit être un token d'accès automatique (npm create token), avec la permission de publier pour votre scope.
  • Approche 2 — Release Drafter / release-please + publication npm (plus de contrôle)

    Si vous préférez préparer une release (et l'éditer manuellement) avant de la publier, Release Drafter ou release-please sont parfaits. Ils génèrent automatiquement un brouillon de release à chaque fusion en main en regroupant les PR par type. Ensuite, vous pouvez déclencher une publication npm via un workflow qui s'exécute lorsque la release GitHub est publiée (manuellement ou via un tag).

    Exemple : utiliser Release Drafter pour créer les notes, puis une action pour publier sur npm lors d'une release publiée :

    # .github/workflows/release-publish.ymlname: Publish on Releaseon:  release:    types: [published]jobs:  publish:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4      - name: Setup Node        uses: actions/setup-node@v4        with:          node-version: 18          registry-url: https://registry.npmjs.org/      - name: Install deps        run: npm ci      - name: Publish to npm        env:          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}        run: npm publish --access public

    Pour la génération automatique des notes :

  • Release Drafter : facile à configurer via un fichier .github/release-drafter.yml. Il crée un draft release automatiquement.
  • release-please : crée des release PRs ou tags automatiques si vous voulez la version bump automatique mais avec étapes révisables.
  • Conseils pratiques et pièges fréquents

    Voici quelques détails qui m'ont fait gagner du temps :

  • Ne publiez pas sur npm depuis fork CI — GitHub Actions provenant de forks n'ont pas accès aux secrets, donc la publication échouera. Limitez les triggers à des branches protégées ou aux releases.
  • Vérifiez le package.json — fields comme private ou publishConfig.access peuvent bloquer la publication ou la modifier.
  • Utilisez NODE_AUTH_TOKEN pour npm publish — actions/setup-node et npm utilisent ce token pour l'auth automatique.
  • Gestion des versions — si vous n'utilisez pas semantic-release, définissez clairement quand bumper (manuellement ou via release-please).
  • Monorepo ? — semantic-release et release-please ont des plugins/stratégies monorepo. Sinon, publiez paquet par paquet avec des workflows parallèles.
  • Security — limitez la portée des tokens npm et révoquez-les si besoin. Pour GitHub, préférez le GITHUB_TOKEN interne quand c'est possible.
  • Exemples de configuration de commit

    Adopter conventional commits facilite énormément l'automatisation. Voici un mini guide que je recommande :

  • feat: pour une nouvelle fonctionnalité (bump majeur si breaking).
  • fix: pour une correction (bump patch).
  • perf:, docs:, chore:, ci: pour le reste.
  • Pour aider l'équipe à respecter ce format, j'installe parfois commitlint + husky pour valider les messages en pré-commit. C'est un investissement initial qui paie lorsqu'on active semantic-release.

    Checklist rapide avant de lancer l'automatisation

    Conventional commitsOui / Non
    Secret NPM_TOKEN configuréOui / Non
    Workflow GitHub pour release définiOui / Non
    fetch-depth: 0 sur checkoutOui / Non
    package.json correctement configuréOui / Non

    Si vous avez déjà un workflow en place et que vous voulez que je regarde un YAML particulier, envoyez-le et je vous propose des ajustements concrets. J'aime bien simplifier ces pipelines pour qu'ils restent compréhensibles par toute l'équipe — moins de scripts maison, plus d'actions standardisées.