Gitea Actions ignore .github/workflows/ dès que .gitea/workflows/ existe (ajouté avec prod.yml). Résultat : ci.yml et release.yml ne se déclenchaient plus (ni CI sur push, ni publication sur tag). On les remet dans le répertoire effectivement lu par Gitea.
74 lines
3.2 KiB
YAML
74 lines
3.2 KiB
YAML
# 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:
|
|
tags: ['v*']
|
|
|
|
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
|