before add feature v - verbose

This commit is contained in:
2025-10-18 22:40:07 +06:00
parent 01f8adc979
commit c57d981804
6 changed files with 658 additions and 52 deletions

View File

@@ -0,0 +1,5 @@
#!/bin/bash
go-ansible-vault -i shell-code/build.env -a get -m GITHUB_TOKEN > /tmp/source && source /tmp/source
GITHUB_TOKEN=$GITHUB_TOKEN python3 shell-code/release.py

203
shell-code/release.py Normal file
View File

@@ -0,0 +1,203 @@
#!/usr/bin/env python3
"""
Скрипт для создания релиза на GitHub
Использование: GITHUB_TOKEN=your_token python3 release.py
"""
import os
import sys
import json
import requests
from pathlib import Path
# Цвета для вывода
class Colors:
RED = '\033[0;31m'
GREEN = '\033[0;32m'
YELLOW = '\033[1;33m'
BLUE = '\033[0;34m'
NC = '\033[0m' # No Color
def log(message):
print(f"{Colors.GREEN}[INFO]{Colors.NC} {message}")
def error(message):
print(f"{Colors.RED}[ERROR]{Colors.NC} {message}", file=sys.stderr)
def warn(message):
print(f"{Colors.YELLOW}[WARN]{Colors.NC} {message}")
def debug(message):
print(f"{Colors.BLUE}[DEBUG]{Colors.NC} {message}")
# Конфигурация
REPO = "direct-dev-ru/go-lcg"
VERSION_FILE = "VERSION.txt"
BINARIES_DIR = "binaries-for-upload"
def check_environment():
"""Проверка переменных окружения"""
token = os.getenv('GITHUB_TOKEN')
if not token:
error("GITHUB_TOKEN не установлен")
sys.exit(1)
log(f"GITHUB_TOKEN установлен (длина: {len(token)} символов)")
return token
def get_version():
"""Получение версии из файла"""
version_file = Path(VERSION_FILE)
if not version_file.exists():
error(f"Файл {VERSION_FILE} не найден")
sys.exit(1)
version = version_file.read_text().strip()
tag = f"lcg.{version}"
log(f"Версия: {version}")
log(f"Тег: {tag}")
return tag
def check_files():
"""Проверка файлов для загрузки"""
binaries_path = Path(BINARIES_DIR)
if not binaries_path.exists():
error(f"Директория {BINARIES_DIR} не найдена")
sys.exit(1)
files = list(binaries_path.glob("*"))
files = [f for f in files if f.is_file()]
if not files:
error(f"В директории {BINARIES_DIR} нет файлов")
sys.exit(1)
log(f"Найдено файлов: {len(files)}")
for file in files:
log(f" - {file.name} ({file.stat().st_size} байт)")
return files
def create_github_session(token):
"""Создание сессии для GitHub API"""
session = requests.Session()
session.headers.update({
'Authorization': f'token {token}',
'Accept': 'application/vnd.github.v3+json',
'User-Agent': 'release-script'
})
return session
def check_existing_release(session, tag):
"""Проверка существующего релиза"""
log("Проверяем существующий релиз...")
url = f"https://api.github.com/repos/{REPO}/releases/tags/{tag}"
response = session.get(url)
if response.status_code == 200:
release_data = response.json()
log(f"Реліз {tag} уже существует")
return release_data
elif response.status_code == 404:
log(f"Реліз {tag} не найден, создаем новый")
return None
else:
error(f"Ошибка проверки релиза: {response.status_code}")
debug(f"Ответ: {response.text}")
sys.exit(1)
def create_release(session, tag):
"""Создание нового релиза"""
log(f"Создаем новый релиз {tag}...")
data = {
"tag_name": tag,
"name": tag,
"body": f"Release {tag}",
"draft": False,
"prerelease": False
}
url = f"https://api.github.com/repos/{REPO}/releases"
response = session.post(url, json=data)
if response.status_code == 201:
release_data = response.json()
log("Реліз создан успешно")
return release_data
else:
error(f"Ошибка создания релиза: {response.status_code}")
debug(f"Ответ: {response.text}")
sys.exit(1)
def upload_file(session, upload_url, file_path):
"""Загрузка файла в релиз"""
filename = file_path.name
log(f"Загружаем: {filename}")
# Убираем {?name,label} из URL
upload_url = upload_url.replace("{?name,label}", "")
with open(file_path, 'rb') as f:
headers = {'Content-Type': 'application/octet-stream'}
params = {'name': filename}
response = session.post(
upload_url,
data=f,
headers=headers,
params=params
)
if response.status_code == 201:
log(f"{filename} загружен")
return True
else:
error(f"Ошибка загрузки {filename}: {response.status_code}")
debug(f"Ответ: {response.text}")
return False
def main():
"""Основная функция"""
log("=== НАЧАЛО РАБОТЫ СКРИПТА ===")
# Проверки
token = check_environment()
tag = get_version()
files = check_files()
# Создание сессии
session = create_github_session(token)
# Проверка/создание релиза
release = check_existing_release(session, tag)
if not release:
release = create_release(session, tag)
# Получение URL для загрузки
upload_url = release['upload_url']
log(f"Upload URL: {upload_url}")
# Загрузка файлов
log("=== ЗАГРУЗКА ФАЙЛОВ ===")
uploaded = 0
failed = 0
for file_path in files:
if upload_file(session, upload_url, file_path):
uploaded += 1
else:
failed += 1
# Результат
log("=== РЕЗУЛЬТАТ ===")
log(f"Успешно загружено: {uploaded}")
if failed > 0:
warn(f"Ошибок: {failed}")
else:
log("Все файлы загружены успешно!")
log(f"Реліз доступен: https://github.com/{REPO}/releases/tag/{tag}")
log("=== СКРИПТ ЗАВЕРШЕН ===")
if __name__ == "__main__":
main()

