Проект поднимает ровно два сервиса:
app— демонстрационное Flask-приложение изhttps://github.com/moevm/devops-examples/tree/main/EXAMPLE_APP;tester— контейнер для запуска тестов. PID 1 в контейнере —python -m http.server 3000, сервер стартует из/workspace.
- Сборка обоих контейнеров из локальных Dockerfile:
Dockerfile_appDockerfile_tester
- Базовый образ:
ubuntu:22.04. - Зависимости apt и pip указаны с версиями.
- Приложение скачивается из репозитория при сборке, затем файлы
EXAMPLE_APPкопируются в контейнер. - Исправления приложения оформлены patch-файлом:
patches/example_app.patch. - Проверка HTML-бьютификации через
css-html-prettify. - Статический анализ через
pylint, включен только свой критерий: запрещено имя переменной, совпадающее с именем изFORBIDDEN_VARIABLE_NAME. - Интеграционные тесты через
requests: проверяются HTTP-коды возврата. - SSH-доступ в
testerпо публичному ключу. - Логи каждого этапа пишутся одновременно:
- в stdout/stderr контейнера, чтобы их было видно через
docker-compose logs tester; - в отдельный файл в
/workspace/logs.
- в stdout/stderr контейнера, чтобы их было видно через
- Публичный порт веб-приложения передается через
.env. - На оба контейнера задано ограничение памяти
510m:100 + 41 * 10 МБ.
Скопируйте пример env-файла:
cp .env.example .envПоложите существующий публичный ключ для SSH-доступа в tester:
cp ~/.ssh/id_ed25519.pub ssh/authorized_keysЕсли у вас другой ключ, укажите путь к нему вместо ~/.ssh/id_ed25519.pub.
docker-compose builddocker-compose up -dПроверить, что веб-приложение доступно на публичном порту из .env:
curl -i http://127.0.0.1:8080/docker-compose exec tester bash /workspace/tests/scripts/run_all.shHTML-бьютификация:
docker-compose exec tester bash /workspace/tests/scripts/run_beautify.shСтатический анализ с кастомным правилом pylint:
docker-compose exec tester bash /workspace/tests/scripts/run_lint.shИнтеграционные тесты кодов возврата:
docker-compose exec tester bash /workspace/tests/scripts/run_integration.shЛоги через docker-compose:
docker-compose logs testerФайлы логов внутри tester:
docker-compose exec tester ls -la /workspace/logs
docker-compose exec tester cat /workspace/logs/01_beautify_html.log
docker-compose exec tester cat /workspace/logs/02_pylint_custom.log
docker-compose exec tester cat /workspace/logs/03_integration_status_codes.logПорт задается в .env переменной TESTER_SSH_PUBLIC_PORT.
ssh -i ~/.ssh/id_ed25519 -p 2222 tester@127.0.0.1В .env поменяйте:
WEB_PUBLIC_PORT=8081Затем пересоздайте контейнеры:
docker-compose up -d --force-recreateПосле этого приложение будет доступно так:
curl -i http://127.0.0.1:8081/По умолчанию запрещено имя переменной ivan:
FORBIDDEN_VARIABLE_NAME=ivanМожно указать несколько вариантов через запятую:
FORBIDDEN_VARIABLE_NAME=ivan,иванДля демонстрации ошибки создайте временный файл внутри tester:
docker-compose exec tester bash -lc 'echo "ivan = 1" > /workspace/app/bad_name_demo.py'
docker-compose exec tester bash /workspace/tests/scripts/run_lint.shПосле проверки удалите временный файл:
docker-compose exec tester rm /workspace/app/bad_name_demo.pydocker-compose down -v