Вместо GitHub Actions — .gitea/workflows/build.yml: проверка, тесты, сборка, валидация настоящими Xray и sing-box, публикация в ветку release и релиз через Gitea API (tools/gitea-release.sh). Ни gh CLI, ни GitHub-only экшенов. Для серверов — tools/update-geosite.sh: сверяет sha256 до закачки и выходит молча, если файл не менялся, проверяет сумму до подмены, подменяет атомарно и дёргает перезапуск только когда файл реально обновился. Едет в dist/, поэтому на сервере нужен один базовый URL. В README — cron и systemd timer. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
f905a76caf
commit
c05f6aa0d7
Executable
+50
@@ -0,0 +1,50 @@
|
||||
#!/bin/sh
|
||||
# Создаёт (или обновляет) релиз в Gitea и заливает в него файлы.
|
||||
#
|
||||
# GITEA_URL=https://gitea.example.com GITEA_REPO=owner/repo GITEA_TOKEN=… \
|
||||
# ./tools/gitea-release.sh <тег> <файл-с-описанием> <файл> [файл …]
|
||||
#
|
||||
# Имя ассета — путь относительно dist/ с заменой "/" на "-", чтобы
|
||||
# sing-box/ipcheck.json и json/ipcheck.json не конфликтовали.
|
||||
|
||||
set -eu
|
||||
|
||||
[ $# -ge 3 ] || { echo "использование: $0 <тег> <notes.md> <файл...>" >&2; exit 1; }
|
||||
|
||||
TAG="$1"; NOTES="$2"; shift 2
|
||||
: "${GITEA_URL:?не задан GITEA_URL}"
|
||||
: "${GITEA_REPO:?не задан GITEA_REPO}"
|
||||
: "${GITEA_TOKEN:?не задан GITEA_TOKEN}"
|
||||
|
||||
API="$GITEA_URL/api/v1/repos/$GITEA_REPO/releases"
|
||||
auth="Authorization: token $GITEA_TOKEN"
|
||||
|
||||
json_field() { python3 -c 'import json,sys; print(json.load(sys.stdin).get(sys.argv[1],""))' "$1"; }
|
||||
|
||||
payload=$(NOTES_FILE="$NOTES" TAG="$TAG" python3 -c '
|
||||
import json, os
|
||||
print(json.dumps({
|
||||
"tag_name": os.environ["TAG"],
|
||||
"name": os.environ["TAG"],
|
||||
"body": open(os.environ["NOTES_FILE"], encoding="utf-8").read(),
|
||||
"draft": False,
|
||||
"prerelease": False,
|
||||
}))')
|
||||
|
||||
# Релиз с таким тегом мог остаться от прошлого прогона — тогда переиспользуем его.
|
||||
id=$(curl -fsS -X POST "$API" -H "$auth" -H 'Content-Type: application/json' \
|
||||
-d "$payload" 2>/dev/null | json_field id || true)
|
||||
if [ -z "$id" ]; then
|
||||
id=$(curl -fsS "$API/tags/$TAG" -H "$auth" | json_field id) ||
|
||||
{ echo "не удалось ни создать, ни найти релиз $TAG" >&2; exit 1; }
|
||||
echo "релиз $TAG уже существует (id $id), дозаливаем ассеты"
|
||||
fi
|
||||
echo "релиз $TAG: id $id"
|
||||
|
||||
for file in "$@"; do
|
||||
[ -f "$file" ] || { echo "нет файла: $file" >&2; exit 1; }
|
||||
name=$(printf '%s' "${file#dist/}" | tr '/' '-')
|
||||
curl -fsS -X POST "$API/$id/assets?name=$name" -H "$auth" \
|
||||
-F "attachment=@$file" >/dev/null
|
||||
echo " + $name"
|
||||
done
|
||||
Reference in New Issue
Block a user