name: Build and Release on: push: branches: - master - main workflow_dispatch: # Ручной запуск jobs: build: runs-on: tcl-tk-builder steps: - name: Клонирование run: | git clone "${{ vars.main_url }}${{ gitea.repository }}.git" . - name: Получение версии id: get_version run: | VERSION=$(grep "Version" projman.tcl | head -1 | grep -o '[0-9.]\+[a-zA-Z0-9]*' || echo "1.0.0") RELEASE=$(grep "# Release" projman.tcl | tail -1 | awk '{print $NF}' || echo "$(date +%Y%m%d)") # Создаем имя тега TAG="v${VERSION}" # Правильный формат для Gitea - в кавычках echo 'TAG="'"${TAG}"'"' >> $GITEA_ENV echo 'VERSION="'"${VERSION}"'"' >> $GITEA_ENV echo 'RELEASE="'"${RELEASE}"'"' >> $GITEA_ENV echo "Тег: ${TAG}" echo "Версия: ${VERSION}" echo "Ревизия: ${RELEASE}" - name: Проверка существования тега id: check_tag run: | echo "Проверяем тег: ${TAG}" # Проверяем на удаленном сервере if git ls-remote --tags origin "${TAG}" 2>/dev/null | grep -q "${TAG}"; then echo "Тег ${TAG} уже существует на удаленном сервере" echo 'TAG_EXISTS_REMOTE="true"' >> $GITEA_ENV else echo "Тег ${TAG} не существует на удаленном сервере" echo 'TAG_EXISTS_REMOTE="false"' >> $GITEA_ENV fi - name: Создание тега (только если не существует) if: env.TAG_EXISTS_REMOTE == 'true' run: | echo "Тег уже существует, пропускаем создание" - name: Создание тега (только если не существует) if: env.TAG_EXISTS_REMOTE == 'false' run: | echo "Создаем новый тег: ${TAG}" git config user.email "svk@nuk-svk.ru" git config user.name "svk" # Создаем тег локально git tag -a "${TAG}" -m "Release ${TAG} - ${RELEASE}" # Настраиваем URL для push git remote set-url origin "https://${{ secrets.USER }}:${{ secrets.API_TOKEN }}@git.nuk-svk.ru/${{ gitea.repository }}.git" # Пушим тег на сервер git push origin "${TAG}" - name: Сборка пакетов run: | echo "=== Сборка DEB пакета ===" cd debian && ./build-deb-projman.sh echo "=== Сборка OpenBSD пакета ===" cd ../openbsd && ./build-package-bsd.sh echo "=== Собранные файлы ===" find . -maxdepth 1 -name "projman*" -type f | xargs ls -la 2>/dev/null || echo "Файлы не найдены" - name: Проверка существования релиза id: check_release run: | # Проверяем, существует ли уже релиз для этого тега RESPONSE=$(curl -s -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/tags/$TAG" || echo "{}") echo "Ответ API проверки релиза: $RESPONSE" if echo "$RESPONSE" | grep -q '"id"'; then REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) echo "Реліз уже существует. ID: $REL_ID" # Ключевое исправление: пишем в правильном формате echo 'RELEASE_EXISTS="true"' >> $GITEA_ENV echo 'REL_ID="'"${REL_ID}"'"' >> $GITEA_ENV else echo "Реліз не существует" echo 'RELEASE_EXISTS="false"' >> $GITEA_ENV echo 'REL_ID=""' >> $GITEA_ENV fi - name: Создание или обновление релиза id: create_release run: | echo "=== Работа с релизом для тега $TAG ===" # Проверяем, что тег существует перед созданием релиза if ! git ls-remote --tags origin "${TAG}" 2>/dev/null | grep -q "${TAG}"; then echo "ОШИБКА: Тег ${TAG} не существует на сервере!" exit 1 fi RELEASE_BODY="## Projman $VERSION **Ревизия:** $RELEASE **Дата сборки:** $(date) **Коммит:** $(git rev-parse --short HEAD) ### Собранные пакеты: - DEB пакет для Debian/Ubuntu - TGZ пакет для OpenBSD" # Экранируем переносы строк для JSON ESCAPED_BODY=$(echo "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g') # Используем переменные напрямую, так как они в окружении if [ "$RELEASE_EXISTS" = "true" ] && [ -n "$REL_ID" ]; then echo "Обновляем существующий релиз ID: $REL_ID" # Обновляем существующий релиз RESPONSE=$(curl -s -X PATCH \ -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ -H "Content-Type: application/json" \ -d '{ "name": "Projman '"$VERSION"'", "body": "'"$ESCAPED_BODY"'", "draft": false, "prerelease": false }' \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID") echo "Ответ обновления релиза: $RESPONSE" else echo "Создаем новый релиз" # Создаем новый релиз RESPONSE=$(curl -s -X POST \ -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ -H "Content-Type: application/json" \ -d '{ "tag_name": "'"$TAG"'", "name": "Projman '"$VERSION"'", "body": "'"$ESCAPED_BODY"'", "draft": false, "prerelease": false }' \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases") echo "Ответ создания релиза: $RESPONSE" # Получаем ID нового релиза if echo "$RESPONSE" | grep -q '"id"'; then NEW_REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) echo "Новый ID релиза: $NEW_REL_ID" echo 'REL_ID="'"${NEW_REL_ID}"'"' >> $GITEA_ENV else echo "ОШИБКА: Не удалось получить ID релиза из ответа" echo "Ответ сервера: $RESPONSE" echo 'REL_ID=""' >> $GITEA_ENV exit 1 fi fi - name: Загрузка файлов в релиз if: env.REL_ID != '' run: | echo "=== Загрузка файлов в релиз ===" echo "ID релиза для загрузки: $REL_ID" # Находим все файлы projman FILES=$(find ../ -maxdepth 1 \( -name "*projman*deb" -o -name "*projman*tgz" \) -type f) if [ -z "$FILES" ]; then echo "Нет файлов projman для загрузки" exit 0 fi echo "Найдены файлы:" echo "$FILES" # Загружаем каждый файл for FILE in $FILES; do FILENAME=$(basename "$FILE") echo "Загружаем: $FILENAME" curl -s --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ --upload-file "$FILE" \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$FILENAME" echo "Файл загружен: $FILENAME" done - name: Финализация run: | echo "=== Сборка завершена ===" echo "Тег: $TAG" echo "Версия: $VERSION" echo "Ревизия: $RELEASE" echo "ID релиза: $REL_ID" if [ -n "$REL_ID" ]; then echo "Проверяем файлы в релизе..." curl -s -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets" | \ grep -o '"name":"[^"]*"' | cut -d'"' -f4 || echo "Не удалось получить список файлов" else echo "Релиз не был создан или ID не получен" fi echo "Собранные файлы:" find ../ -maxdepth 1 \( -name "*projman*deb" -o -name "*projman*tgz" \) -type f | xargs ls -la 2>/dev/null || echo "Файлы не найдены"