#!/usr/bin/env bash # Attache des fichiers à une release Gitea, de façon idempotente (re-run friendly). # # Usage : attach-release-assets.sh # Env : RELEASE_TOKEN (token Gitea avec write:repository), GITHUB_SERVER_URL, GITHUB_REPOSITORY. # # Partagé par tous les jobs de release desktop (Linux, Windows, canal flottant) : la logique était # dupliquée dans chaque job, et toute correction devait être faite trois fois. set -uo pipefail tag="${1:?tag manquant}" release_name="${2:?nom de release manquant}" shift 2 if [ -z "${RELEASE_TOKEN:-}" ]; then echo "::notice::RELEASE_TOKEN absent, aucun asset attaché (les artefacts du run restent disponibles)." exit 0 fi api="${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}" auth="Authorization: token ${RELEASE_TOKEN}" release_id=$(curl -fsSL -H "$auth" "${api}/releases/tags/${tag}" \ | node -p "JSON.parse(require('fs').readFileSync(0,'utf8')).id || ''" || true) if [ -z "$release_id" ]; then release_id=$(curl -fsSL -X POST -H "$auth" -H 'Content-Type: application/json' \ -d "{\"tag_name\":\"${tag}\",\"name\":\"${release_name}\"}" \ "${api}/releases" | node -p "JSON.parse(require('fs').readFileSync(0,'utf8')).id || ''") fi if [ -z "$release_id" ]; then echo "::warning::impossible de résoudre ou créer la release ${tag}" exit 0 fi for f in "$@"; do [ -f "$f" ] || continue name=$(basename "$f") # L'API Gitea refuse un asset de même nom : on supprime l'ancien pour que le dernier build gagne. existing=$(curl -fsSL -H "$auth" "${api}/releases/${release_id}/assets" \ | node -e "const a=JSON.parse(require('fs').readFileSync(0,'utf8'));const m=Array.isArray(a)?a.find(x=>x.name===process.argv[1]):null;process.stdout.write(m?String(m.id):'')" "$name" || true) if [ -n "$existing" ]; then echo "replacing existing $name (asset $existing)" curl -fsSL -X DELETE -H "$auth" "${api}/releases/${release_id}/assets/${existing}" || true fi echo "attaching $name" curl -fsSL -X POST -H "$auth" -F "attachment=@${f}" "${api}/releases/${release_id}/assets?name=${name}" done echo "Assets attachés à la release ${tag}."