134
shell-code/release.sh Normal file
View File

@@ -0,0 +1,134 @@
#!/bin/bash
# Простой скрипт для создания релиза на GitHub
# Использование: GITHUB_TOKEN=your_token ./release.sh
set -e
# Цвета
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# Функции логирования
log() { echo -e "${GREEN}[INFO]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1" >&2; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
debug() { echo -e "${BLUE}[DEBUG]${NC} $1"; }
# Конфигурация
REPO="direct-dev-ru/go-lcg"
VERSION_FILE="VERSION.txt"
BINARIES_DIR="binaries-for-upload"
# Проверки
if [[ -z "$GITHUB_TOKEN" ]]; then
error "GITHUB_TOKEN не установлен"
exit 1
fi
if [[ ! -f "$VERSION_FILE" ]]; then
error "Файл $VERSION_FILE не найден"
exit 1
fi
if [[ ! -d "$BINARIES_DIR" ]]; then
error "Директория $BINARIES_DIR не найдена"
exit 1
fi
# Получение версии
VERSION=$(cat "$VERSION_FILE" | tr -d ' \t\n\r')
TAG="lcg.$VERSION"
log "Версия: $VERSION"
log "Тег: $TAG"
# Проверяем, существует ли уже релиз
log "Проверяем существующий релиз..."
EXISTING_RELEASE=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
"https://api.github.com/repos/$REPO/releases/tags/$TAG")
if echo "$EXISTING_RELEASE" | grep -q '"id":'; then
log "Реліз $TAG уже существует, получаем upload_url..."
UPLOAD_URL=$(echo "$EXISTING_RELEASE" | grep '"upload_url"' | cut -d'"' -f4 | sed 's/{?name,label}//')
else
log "Создаем новый релиз $TAG..."
# Создаем релиз
RELEASE_DATA="{\"tag_name\":\"$TAG\",\"name\":\"$TAG\",\"body\":\"Release $TAG\"}"
RELEASE_RESPONSE=$(curl -s -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Content-Type: application/json" \
"https://api.github.com/repos/$REPO/releases" \
-d "$RELEASE_DATA")
if echo "$RELEASE_RESPONSE" | grep -q '"message"'; then
error "Ошибка создания релиза:"
echo "$RELEASE_RESPONSE" | grep '"message"' | cut -d'"' -f4
exit 1
fi
UPLOAD_URL=$(echo "$RELEASE_RESPONSE" | grep '"upload_url"' | cut -d'"' -f4 | sed 's/{?name,label}//')
log "Реліз создан успешно"
fi
if [[ -z "$UPLOAD_URL" ]]; then
error "Не удалось получить upload_url"
exit 1
fi
log "Upload URL: $UPLOAD_URL"
# Проверяем файлы в директории
log "Проверяем файлы в директории $BINARIES_DIR:"
ls -la "$BINARIES_DIR"
# Загружаем файлы
log "Загружаем файлы..."
UPLOADED=0
FAILED=0
# Простой цикл по всем файлам в директории
for file in "$BINARIES_DIR"/*; do
if [[ -f "$file" ]]; then
filename=$(basename "$file")
log "Обрабатываем файл: $file"
debug "Имя файла: $filename"
log "Загружаем: $filename"
response=$(curl -s -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Content-Type: application/octet-stream" \
"$UPLOAD_URL?name=$filename" \
--data-binary @"$file")
debug "Ответ API: $response"
if echo "$response" | grep -q '"message"'; then
error "Ошибка загрузки $filename:"
echo "$response" | grep '"message"' | cut -d'"' -f4
((FAILED++))
else
log "$filename загружен"
((UPLOADED++))
fi
else
warn "Пропускаем не-файл: $file"
fi
done
# Результат
log "=== РЕЗУЛЬТАТ ==="
log "Успешно загружено: $UPLOADED"
if [[ $FAILED -gt 0 ]]; then
warn "Ошибок: $FAILED"
else
log "Все файлы загружены успешно!"
fi
log "Реліз доступен: https://github.com/$REPO/releases/tag/$TAG"

81
shell-code/test_api.py Normal file
View File

@@ -0,0 +1,81 @@
#!/usr/bin/env python3
"""
Скрипт для тестирования GitHub API
Использование: GITHUB_TOKEN=your_token python3 test_api.py
"""
import os
import sys
import requests
# Цвета
class Colors:
RED = '\033[0;31m'
GREEN = '\033[0;32m'
YELLOW = '\033[1;33m'
NC = '\033[0m'
def log(message):
print(f"{Colors.GREEN}[INFO]{Colors.NC} {message}")
def error(message):
print(f"{Colors.RED}[ERROR]{Colors.NC} {message}")
def main():
REPO = "direct-dev-ru/go-lcg"
token = os.getenv('GITHUB_TOKEN')
if not token:
error("GITHUB_TOKEN не установлен")
sys.exit(1)
session = requests.Session()
session.headers.update({
'Authorization': f'token {token}',
'Accept': 'application/vnd.github.v3+json'
})
print("=== ТЕСТИРОВАНИЕ GITHUB API ===")
# Тест 1: Проверка доступа к репозиторию
print("1. Проверка доступа к репозиторию...")
response = session.get(f"https://api.github.com/repos/{REPO}")
if response.status_code == 200:
repo_data = response.json()
print(f"✅ Доступ к репозиторию есть")
print(f" Репозиторий: {repo_data['full_name']}")
print(f" Описание: {repo_data.get('description', 'Нет описания')}")
else:
print(f"❌ Ошибка доступа: {response.status_code}")
print(f" Ответ: {response.text}")
# Тест 2: Проверка прав
print("\n2. Проверка прав...")
if response.status_code == 200:
permissions = repo_data.get('permissions', {})
if permissions.get('admin'):
print("✅ Есть права администратора")
elif permissions.get('push'):
print("✅ Есть права на запись")
else:
print("❌ Недостаточно прав для создания релизов")
# Тест 3: Последние релизы
print("\n3. Последние релизы:")
releases_response = session.get(f"https://api.github.com/repos/{REPO}/releases")
if releases_response.status_code == 200:
releases = releases_response.json()
if releases:
for release in releases[:5]:
print(f" - {release['tag_name']} ({release['name']})")
else:
print(" Релизов пока нет")
else:
print(f" Ошибка получения релизов: {releases_response.status_code}")
print("\n=== ТЕСТ ЗАВЕРШЕН ===")
if __name__ == "__main__":
main()

View File

@@ -1,52 +0,0 @@
#!/bin/bash
# Variables
VERSION_FILE="VERSION.txt"
GITHUB_TOKEN="${GITHUB_TOKEN}" # Replace with your GitHub token
REPO="direct-dev-ru/binaries" # Replace with your GitHub username/repo
TAG=lcg.$(cat "$VERSION_FILE")
echo TAG: $TAG
RELEASE_DIR="/home/su/projects/golang/linux-command-gpt/binaries-for-upload"
body="{\"tag_name\":\"${TAG}\", \"target_commitish\":\"main\", \"name\":\"${TAG}\", \
\"body\":\"${TAG}\", \"draft\":false, \"prerelease\":false, \"generate_release_notes\":false}"
echo BODY: $body
response=$(curl -L -X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${GITHUB_TOKEN}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/direct-dev-ru/binaries/releases \
-d $body)
echo $response
# Extract the upload URL from the response
upload_url=$(echo "$response" | jq -r '.upload_url' | sed "s/{?name,label}//")
# Check if the release was created successfully
if [[ "$response" == *"Not Found"* ]]; then
echo "Error: Repository not found or invalid token."
exit 1
fi
# Upload each binary file
for file in "$RELEASE_DIR"/*; do
if [[ -f "$file" ]]; then
filename=$(basename "$file")
echo "Uploading $filename..."
response=$(curl -s -X POST -H "Authorization: token $GITHUB_TOKEN" \
-H "Content-Type: application/octet-stream" \
"$upload_url?name=$filename" \
--data-binary @"$file")
echo $response
fi
done
echo "All binaries uploaded successfully."