diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml
new file mode 100644
index 0000000..c73e032
--- /dev/null
+++ b/.github/workflows/pylint.yml
@@ -0,0 +1,23 @@
+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')
diff --git a/README.md b/README.md
index 1269535..bb0114f 100644
--- a/README.md
+++ b/README.md
@@ -1,91 +1,171 @@
-# 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
+
+## Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
+
+
### Windows
+
-1. ΠΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ:
-```bash
-git clone https://github.com/your-repo/auto-build-script.git
-cd auto-build-script
-```
+1. **ΠΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ**
-2. Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ:
-```powershell
-pip install -r requirements.txt
-```
+ ```bash
+ git clone https://github.com/themaster1970sf/AutoBuildRepo.git
+ cd AutoBuildRepo
+ ```
+
+2. **Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ**
+
+ ```powershell
+ pip install -r requirements.txt
+ ```
+
+3. **ΠΠ°ΠΏΡΡΡΠΈΡΡ ΡΠΊΡΠΈΠΏΡ**
+
+ ```powershell
+ python app.py
+ ```
+
### Linux
+
-1. ΠΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ:
-```bash
-git clone https://github.com/your-repo/auto-build-script.git
-cd auto-build-script
-```
+1. **ΠΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ**
-2. Π‘ΠΎΠ·Π΄Π°ΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅:
-```bash
-python3 -m venv venv
-source venv/bin/activate
-```
+ ```bash
+ git clone https://github.com/themaster1970sf/AutoBuildRepo.git
+ cd AutoBuildRepo
+ ```
-3. Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ:
-```bash
-pip install -r requirements.txt
-```
+2. **Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΈ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅**
-## π§ ΠΠ°ΡΡΡΠΎΠΉΠΊΠ°
+ ```bash
+ python3 -m venv venv
+ source venv/bin/activate
+ ```
+
+3. **Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ**
+
+ ```bash
+ pip install -r requirements.txt
+ ```
+
+4. **ΠΠ°ΠΏΡΡΡΠΈΡΡ ΡΠΊΡΠΈΠΏΡ**
+
+ ```bash
+ python3 app.py
+ ```
+
+ Π‘Π΄Π΅Π»Π°Π½ΠΎ Ρ β€οΈ ΠΎΡ themaster1970sf +
diff --git a/app.py b/app.py new file mode 100644 index 0000000..a79a563 --- /dev/null +++ b/app.py @@ -0,0 +1,112 @@ +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() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..0b320b4 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +requests +pytz +schedule