1
0
Fork 0
mirror of https://github.com/EDeev/quizlab.git synced 2026-10-08 04:59:34 +03:00

Compare commits

..

No commits in common. "ef6e36ae16fb17720f90c9c5aa0c6acfc1902c22" and "8b83d3d94c9e8e30b6091cef631d959fe5845040" have entirely different histories.

6 changed files with 12 additions and 179 deletions

View file

@ -1,65 +0,0 @@
name: CI
on:
push:
branches: [main]
pull_request:
jobs:
api:
name: API в Docker (lab-2/local)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Сборка и запуск
working-directory: lab-2/local
run: |
cp .env.example .env
docker compose up -d --build --wait postgres_service
docker compose up -d --build
- name: API отдаёт сгенерированные тесты
run: |
for i in $(seq 1 30); do
curl -sf http://localhost/api/quiz/ -o quiz.json && break
sleep 3
done
python3 -c "
import json
d = json.load(open('quiz.json'))
items = d['results'] if isinstance(d, dict) else d
assert items, 'список тестов пуст'
print('тестов:', d.get('count', len(items)) if isinstance(d, dict) else len(items))"
- name: Журнал при ошибке
if: failure()
working-directory: lab-2/local
run: docker compose logs --tail 50
images:
name: Образы caddy/ собираются
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- working-directory: lab-2/caddy
run: cp .env.example .env && docker compose build
client:
name: Qt-клиент (${{ matrix.os }})
strategy:
fail-fast: false
matrix:
os: [ubuntu-22.04, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: jurplel/install-qt-action@v4
with:
version: "6.8.*"
cache: true
- name: Зависимости сборки (Linux)
if: runner.os == 'Linux'
run: sudo apt-get update -qq && sudo apt-get install -y -qq libgl1-mesa-dev libxkbcommon-dev
- name: Сборка
working-directory: lab-3
run: |
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release

View file

@ -1,90 +0,0 @@
name: Release
on:
push:
tags: ["v*"]
workflow_dispatch:
jobs:
windows:
name: Qt-клиент для Windows
runs-on: windows-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- uses: jurplel/install-qt-action@v4
with:
version: "6.8.*"
cache: true
- name: Сборка
working-directory: lab-3
run: |
cmake -B build
cmake --build build --config Release
- name: Программа с библиотеками Qt
run: |
New-Item -ItemType Directory dist/quizlab-client | Out-Null
Copy-Item lab-3/build/Release/lab-3.exe dist/quizlab-client/quizlab-client.exe
windeployqt --release --no-translations --no-system-d3d-compiler --no-opengl-sw dist/quizlab-client/quizlab-client.exe
# рантайм MSVC рядом с программой — чтобы не требовался Visual C++ Redistributable
foreach ($d in "msvcp140.dll","msvcp140_1.dll","vcruntime140.dll","vcruntime140_1.dll") { Copy-Item "$env:WINDIR\System32\$d" dist/quizlab-client/ }
Compress-Archive -Path dist/quizlab-client -DestinationPath quizlab-client-windows-x64.zip
- uses: actions/upload-artifact@v4
with:
name: windows
path: quizlab-client-windows-x64.zip
- name: Файл в релиз
if: startsWith(github.ref, 'refs/tags/')
env:
GH_TOKEN: ${{ github.token }}
run: gh release upload "${{ github.ref_name }}" quizlab-client-windows-x64.zip --clobber
linux:
name: Qt-клиент для Linux (AppImage)
runs-on: ubuntu-22.04
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- uses: jurplel/install-qt-action@v4
with:
version: "6.8.*"
cache: true
- run: sudo apt-get update -qq && sudo apt-get install -y -qq libgl1-mesa-dev libxkbcommon-dev libxcb-cursor0
- name: Сборка
working-directory: lab-3
run: |
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
- name: AppImage
env:
APPIMAGE_EXTRACT_AND_RUN: "1"
OUTPUT: quizlab-client-linux-x86_64.AppImage
run: |
wget -q https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
wget -q https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage
chmod +x linuxdeploy*.AppImage
mkdir -p appdir
cp lab-3/build/lab-3 quizlab-client
cp lab-3/icons/app.svg quizlab-client.svg
printf '[Desktop Entry]\nType=Application\nName=Quiz Client\nExec=quizlab-client\nIcon=quizlab-client\nCategories=Education;\n' > quizlab-client.desktop
export QMAKE=$(which qmake)
./linuxdeploy-x86_64.AppImage --appdir appdir -e quizlab-client -d quizlab-client.desktop -i quizlab-client.svg --plugin qt --output appimage
- name: Проверка — AppImage запускается и работает 5 секунд
run: |
sudo apt-get install -y -qq xvfb
xvfb-run -a ./quizlab-client-linux-x86_64.AppImage --appimage-extract-and-run > run.log 2>&1 &
sleep 5
cat run.log
pgrep -f quizlab-client > /dev/null || { echo "клиент завершился"; exit 1; }
echo "клиент работает"
- uses: actions/upload-artifact@v4
with:
name: linux
path: quizlab-client-linux-x86_64.AppImage
- name: Файл в релиз
if: startsWith(github.ref, 'refs/tags/')
env:
GH_TOKEN: ${{ github.token }}
run: gh release upload "${{ github.ref_name }}" quizlab-client-linux-x86_64.AppImage --clobber

View file

@ -2,9 +2,6 @@
[Русский](README.md) · **English** [Русский](README.md) · **English**
[![CI](https://github.com/EDeev/quizlab/actions/workflows/ci.yml/badge.svg)](https://github.com/EDeev/quizlab/actions/workflows/ci.yml)
[![Release](https://img.shields.io/github/v/release/EDeev/quizlab)](https://github.com/EDeev/quizlab/releases)
Three software architecture labs built around one application: a quiz REST API on Django REST Framework, Three software architecture labs built around one application: a quiz REST API on Django REST Framework,
the same API in Docker with four deployment options, and a C++/Qt desktop client using the Singleton and the same API in Docker with four deployment options, and a C++/Qt desktop client using the Singleton and
Adapter patterns. Adapter patterns.
@ -22,7 +19,7 @@ C++17 · Qt 6 (Widgets, Network) · CMake
| | What was built | Folder | | | What was built | Folder |
|---|---|---| |---|---|---|
| 1 | REST API: `Quiz` model, serializer, `ModelViewSet`, Faker test data generator, PostgreSQL | [`lab-1/`](lab-1) | | 1 | REST API: `Quiz` model, serializer, `ModelViewSet`, Faker test data generator, PostgreSQL | [`lab-1/`](lab-1) |
| 2 | The API in containers: gunicorn behind nginx, static files from a shared volume, own images in the `git.deev.su` registry | [`lab-2/`](lab-2) | | 2 | The API in containers: gunicorn behind nginx, static files from a shared volume, own images in the `dcr.deev.su` registry | [`lab-2/`](lab-2) |
| 3 | Desktop client for the API: five HTTP methods, table and text views, Singleton and Adapter | [`lab-3/`](lab-3) | | 3 | Desktop client for the API: five HTTP methods, table and text views, Singleton and Adapter | [`lab-3/`](lab-3) |
Deployment options in the second lab: Deployment options in the second lab:
@ -30,8 +27,8 @@ Deployment options in the second lab:
| Folder | Images | PostgreSQL | | Folder | Images | PostgreSQL |
|---|---|---| |---|---|---|
| `local/` | built from source | in a container | | `local/` | built from source | in a container |
| `web_pg/` | prebuilt `git.deev.su/deevev/quizlab` | in a container | | `web_pg/` | prebuilt `dcr.deev.su/deevev/lab2-*` | in a container |
| `web_lite/` | prebuilt `git.deev.su/deevev/quizlab` | external | | `web_lite/` | prebuilt `dcr.deev.su/deevev/lab2-*` | external |
| `caddy/` | built from source, Caddy instead of nginx, HTTPS with a self-signed certificate | in a container | | `caddy/` | built from source, Caddy instead of nginx, HTTPS with a self-signed certificate | in a container |
## How it works ## How it works
@ -65,10 +62,7 @@ docker compose up -d # API at http://localhost/api/quiz/
The other options run the same way from their folders. For `caddy/`, run `sh gen-cert.sh` first; the site The other options run the same way from their folders. For `caddy/`, run `sh gen-cert.sh` first; the site
opens at `https://localhost`. opens at `https://localhost`.
A prebuilt client is in the [releases](https://github.com/EDeev/quizlab/releases/latest): `quizlab-client-windows-x64.zip` The client (needs Qt 6 and CMake):
(unpack and run `quizlab-client.exe`) and `quizlab-client-linux-x86_64.AppImage` (`chmod +x` and run).
Building the client from source (needs Qt 6 and CMake):
```bash ```bash
cd lab-3 cd lab-3

View file

@ -2,9 +2,6 @@
**Русский** · [English](README.en.md) **Русский** · [English](README.en.md)
[![CI](https://github.com/EDeev/quizlab/actions/workflows/ci.yml/badge.svg)](https://github.com/EDeev/quizlab/actions/workflows/ci.yml)
[![Release](https://img.shields.io/github/v/release/EDeev/quizlab)](https://github.com/EDeev/quizlab/releases)
Три лабораторные по архитектуре программных систем, построенные вокруг одного приложения. Сначала Три лабораторные по архитектуре программных систем, построенные вокруг одного приложения. Сначала
REST API викторин на Django REST Framework, затем то же API в Docker в четырёх вариантах развёртывания, REST API викторин на Django REST Framework, затем то же API в Docker в четырёх вариантах развёртывания,
затем десктопный клиент на C++/Qt с паттернами Singleton и Adapter. затем десктопный клиент на C++/Qt с паттернами Singleton и Adapter.
@ -22,7 +19,7 @@ C++17 · Qt 6 (Widgets, Network) · CMake
| | Что сделано | Папка | | | Что сделано | Папка |
|---|---|---| |---|---|---|
| 1 | REST API: модель `Quiz`, сериализатор, `ModelViewSet`, генератор тестовых данных на Faker, PostgreSQL | [`lab-1/`](lab-1) | | 1 | REST API: модель `Quiz`, сериализатор, `ModelViewSet`, генератор тестовых данных на Faker, PostgreSQL | [`lab-1/`](lab-1) |
| 2 | API в контейнерах: gunicorn за nginx, статика из общего тома, свои образы в реестре `git.deev.su` | [`lab-2/`](lab-2) | | 2 | API в контейнерах: gunicorn за nginx, статика из общего тома, свои образы в реестре `dcr.deev.su` | [`lab-2/`](lab-2) |
| 3 | Десктопный клиент к API: пять HTTP-методов, таблица и текстовый вид, Singleton и Adapter | [`lab-3/`](lab-3) | | 3 | Десктопный клиент к API: пять HTTP-методов, таблица и текстовый вид, Singleton и Adapter | [`lab-3/`](lab-3) |
Варианты развёртывания во второй лабораторной: Варианты развёртывания во второй лабораторной:
@ -30,8 +27,8 @@ C++17 · Qt 6 (Widgets, Network) · CMake
| Папка | Образы | PostgreSQL | | Папка | Образы | PostgreSQL |
|---|---|---| |---|---|---|
| `local/` | собираются из исходников | в контейнере | | `local/` | собираются из исходников | в контейнере |
| `web_pg/` | готовые из `git.deev.su/deevev/quizlab` | в контейнере | | `web_pg/` | готовые из `dcr.deev.su/deevev/lab2-*` | в контейнере |
| `web_lite/` | готовые из `git.deev.su/deevev/quizlab` | внешний | | `web_lite/` | готовые из `dcr.deev.su/deevev/lab2-*` | внешний |
| `caddy/` | собираются из исходников, Caddy вместо nginx, HTTPS с самоподписанным сертификатом | в контейнере | | `caddy/` | собираются из исходников, Caddy вместо nginx, HTTPS с самоподписанным сертификатом | в контейнере |
## Как устроено ## Как устроено
@ -65,10 +62,7 @@ docker compose up -d # API на http://localhost/api/quiz/
Остальные варианты запускаются так же из своих папок. Для `caddy/` сначала выполните `sh gen-cert.sh`, Остальные варианты запускаются так же из своих папок. Для `caddy/` сначала выполните `sh gen-cert.sh`,
сайт откроется на `https://localhost`. сайт откроется на `https://localhost`.
Готовый клиент — в [релизах](https://github.com/EDeev/quizlab/releases/latest): `quizlab-client-windows-x64.zip` Клиент (нужны Qt 6 и CMake):
(распакуйте и запустите `quizlab-client.exe`) и `quizlab-client-linux-x86_64.AppImage` (`chmod +x` и запустить).
Сборка клиента из исходников (нужны Qt 6 и CMake):
```bash ```bash
cd lab-3 cd lab-3

View file

@ -2,7 +2,7 @@ name: lab2-web-lite
services: services:
backend_service: backend_service:
image: git.deev.su/deevev/quizlab:backend-1.0.0 image: dcr.deev.su/deevev/lab2-backend:1.0.0
command: > command: >
sh -c "python manage.py migrate && sh -c "python manage.py migrate &&
python manage.py collectstatic --no-input && python manage.py collectstatic --no-input &&
@ -14,7 +14,7 @@ services:
restart: unless-stopped restart: unless-stopped
nginx_service: nginx_service:
image: git.deev.su/deevev/quizlab:nginx-1.0.0 image: dcr.deev.su/deevev/lab2-nginx:1.0.0
ports: ports:
- "80:80" - "80:80"
volumes: volumes:

View file

@ -14,7 +14,7 @@ services:
- postgres_data:/var/lib/postgresql/data - postgres_data:/var/lib/postgresql/data
backend_service: backend_service:
image: git.deev.su/deevev/quizlab:backend-1.0.0 image: dcr.deev.su/deevev/lab2-backend:1.0.0
command: > # python manage.py createsuperuser --noinput && command: > # python manage.py createsuperuser --noinput &&
sh -c "python manage.py migrate && sh -c "python manage.py migrate &&
python manage.py shell -c 'from quiz.gentestdata import gentestdata; gentestdata()' && python manage.py shell -c 'from quiz.gentestdata import gentestdata; gentestdata()' &&
@ -30,7 +30,7 @@ services:
restart: unless-stopped restart: unless-stopped
nginx_service: nginx_service:
image: git.deev.su/deevev/quizlab:nginx-1.0.0 image: dcr.deev.su/deevev/lab2-nginx:1.0.0
ports: ports:
- "80:80" - "80:80"
volumes: volumes: