From f072d954debcb75e84d4f5eaa20be700e8e86220 Mon Sep 17 00:00:00 2001 From: Dmitriy Fofanov Date: Mon, 23 Feb 2026 23:12:50 +0300 Subject: [PATCH] =?UTF-8?q?Fix:=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BE=D1=82=20make/zip/python3=20=D0=B2=20CI=20workfl?= =?UTF-8?q?ow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/release.yml | 77 +++++++++++++++++++++++++++++++---- .github/workflows/release.yml | 77 +++++++++++++++++++++++++++++++---- 2 files changed, 138 insertions(+), 16 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 3214963..6f388aa 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -118,10 +118,52 @@ jobs: - name: "Кросс-компиляция для всех платформ (16 бинарников)" shell: bash run: | - make build-all VERSION=${{ steps.ver.outputs.version }} + VER="${{ steps.ver.outputs.version }}" + LDFLAGS="-s -w -X main.version=${VER}" + GOFLAGS="-trimpath" + CMD="./cmd/genaudiobookinfo" + OUT="${BUILD_DIR}" + mkdir -p "${OUT}" + + build() { + local goos=$1 goarch=$2 suffix=$3 extra_env="$4" + local outfile="${OUT}/${APP_NAME}-${suffix}" + echo ">>> ${goos}/${goarch} → ${APP_NAME}-${suffix}" + env GOOS=${goos} GOARCH=${goarch} ${extra_env} \ + go build ${GOFLAGS} -ldflags "${LDFLAGS}" -o "${outfile}" ${CMD} + } + + # Linux + build linux amd64 linux-amd64 + build linux 386 linux-386 + build linux arm64 linux-arm64 + build linux arm linux-armv7 "GOARM=7" + build linux mips linux-mips "GOMIPS=softfloat" + build linux mipsle linux-mipsle "GOMIPS=softfloat" + build linux riscv64 linux-riscv64 + + # macOS + build darwin amd64 darwin-amd64 + build darwin arm64 darwin-arm64 + + # Windows + build windows amd64 windows-amd64.exe + build windows 386 windows-386.exe + build windows arm64 windows-arm64.exe + + # FreeBSD + build freebsd amd64 freebsd-amd64 + build freebsd arm64 freebsd-arm64 + + # OpenBSD + build openbsd amd64 openbsd-amd64 + + # NetBSD + build netbsd amd64 netbsd-amd64 + echo "" - echo "Собранные бинарники:" - ls -lh ${BUILD_DIR}/ + echo "Собранные бинарники ($(ls ${OUT}/ | wc -l)):" + ls -lh ${OUT}/ # ── Архивы + контрольные суммы ────────────────────────────────────── - name: "Создание архивов и контрольных сумм" @@ -137,7 +179,13 @@ jobs: *.exe) ARCNAME="${f%.exe}.zip" echo " ${f} → archives/${ARCNAME}" - zip "archives/${ARCNAME}" "$f" + if command -v zip &>/dev/null; then + zip "archives/${ARCNAME}" "$f" + else + # Fallback: tar.gz вместо zip если zip не установлен + ARCNAME="${f%.exe}.tar.gz" + tar -czf "archives/${ARCNAME}" "$f" + fi ;; ${APP_NAME}-*) ARCNAME="${f}.tar.gz" @@ -318,11 +366,19 @@ jobs: echo "══════════════════════════════════════" # ── JSON-кодирование тела релиза ─────────────────────────────── - BODY_JSON=$(python3 -c " + # JSON-кодирование: python3 или чистый bash + if command -v python3 &>/dev/null; then + BODY_JSON=$(python3 -c " import json with open('/tmp/release_body.md', 'r') as f: print(json.dumps(f.read())) ") + else + # Чистый bash: экранируем для JSON + BODY_RAW=$(cat /tmp/release_body.md) + BODY_JSON=$(printf '%s' "$BODY_RAW" | sed 's/\\/\\\\/g; s/"/\\"/g; s/ /\\t/g' | awk '{printf "%s\\n", $0}' | sed 's/\\n$//') + BODY_JSON="\"${BODY_JSON}\"" + fi # ── Создание релиза через Gitea API ──────────────────────────── echo "" @@ -341,13 +397,18 @@ jobs: \"prerelease\": false }") - RELEASE_ID=$(echo "$RELEASE_JSON" | \ - python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('id',''))" 2>/dev/null || true) + # Извлекаем ID релиза: python3 или grep/sed + if command -v python3 &>/dev/null; then + RELEASE_ID=$(echo "$RELEASE_JSON" | \ + python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('id',''))" 2>/dev/null || true) + else + RELEASE_ID=$(echo "$RELEASE_JSON" | grep -o '"id":[0-9]*' | head -1 | grep -o '[0-9]*') + fi if [ -z "$RELEASE_ID" ] || [ "$RELEASE_ID" = "None" ]; then echo "ОШИБКА: не удалось создать релиз!" echo "Ответ API:" - echo "$RELEASE_JSON" | python3 -m json.tool 2>/dev/null || echo "$RELEASE_JSON" + echo "$RELEASE_JSON" exit 1 fi diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3214963..6f388aa 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -118,10 +118,52 @@ jobs: - name: "Кросс-компиляция для всех платформ (16 бинарников)" shell: bash run: | - make build-all VERSION=${{ steps.ver.outputs.version }} + VER="${{ steps.ver.outputs.version }}" + LDFLAGS="-s -w -X main.version=${VER}" + GOFLAGS="-trimpath" + CMD="./cmd/genaudiobookinfo" + OUT="${BUILD_DIR}" + mkdir -p "${OUT}" + + build() { + local goos=$1 goarch=$2 suffix=$3 extra_env="$4" + local outfile="${OUT}/${APP_NAME}-${suffix}" + echo ">>> ${goos}/${goarch} → ${APP_NAME}-${suffix}" + env GOOS=${goos} GOARCH=${goarch} ${extra_env} \ + go build ${GOFLAGS} -ldflags "${LDFLAGS}" -o "${outfile}" ${CMD} + } + + # Linux + build linux amd64 linux-amd64 + build linux 386 linux-386 + build linux arm64 linux-arm64 + build linux arm linux-armv7 "GOARM=7" + build linux mips linux-mips "GOMIPS=softfloat" + build linux mipsle linux-mipsle "GOMIPS=softfloat" + build linux riscv64 linux-riscv64 + + # macOS + build darwin amd64 darwin-amd64 + build darwin arm64 darwin-arm64 + + # Windows + build windows amd64 windows-amd64.exe + build windows 386 windows-386.exe + build windows arm64 windows-arm64.exe + + # FreeBSD + build freebsd amd64 freebsd-amd64 + build freebsd arm64 freebsd-arm64 + + # OpenBSD + build openbsd amd64 openbsd-amd64 + + # NetBSD + build netbsd amd64 netbsd-amd64 + echo "" - echo "Собранные бинарники:" - ls -lh ${BUILD_DIR}/ + echo "Собранные бинарники ($(ls ${OUT}/ | wc -l)):" + ls -lh ${OUT}/ # ── Архивы + контрольные суммы ────────────────────────────────────── - name: "Создание архивов и контрольных сумм" @@ -137,7 +179,13 @@ jobs: *.exe) ARCNAME="${f%.exe}.zip" echo " ${f} → archives/${ARCNAME}" - zip "archives/${ARCNAME}" "$f" + if command -v zip &>/dev/null; then + zip "archives/${ARCNAME}" "$f" + else + # Fallback: tar.gz вместо zip если zip не установлен + ARCNAME="${f%.exe}.tar.gz" + tar -czf "archives/${ARCNAME}" "$f" + fi ;; ${APP_NAME}-*) ARCNAME="${f}.tar.gz" @@ -318,11 +366,19 @@ jobs: echo "══════════════════════════════════════" # ── JSON-кодирование тела релиза ─────────────────────────────── - BODY_JSON=$(python3 -c " + # JSON-кодирование: python3 или чистый bash + if command -v python3 &>/dev/null; then + BODY_JSON=$(python3 -c " import json with open('/tmp/release_body.md', 'r') as f: print(json.dumps(f.read())) ") + else + # Чистый bash: экранируем для JSON + BODY_RAW=$(cat /tmp/release_body.md) + BODY_JSON=$(printf '%s' "$BODY_RAW" | sed 's/\\/\\\\/g; s/"/\\"/g; s/ /\\t/g' | awk '{printf "%s\\n", $0}' | sed 's/\\n$//') + BODY_JSON="\"${BODY_JSON}\"" + fi # ── Создание релиза через Gitea API ──────────────────────────── echo "" @@ -341,13 +397,18 @@ jobs: \"prerelease\": false }") - RELEASE_ID=$(echo "$RELEASE_JSON" | \ - python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('id',''))" 2>/dev/null || true) + # Извлекаем ID релиза: python3 или grep/sed + if command -v python3 &>/dev/null; then + RELEASE_ID=$(echo "$RELEASE_JSON" | \ + python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('id',''))" 2>/dev/null || true) + else + RELEASE_ID=$(echo "$RELEASE_JSON" | grep -o '"id":[0-9]*' | head -1 | grep -o '[0-9]*') + fi if [ -z "$RELEASE_ID" ] || [ "$RELEASE_ID" = "None" ]; then echo "ОШИБКА: не удалось создать релиз!" echo "Ответ API:" - echo "$RELEASE_JSON" | python3 -m json.tool 2>/dev/null || echo "$RELEASE_JSON" + echo "$RELEASE_JSON" exit 1 fi