Skip to content

Commit c8a1a7e

Browse files
committed
ci: Add GitHub Actions workflow for build and release
1 parent 0e31b35 commit c8a1a7e

File tree

3 files changed

+45
-16
lines changed

3 files changed

+45
-16
lines changed

.github/workflows/release.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ jobs:
2121
with:
2222
fetch-depth: 0
2323

24+
# --- [БЛОК 1] Сборка исполняемого файла аналитики ---
2425
- name: Set up Python
2526
uses: actions/setup-python@v5
2627
with:
@@ -29,12 +30,11 @@ jobs:
2930
- name: Install Python dependencies
3031
run: pip install -r python_requirements.txt
3132

33+
# ИЗМЕНЕННАЯ КОМАНДА СБОРКИ: без cd, прямой вызов .spec файла
3234
- name: Build analytics executable
33-
run: |
34-
cd python_src
35-
pyinstaller analytics.spec --distpath ../extra/analytics --workpath ../build_pyinstaller
35+
run: pyinstaller python_src/analytics.spec --distpath extra/analytics --workpath build_pyinstaller
3636

37-
# ... остальная часть файла без изменений ...
37+
# --- [БЛОК 2] Сборка Electron-приложения ---
3838
- name: Setup Node.js
3939
uses: actions/setup-node@v4
4040
with:

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "openipc-dashboard",
3-
"version": "2.8.6",
3+
"version": "2.7.9",
44
"description": "App for managing OpenIPC cameras",
55
"main": "main.js",
66
"scripts": {

python_src/analytics.spec

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,41 @@
11
# python_src/analytics.spec
22

33
# -*- mode: python ; coding: utf-8 -*-
4+
import os
5+
from PyInstaller.utils.hooks import collect_data_files, collect_dynamic_libs
46

5-
from PyInstaller.utils.hooks import collect_data_files
7+
# --- БЛОК 1: Определяем абсолютные пути ---
8+
9+
# Получаем абсолютный путь к папке, где лежит этот .spec файл.
10+
# Это делает сборку независимой от того, откуда запускается PyInstaller.
11+
SPEC_DIR = os.path.abspath(os.path.dirname(__file__))
12+
13+
# --- БЛОК 2: Подготовка данных и библиотек ---
614

715
# Собираем данные: модель ONNX и все данные из ultralytics.
8-
# Это самый надежный способ включить все, что нужно.
16+
# Пути теперь строятся от абсолютного пути к .spec файлу.
917
datas = [
10-
('yolov8n.onnx', '.'),
18+
(os.path.join(SPEC_DIR, 'yolov8n.onnx'), '.'),
1119
*collect_data_files('ultralytics')
1220
]
1321

14-
# Исключаем тяжелые и ненужные пакеты, чтобы уменьшить размер
22+
# Собираем бинарные файлы (.dll, .so) для onnxruntime и cv2.
23+
binaries = []
24+
binaries += collect_dynamic_libs('onnxruntime')
25+
binaries += collect_dynamic_libs('cv2')
26+
27+
# Явно указываем импорты.
28+
hiddenimports = [
29+
'numpy',
30+
'cv2',
31+
'onnxruntime',
32+
'scipy',
33+
'ultralytics',
34+
'ultralytics.engine.results',
35+
'PIL',
36+
]
37+
38+
# Исключаем ненужные тяжелые библиотеки.
1539
excludes = [
1640
'torch',
1741
'torchvision',
@@ -22,28 +46,33 @@ excludes = [
2246
'tkinter'
2347
]
2448

49+
# --- БЛОК 3: Основная конфигурация Analysis ---
50+
2551
a = Analysis(
26-
['analytics.py'],
27-
pathex=[],
28-
binaries=[],
52+
[os.path.join(SPEC_DIR, 'analytics.py')], # Явно указываем абсолютный путь к скрипту
53+
pathex=[SPEC_DIR], # Указываем, где искать импорты
54+
binaries=binaries,
2955
datas=datas,
30-
hiddenimports=[], # Хуки PyInstaller для ultralytics должны справиться сами
56+
hiddenimports=hiddenimports,
3157
hookspath=[],
3258
runtime_hooks=[],
3359
excludes=excludes,
3460
win_no_prefer_redirects=False,
3561
win_private_assemblies=False,
36-
cipher=None,
62+
cipher=None
3763
)
3864

65+
# --- БЛОК 4: Сборка исполняемого файла ---
66+
3967
pyz = PYZ(a.pure, a.zipped_data, cipher=None)
4068

41-
# Собираем все в один исполняемый файл. Без COLLECT.
4269
exe = EXE(
4370
pyz,
4471
a.scripts,
72+
a.binaries,
73+
a.zipfiles,
74+
a.datas,
4575
[],
46-
exclude_binaries=True,
4776
name='analytics',
4877
debug=False,
4978
bootloader_ignore_signals=False,

0 commit comments

Comments
 (0)