DEV Community

Cover image for Publicación de paquetes npm turborepo, trusted publisher, pnpm

Publicación de paquetes npm turborepo, trusted publisher, pnpm

Hace una semana me di a la tarea de hacer un update a mi monorepo personal (aún seguimos trabajando en ello).

Dentro de todas las tareas tuve que realizar la de publicar paquetes fue de las más complicadas y vengo a explicarles un poco del porque puede ser complejo.

Old way

Mi proceso anterior era bastante simple:

  • Entrar a npmjs.
  • Generar un token de acceso.
  • Agregar el token a tu proceso de publicación.
  • Crear la env var de NPM_TOKEN y el GITHUB_TOKEN a semantic-release.

Y listo, pero se cambiaron ciertas políticas de seguridad en npmjs que ahora sugiere el uso de trusted publishing para la publicación usando OpenID Connect en lugar de un token tradicional.

Configuración de trusted publishing

Antes de crear la configuración del trusted publisher en npmjs, tu paquete debe existir en npmjs si o si.

En el caso de que vayas a publicar un paquete nuevo, lo que debes hacer es una publicación manual (pnpm publish --tag dummy) o usar una herramienta llamada setup-npm-trusted-publish.

Ahora debes acceder a la sección de configuración de tu paquete en https://www.npmjs.com/package/<package-name/access o https://www.npmjs.com/package/<scope>/<package-name/access. Después debes agregar los datos de tu trusted publisher (github o gitlab).

Debe aparecerte algo similar a esto:
Seleccionando trusted publisher

Una vez seleccionado solo hay que llenar datos:

  1. Organización o usuario
  2. Repositorio
  3. Nombre del archivo de tu workfflow (incluyendo extensión). Nota: este debe estar dentro de tu folder de .github/workflows .

Form de trusted publisher

En mi caso fue:

  1. dezkareid
  2. dezkareid
  3. ci-packages.yml

Listo ya la configuración esta completa, ahora hay que realizar la configuración de nuestro publisher en nuestro workflow.

Configuración de trusted publishing en Github Action

Lo primero que necesitamos es configurar los permisos en nuestro job

permissions:
  id-token: write
Enter fullscreen mode Exit fullscreen mode

Estrictamente solo necesitamos el permiso de id-token para la conexión usando OpenID Connect y podríamos usar npm publish, pero como uso semantic-release para subir el tag a github y el changelog, entre otras cosas. Mi configuración es la siguiente:

permissions:
  contents: write
  issues: write
  pull-requests: write
  id-token: write
Enter fullscreen mode Exit fullscreen mode

Aquí hay un ejemplo de un action que usa esta configuración.

Mi configuración de semantic-release

{
  "plugins": [
    "@semantic-release/commit-analyzer",
    "@semantic-release/release-notes-generator",
    "@semantic-release/changelog",
    "@semantic-release/npm",
    [
      "@semantic-release/git",
      {
        "assets": [
          "CHANGELOG.md"
        ]
      }
    ],
    "@semantic-release/github"
  ]
}
Enter fullscreen mode Exit fullscreen mode

En esta parte tuve algunos problemas debido a mi arquitectura y a mi stack.

Yo uso una arquitectura de monorepo y no de polirepo, eso agrega complejidad ya que debes ubicarte especificamente en el proyecto que debes publicar. Ademas de que estoy usando pnpm entonces ocurrió algo raro que me pedía autenticarme. Al ser un monorepo uso workspaces y no de manejan de la misma manera usando npm que pnmp.

Entre los problemas que enfrente fueron los siguientes:

  1. Capa 8, no agregué correctamente el nombre del archivo de mi workflow, me di cuenta de esto porque al tratar de publicar el plugin de npm verifica si el OpenID connect esta bien configurado y me decía que no encontraba la configuración.

  2. Tenía un comando release usando que era ejecutado directamente por turborepo, el problema es que este aplica un filtro de variables de entorno y debes indicar explicitamente cuales necesitas. Lo solucioné usando el folder con el cambio como working directory y ejecutando semantic-release directamente

  3. El plugin de semantic release de npm no estaba funcionando, el problema no era el plugin sino mi stack. Al parecer había un detalle de como se manejaba la autenticación, la documentación de las herramientas por lo regular contempla que estes usando npm pero a bajo nivel puede ser que aunque tengas una herramienta que funcione de manera similar no siempre va a funcionar con tu stack. La solución fue instalar el plugin @anolilab/semantic-release-pnpm.

Mi configuración quedó de la siguiente manera

{
  "plugins": [
    "@semantic-release/commit-analyzer",
    "@semantic-release/release-notes-generator",
    "@semantic-release/changelog",
    "@anolilab/semantic-release-pnpm",
    [
      "@semantic-release/git",
      {
        "assets": [
          "CHANGELOG.md"
        ]
      }
    ],
    "@semantic-release/github"
  ],
  "extends": "semantic-release-monorepo"
}
Enter fullscreen mode Exit fullscreen mode

Y con esto ahora ya puedo publicar paquetes nuevamente usando mi stack preferido. Te dejo mi workflow para que puedas observarlo y si te sirve lo puedas replicar :D

Top comments (0)