#!/usr/bin/env bash # Publie une Release GitHub a partir de la version de project.godot. # # tools/release.sh [--dry-run] [--stable] # # Par defaut la Release est marquee « pre-release » (contenu pedagogique en # brouillon). --dry-run fait toutes les verifications et construit les # archives, sans tag ni publication. La cle de publication Android est lue # dans ~/.config/aventuriers-des-mots/release.env (hors depot). set -euo pipefail cd "$(dirname "$0")/.." DRY_RUN=0 PRERELEASE=1 for arg in "$@"; do case "${arg}" in --dry-run) DRY_RUN=1 ;; --stable) PRERELEASE=0 ;; *) echo "Option inconnue : ${arg}" >&2; exit 2 ;; esac done fail() { echo "ERREUR : $*" >&2; exit 1; } VERSION="$(sed -n 's/^config\/version="\(.*\)"/\1/p' project.godot)" [ -n "${VERSION}" ] || fail "config/version absent de project.godot" TAG="v${VERSION}" RELEASE_ENV="${RELEASE_ENV:-${HOME}/.config/aventuriers-des-mots/release.env}" DEBUG_CERT_DN="CN=Godot, OU=Godot Engine" echo "== Verifications (${TAG}) ==" [ "$(git rev-parse --abbrev-ref HEAD)" = "main" ] || fail "la publication se fait depuis la branche main" [ -z "$(git status --porcelain)" ] || fail "arbre de travail non propre : commiter d'abord" git fetch -q origin main [ "$(git rev-parse HEAD)" = "$(git rev-parse origin/main)" ] || fail "main differe de origin/main : pousser ou tirer d'abord" if git rev-parse -q --verify "refs/tags/${TAG}" >/dev/null; then fail "le tag ${TAG} existe deja : incrementer config/version dans project.godot" fi [ -f "${RELEASE_ENV}" ] || fail "cle de publication absente (${RELEASE_ENV})" if [ "${DRY_RUN}" -eq 0 ]; then gh auth status >/dev/null 2>&1 || fail "gh n'est pas authentifie (gh auth login)" fi echo "== make check ==" make check echo "== make package ==" make package [ -z "$(git status --porcelain)" ] || fail "make package a modifie le depot (versions des presets ?) : verifier puis commiter" echo "== Controle des archives ==" ARCHIVES=( "dist/aventuriers-des-mots-${VERSION}-linux-x86_64.tar.gz" "dist/aventuriers-des-mots-${VERSION}-windows-x86_64.zip" "dist/aventuriers-des-mots-${VERSION}-android.zip" "dist/aventuriers-des-mots-${VERSION}-macos-universal.zip" "dist/aventuriers-des-mots-${VERSION}-chromeos.zip" ) for archive in "${ARCHIVES[@]}"; do [ -s "${archive}" ] || fail "archive manquante : ${archive}" done (cd dist && sha256sum -c SHA256SUMS >/dev/null) || fail "SHA256SUMS ne correspond pas aux archives" # L'APK ne doit jamais etre signe avec la cle de debogage publique de Godot. APKSIGNER="$(ls -d "${ANDROID_HOME:-${HOME}/Android/Sdk}"/build-tools/*/apksigner 2>/dev/null | sort -V | tail -1)" [ -x "${APKSIGNER}" ] || fail "apksigner introuvable (Android SDK build-tools)" TMP="$(mktemp -d)" trap 'rm -rf "${TMP}"' EXIT unzip -q -j "dist/aventuriers-des-mots-${VERSION}-android.zip" '*.apk' -d "${TMP}" CERTS="$("${APKSIGNER}" verify --print-certs "${TMP}"/*.apk)" if grep -q "${DEBUG_CERT_DN}" <<<"${CERTS}"; then fail "l'APK est signe avec la cle de debogage Godot : verifier ${RELEASE_ENV}" fi echo "${CERTS}" | sed -n '1,2p' NOTES="${TMP}/notes.md" cat > "${NOTES}" <