# Publication du paquet @johanleroy/git-arboretum sur le registre npm du Gitea, # déclenchée UNIQUEMENT par un tag vX.Y.Z (jamais sur un push de branche). name: Release on: push: # `v[0-9]*` (et non `v*`) : sinon ce workflow capture aussi les tags `vscode-v*` de l'extension # : il stripperait alors `v` (→ `scode-v0.1.0`) et échouerait contre la version du daemon. tags: ['v[0-9]*'] permissions: contents: read packages: write jobs: publish: name: Publish to Gitea npm registry runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 registry-url: 'https://git.lidge.fr/api/packages/johanleroy/npm/' scope: '@johanleroy' cache: npm - run: npm ci - run: npm run build # Garde-fou : le tag (sans le "v") doit correspondre à la version du paquet. # GITHUB_REF_NAME est une variable d'env du runner (pas d'interpolation ${{ }} dans le shell). - name: Verify tag matches package version run: | pkg=$(node -p "require('./packages/server/package.json').version") tag="${GITHUB_REF_NAME#v}" if [ "$pkg" != "$tag" ]; then echo "ERREUR: tag '$tag' != version paquet '$pkg'" exit 1 fi echo "OK: tag $tag == version $pkg" # Publication idempotente : le signal faisant autorité d'une version déjà présente est le # 409 « already exists » renvoyé par npm publish lui-même (npm view est non fiable contre le # registre npm de Gitea : faux négatif masqué par >/dev/null). On tente toujours le publish ; # un 409 = succès idempotent, tout autre échec reste fatal. Le shell Actions tourne en # `bash -eo pipefail` : on isole l'échec attendu dans la condition d'un `if` pour ne pas # déclencher `set -e`. Le secret du registre est mappé sur NODE_AUTH_TOKEN lu par le .npmrc # de setup-node. - name: Publish (idempotent, tolère un 409 « already exists ») run: | if out="$(npm publish -w @johanleroy/git-arboretum 2>&1)"; then printf '%s\n' "$out" echo "Publication réussie." else code=$? printf '%s\n' "$out" if printf '%s' "$out" | grep -qiE 'E409|409 Conflict|already exists'; then echo "::notice::Version déjà présente sur le registre (409) : publication idempotente, étape ignorée." else echo "::error::Échec de la publication (code $code)." exit "$code" fi fi env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} # SBOM (transparence supply-chain entreprise) : généré pour le paquet publié et exposé en # artefact. C'est un bonus : un échec de génération/upload ne doit jamais faire rougir une # release dont le publish a réussi → continue-on-error. # upload-artifact@v3 : Gitea Actions (GHES-like) ne supporte pas @v4 (@actions/artifact v2+). - name: Generate SBOM (CycloneDX) continue-on-error: true run: npx --yes @cyclonedx/cyclonedx-npm --omit dev --output-format JSON --output-file sbom.json -w @johanleroy/git-arboretum || npx --yes @cyclonedx/cyclonedx-npm --omit dev --output-format JSON --output-file sbom.json - uses: actions/upload-artifact@v3 continue-on-error: true with: name: sbom path: sbom.json