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}" 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 == '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 ===" 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" ]; 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 echo "id=$NEW_REL_ID" >> $GITHUB_OUTPUT # Для совместимости else echo "ОШИБКА: Не удалось получить ID релиза из ответа" echo "REL_ID=" >> $GITEA_ENV 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 -v --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*" -type f | xargs ls -la 2>/dev/null || echo "Файлы не найдены"