Compare commits
No commits in common. "main" and "auto_build_2025-01-25_12-13-25" have entirely different histories.
main
...
auto_build
4 changed files with 69 additions and 287 deletions
23
.github/workflows/pylint.yml
vendored
23
.github/workflows/pylint.yml
vendored
|
|
@ -1,23 +0,0 @@
|
||||||
name: Pylint
|
|
||||||
|
|
||||||
on: [push]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
python-version: ["3.8", "3.9", "3.10"]
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
|
||||||
uses: actions/setup-python@v3
|
|
||||||
with:
|
|
||||||
python-version: ${{ matrix.python-version }}
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
python -m pip install --upgrade pip
|
|
||||||
pip install pylint
|
|
||||||
- name: Analysing the code with pylint
|
|
||||||
run: |
|
|
||||||
pylint $(git ls-files '*.py')
|
|
||||||
218
README.md
218
README.md
|
|
@ -1,171 +1,91 @@
|
||||||
# 
|
# Auto Build GitHub Release Automation
|
||||||
|
|
||||||

|
## 📦 Описание проекта
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
## Содержание
|
Скрипт автоматизирует создание релизов в GitHub с ежедневной архивацией содержимого репозитория.
|
||||||
|
|
||||||
* [Описание](#описание)
|
## 🚀 Функциональность
|
||||||
* [Функции](#функции)
|
|
||||||
* [Требования](#требования)
|
|
||||||
* [Установка](#установка)
|
|
||||||
* [Конфигурация](#конфигурация)
|
|
||||||
* [Настройки расписания](#настройки-расписания)
|
|
||||||
* [Запуск](#запуск)
|
|
||||||
* [Важные примечания](#важные-примечания)
|
|
||||||
* [Лицензия](#лицензия)
|
|
||||||
|
|
||||||
## Описание
|
- Автоматическое создание архива репозитория
|
||||||
|
- Генерация релиза в GitHub
|
||||||
|
- Загрузка архива как asset релиза
|
||||||
|
- Поддержка Windows и Linux
|
||||||
|
- Настраиваемое расписание
|
||||||
|
|
||||||
Мощный Python-скрипт, автоматизирующий создание релизов на GitHub путем генерации ежедневных архивов содержимого вашего репозитория. Идеально подходит для проектов, требующих регулярных сборок или резервных копий.
|
## 🛠 Требования
|
||||||
|
|
||||||
## Функции
|
- Python 3.8+
|
||||||
|
- Git
|
||||||
|
- Личный токен GitHub
|
||||||
|
|
||||||
* 🔄 **Автоматическое архивирование репозитория** - Создает сжатые архивы вашего репозитория
|
## 📋 Установка
|
||||||
* 🚀 **Генерация релизов на GitHub** - Автоматически создает релизы на GitHub
|
|
||||||
* 📦 **Загрузка ресурсов** - Прикрепляет архивные файлы к каждому релизу
|
|
||||||
* 💻 **Кроссплатформенность** - Работает как на Windows, так и на Linux
|
|
||||||
* ⏱️ **Настраиваемое расписание** - Настройте собственное время выпуска релизов
|
|
||||||
* 🔒 **Безопасная аутентификация** - Использует персональные токены доступа GitHub для безопасного доступа к API
|
|
||||||
|
|
||||||
## Требования
|
|
||||||
|
|
||||||
* Python 3.8 или выше
|
|
||||||
* Установленный и настроенный Git
|
|
||||||
* Персональный токен доступа GitHub с соответствующими разрешениями
|
|
||||||
* Интернет-соединение для доступа к API GitHub
|
|
||||||
|
|
||||||
## Установка
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>
|
|
||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
</summary>
|
|
||||||
|
|
||||||
1. **Клонировать репозиторий**
|
1. Клонировать репозиторий:
|
||||||
|
```bash
|
||||||
```bash
|
git clone https://github.com/your-repo/auto-build-script.git
|
||||||
git clone https://github.com/themaster1970sf/AutoBuildRepo.git
|
cd auto-build-script
|
||||||
cd AutoBuildRepo
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Установить зависимости**
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
pip install -r requirements.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Запустить скрипт**
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
python app.py
|
|
||||||
```
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>
|
|
||||||
|
|
||||||
### Linux
|
|
||||||
</summary>
|
|
||||||
|
|
||||||
1. **Клонировать репозиторий**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git clone https://github.com/themaster1970sf/AutoBuildRepo.git
|
|
||||||
cd AutoBuildRepo
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Создать и активировать виртуальное окружение**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 -m venv venv
|
|
||||||
source venv/bin/activate
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Установить зависимости**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pip install -r requirements.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
4. **Запустить скрипт**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 app.py
|
|
||||||
```
|
|
||||||
</details>
|
|
||||||
|
|
||||||
## Конфигурация
|
|
||||||
|
|
||||||
1. **Получить персональный токен доступа GitHub**
|
|
||||||
|
|
||||||
Создайте токен со следующими разрешениями:
|
|
||||||
- `repo` (Полный контроль над приватными репозиториями)
|
|
||||||
- `workflow` (Обновление рабочих процессов GitHub Action)
|
|
||||||
|
|
||||||
2. **Настроить скрипт**
|
|
||||||
|
|
||||||
Отредактируйте функцию `daily_release()` в файле `app.py`:
|
|
||||||
|
|
||||||
```python
|
|
||||||
repo = {
|
|
||||||
"path": r"/путь/к/сборке",
|
|
||||||
"git_config": {
|
|
||||||
"username": "ваш_логин_github",
|
|
||||||
"repo": "ваш_репозиторий",
|
|
||||||
"token": "ваш_токен_github"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Настройки расписания
|
|
||||||
|
|
||||||
По умолчанию скрипт запускается ежедневно в 11:23. Чтобы изменить расписание, измените функцию `main()`:
|
|
||||||
|
|
||||||
```python
|
|
||||||
schedule.every().day.at("ЧАС:МИНУТА").do(daily_release)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Доступные варианты расписания:
|
2. Установить зависимости:
|
||||||
- `schedule.every().day.at("ЧЧ:ММ")` - Запуск ежедневно в указанное время
|
```powershell
|
||||||
- `schedule.every().hour` - Запуск каждый час
|
pip install -r requirements.txt
|
||||||
- `schedule.every().monday` - Запуск каждый понедельник
|
```
|
||||||
- `schedule.every(10).minutes` - Запуск каждые 10 минут
|
|
||||||
|
|
||||||
## Запуск
|
### Linux
|
||||||
|
|
||||||
Чтобы запустить автоматический процесс выпуска релизов:
|
1. Клонировать репозиторий:
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/your-repo/auto-build-script.git
|
||||||
|
cd auto-build-script
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Создать виртуальное окружение:
|
||||||
|
```bash
|
||||||
|
python3 -m venv venv
|
||||||
|
source venv/bin/activate
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Установить зависимости:
|
||||||
|
```bash
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Настройка
|
||||||
|
|
||||||
|
1. Получить Personal Access Token в GitHub
|
||||||
|
2. Отредактировать `daily_release()`:
|
||||||
|
```python
|
||||||
|
repo = {
|
||||||
|
"path": r"/path/to/build",
|
||||||
|
"git_config": {
|
||||||
|
"username": "your_github_username",
|
||||||
|
"repo": "your_repository",
|
||||||
|
"token": "your_github_token"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🕒 Расписание
|
||||||
|
|
||||||
|
По умолчанию скрипт запускается ежедневно в 11:23. Изменить время в функции `main()`:
|
||||||
|
```python
|
||||||
|
schedule.every().day.at("HOUR:MINUTE").do(daily_release)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🐍 Запуск
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python app.py
|
python app.py
|
||||||
```
|
```
|
||||||
|
|
||||||
Скрипт продолжит работать в фоновом режиме в соответствии с установленным расписанием.
|
## ⚠️ Важно
|
||||||
|
|
||||||
## Важные примечания
|
- Храните токен в секрете
|
||||||
|
- Проверьте права доступа к репозиторию
|
||||||
|
- Убедитесь в корректности путей
|
||||||
|
|
||||||
⚠️ **Соображения безопасности**
|
## 📄 Лицензия
|
||||||
|
|
||||||
- Рассмотрите возможность использования переменных окружения для хранения конфиденциальной информации
|
[MIT License](https://github.com/themaster1970sf/AutoBuildRepo/blob/main/LICENSE)
|
||||||
- Проверьте, есть ли у вас необходимые разрешения для целевого репозитория
|
|
||||||
|
|
||||||
⚠️ **Соображения производительности**
|
|
||||||
|
|
||||||
- Для больших репозиториев архивирование может занять значительное время
|
|
||||||
- Следите за ограничениями скорости API GitHub
|
|
||||||
- Учитывайте использование пропускной способности сети для больших загрузок
|
|
||||||
|
|
||||||
## Лицензия
|
|
||||||
|
|
||||||
[Лицензия MIT](https://github.com/themaster1970sf/AutoBuildRepo/blob/main/LICENSE)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
Сделано с ❤️ от <a href="https://git.plazmocraft.ru/themaster1970sf/">themaster1970sf</a>
|
|
||||||
</p>
|
|
||||||
|
|
|
||||||
112
app.py
112
app.py
|
|
@ -1,112 +0,0 @@
|
||||||
import os
|
|
||||||
import shutil
|
|
||||||
import requests
|
|
||||||
from datetime import datetime
|
|
||||||
import pytz
|
|
||||||
import schedule
|
|
||||||
import time
|
|
||||||
import zipfile
|
|
||||||
|
|
||||||
def create_github_release(repo_path, git_config):
|
|
||||||
"""
|
|
||||||
Создает релиз в GitHub
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
moscow_tz = pytz.timezone('Europe/Moscow')
|
|
||||||
current_time = datetime.now(moscow_tz)
|
|
||||||
|
|
||||||
archive_name = f"auto_build_{current_time.strftime('%Y-%m-%d_%H-%M-%S')}"
|
|
||||||
archive_path = os.path.join(repo_path, f"{archive_name}.zip")
|
|
||||||
|
|
||||||
# Создание временной директории без archives
|
|
||||||
temp_dir = os.path.join(repo_path, 'temp_build')
|
|
||||||
os.makedirs(temp_dir, exist_ok=True)
|
|
||||||
|
|
||||||
# Копирование файлов, исключая archives
|
|
||||||
for item in os.listdir(repo_path):
|
|
||||||
if item != 'archives' and item != 'temp_build':
|
|
||||||
s = os.path.join(repo_path, item)
|
|
||||||
d = os.path.join(temp_dir, item)
|
|
||||||
if os.path.isdir(s):
|
|
||||||
shutil.copytree(s, d)
|
|
||||||
else:
|
|
||||||
shutil.copy2(s, d)
|
|
||||||
|
|
||||||
# Архивация временной директории
|
|
||||||
shutil.make_archive(archive_path[:-4], 'zip', temp_dir)
|
|
||||||
|
|
||||||
# Удаление временной директории
|
|
||||||
shutil.rmtree(temp_dir)
|
|
||||||
|
|
||||||
release_data = {
|
|
||||||
"tag_name": archive_name,
|
|
||||||
"target_commitish": "main",
|
|
||||||
"name": f"Build {archive_name}",
|
|
||||||
"body": f"Автоматическая сборка от {current_time.strftime('%Y-%m-%d %H:%M:%S')}",
|
|
||||||
"draft": False,
|
|
||||||
"prerelease": False
|
|
||||||
}
|
|
||||||
|
|
||||||
url = f"https://api.github.com/repos/{git_config['username']}/{git_config['repo']}/releases"
|
|
||||||
|
|
||||||
headers = {
|
|
||||||
"Authorization": f"token {git_config['token']}",
|
|
||||||
"Accept": "application/vnd.github.v3+json"
|
|
||||||
}
|
|
||||||
|
|
||||||
response = requests.post(url, json=release_data, headers=headers)
|
|
||||||
|
|
||||||
if response.status_code == 201:
|
|
||||||
release_info = response.json()
|
|
||||||
upload_url = release_info['upload_url'].replace('{?name,label}', f'?name={archive_name}.zip')
|
|
||||||
|
|
||||||
with open(archive_path, 'rb') as file:
|
|
||||||
upload_response = requests.post(
|
|
||||||
upload_url,
|
|
||||||
headers={
|
|
||||||
"Authorization": f"token {git_config['token']}",
|
|
||||||
"Content-Type": "application/zip"
|
|
||||||
},
|
|
||||||
data=file
|
|
||||||
)
|
|
||||||
|
|
||||||
if upload_response.status_code in [200, 201]:
|
|
||||||
print(f"Успешно создан релиз: {archive_name}")
|
|
||||||
|
|
||||||
# Удаление архива после успешной загрузки
|
|
||||||
os.remove(archive_path)
|
|
||||||
print(f"Архив {archive_name}.zip был удален.")
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
print("Ошибка загрузки архива")
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
print(f"Ошибка создания релиза: {response.text}")
|
|
||||||
return False
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Общая ошибка: {e}")
|
|
||||||
return False
|
|
||||||
|
|
||||||
def daily_release():
|
|
||||||
"""Ежедневное создание релиза"""
|
|
||||||
repo = {
|
|
||||||
"path": r"C:\build",
|
|
||||||
"git_config": {
|
|
||||||
"username": "xdghrj",
|
|
||||||
"repo": "auto_build_test",
|
|
||||||
"token": "ghp_XXXXXXXXXXXXXXXXXXXXX"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
create_github_release(repo['path'], repo['git_config'])
|
|
||||||
|
|
||||||
def main():
|
|
||||||
schedule.every().day.at("23:00").do(daily_release)
|
|
||||||
|
|
||||||
while True:
|
|
||||||
schedule.run_pending()
|
|
||||||
time.sleep(60)
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
requests
|
|
||||||
pytz
|
|
||||||
schedule
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue