This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
courses:devops:project [2022/02/22 17:38] mark |
courses:devops:project [2024/03/01 13:58] (current) korytov.pavel |
||
---|---|---|---|
Line 10: | Line 10: | ||
* Не использовать Expose | * Не использовать Expose | ||
* При установке любых пакетов и программ (в том числе в requirements) ВСЕГДА указывать версии | * При установке любых пакетов и программ (в том числе в requirements) ВСЕГДА указывать версии | ||
+ | * Ограничить установку зависимостей apt одной строкой (один RUN) | ||
+ | * Если настройка одной части приложения состоит из нескольких команд -> необходимо разместить их в одном слое (в одном RUN) | ||
+ | |||
Docker-compose: | Docker-compose: | ||
Line 16: | Line 19: | ||
* Не использовать тип сети HOST | * Не использовать тип сети HOST | ||
* Не отрывать лишних (непредусмотренных заданием) портов | * Не отрывать лишних (непредусмотренных заданием) портов | ||
+ | * Не использовать порты хост-машины <=1024 | ||
===== Варианты заданий ===== | ===== Варианты заданий ===== | ||
Line 30: | Line 34: | ||
* Проверка на соответствие стилю кодирования / бьютификакция - подключаем проверку стиля кодирования (технологии ниже) и встраиваем ее в цепочку запуска | * Проверка на соответствие стилю кодирования / бьютификакция - подключаем проверку стиля кодирования (технологии ниже) и встраиваем ее в цепочку запуска | ||
* Проверка на pep8 - используем https://pypi.org/project/pep8/ | * Проверка на pep8 - используем https://pypi.org/project/pep8/ | ||
- | * Приведение к pep8 - https://pypi.org/project/autopep8/ | + | * Форматирование Python (yapf) - https://github.com/google/yapf |
+ | * Форматирование Python (black) - https://github.com/psf/black | ||
+ | * Форматирование Python (flake8) - https://github.com/PyCQA/flake8 | ||
+ | * Форматирование HTML, JS (prettier) - https://prettier.io | ||
+ | * Форматирование Python (pindent) - http://svn.python.org/projects/python/trunk/Tools/scripts/pindent.py | ||
+ | * Форматирование Python (pybetter) - https://github.com/lensvol/pybetter | ||
+ | * Форматирование Python (ssort) - https://github.com/bwhmather/ssort | ||
+ | * Форматинование Pyhton (usort) - https://github.com/facebook/usort | ||
* Проверка бьютификатором для HTML - https://pypi.org/project/html-linter/ | * Проверка бьютификатором для HTML - https://pypi.org/project/html-linter/ | ||
* Причесывание бьютификатором HTML - https://pypi.org/project/css-html-prettify/ | * Причесывание бьютификатором HTML - https://pypi.org/project/css-html-prettify/ | ||
Line 36: | Line 47: | ||
* Статический анализ - подключаем статическую проверку (через pylint) и встраиваем ее в цепочку запуска | * Статический анализ - подключаем статическую проверку (через pylint) и встраиваем ее в цепочку запуска | ||
* **Анализ по 10 существующим критериям** - выберите по 10 уникальных критериев проверки, настройте запуск на них и допустите все десять ошибок в коде проекта:) | * **Анализ по 10 существующим критериям** - выберите по 10 уникальных критериев проверки, настройте запуск на них и допустите все десять ошибок в коде проекта:) | ||
- | * **Создание своего критерия и проверка толко по нему** - проверяем на наличие переменных, название которых совпадает с вашим именем | + | * **Создание своего критерия и проверка только по нему** - проверяем на наличие переменных, название которых совпадает с вашим именем |
* Интеграционные тесты - пишем интеграционные тесты (через requests) и встраиваем их в цепочку запуска | * Интеграционные тесты - пишем интеграционные тесты (через requests) и встраиваем их в цепочку запуска | ||
* Проверка на коды возврата | * Проверка на коды возврата | ||
* Проверка на заголовки | * Проверка на заголовки | ||
* Проверка на загрузку файла | * Проверка на загрузку файла | ||
- | * Selenium - пишем selenium тесты и встраиваем их в цепочку запуска | + | * Selenium - пишем selenium тесты и встраиваем их в цепочку запуска (нельзя использовать для selenium отдельный контейнер, реализуйте тесты в рамах контейнера tester). См. описание ниже. |
- | * **Заполнение формы авторизации (включая проверку верстки страницы)** - тест на заполнение формы и проверка ответа сервера, + проверка верстки страницы (ее динамической части) | + | |
- | * **Правка html кода страницы** - вносим свои изменения в код страницы (добавляем лишние кнопки, меняем атрибуты полям - проверяем) | + | |
- | * **Загрузка и получение файлов** - проверка роутов на загрузку и получение файлов | + | |
- | * **Переадресация, корректные коды возврата** - проверка запросов с переадресацией, проверка кодов возврата | + | |
- | * **Отлов js исключений в консоли** - для этого задания вам потребуется модифицировать шаблон веб-страницы добавлением обработчика для ошибок js (рекомендую собирать ошибки в атрибут тега), а в selenium проверять содержимое этого тега | + | |
- | * **Получение списка преподавателей каф. МОЭВМ** - работаем не с демо приложением, а со страницей кафедры на сайте ЛЭТИ. Силами selenium (через запуск js кода) извлекаем список | + | |
- | * **Поиск и обнаружение ошибок в консоли JS** - | + | |
- | * **Получение списка сертификатов пользователя по ссылке на профиль Stepik** - работаем не с демо приложением, а со stepik.org. Силами selenium (через запуск js кода) извлекаем список | + | |
- | * **Получение списка PR в открытом github репозитории** - | + | |
* Docker | * Docker | ||
- | * Внешний SSH доступ в контейнеры - организуем доступ или по ключу в каталоге с проектом, или генерируем пароль для доступа и сообщаем его при сборке / запуске, или генерируем новую пару ключе и выводим их в файлы. | + | * Внешний SSH доступ в контейнеры - организуем доступ через протокол SSH контейнер одним из следующих способов: или по ключу в каталоге с проектом, или генерируем пароль для доступа и сообщаем его при сборке / запуске, или генерируем новую пару ключе и выводим их в файлы. Порт для SSH должен быть доступен снаружи docker-compose конфигурации. |
* В app - по публичному ключу (существующему) | * В app - по публичному ключу (существующему) | ||
* В tester - по публичному ключу (существующему) | * В tester - по публичному ключу (существующему) | ||
Line 70: | Line 72: | ||
* **Порт для веб-сервера** - публичный порт, на котором слушает веб-сервер | * **Порт для веб-сервера** - публичный порт, на котором слушает веб-сервер | ||
* **Список этапов тестирования для запуска** - список шагов из пункта "Построение тестов", которые будут запущены. Если не задано, запускаем все этапы. Если задано - то только указанные. | * **Список этапов тестирования для запуска** - список шагов из пункта "Построение тестов", которые будут запущены. Если не задано, запускаем все этапы. Если задано - то только указанные. | ||
- | * **Публичный SSHключ для доступа в контейнер(ы)** - | + | * **Публичный SSHключ для доступа в контейнер(ы)** - это отдельный ключ, не связанный с заданием "Внешний SSH доступ в контейнеры" из предыдущего раздела. |
* **Ключ отладки для Flask** - флаг отладочной работы (debug) для Flask приложения | * **Ключ отладки для Flask** - флаг отладочной работы (debug) для Flask приложения | ||
* Органичения ресурсов - ограничения ресурсов для контейнеров в docker-compose.yml | * Органичения ресурсов - ограничения ресурсов для контейнеров в docker-compose.yml | ||
* **ОЗУ** - ограничьте доступную каждому из контейнеров ОЗУ до объема 100 + НОМЕР_ВАРИАНТА * 10 МБ | * **ОЗУ** - ограничьте доступную каждому из контейнеров ОЗУ до объема 100 + НОМЕР_ВАРИАНТА * 10 МБ | ||
- | * **Ядра процессора** - ограничьте доступные в каждом контейнере количество ядер ЦПУ до НОМЕР_ВАРИАНТА % 2 (остаток от деления номера вашего варианта на два) | + | * **Ядра процессора** - ограничьте доступные в каждом контейнере количество ядер ЦПУ до (1 + НОМЕР_ВАРИАНТА % 2) (остаток от деления номера вашего варианта на два) |
* **Максимальное Количество процессов** - ограничьте до количества НОМЕР_ВАРИАНТА | * **Максимальное Количество процессов** - ограничьте до количества НОМЕР_ВАРИАНТА | ||
+ | |||
+ | === Selenium-тесты === | ||
+ | Задача в написании Selenium-тестов - написать автотесты для нескольких форм ИС ИОТ. Тестовый инстанс находится по адресу https://dev.digital.etu.ru/trajectories-test/. | ||
+ | |||
+ | Тест должен включать в себя следующие шаги: | ||
+ | |||
+ | - Авторизация через ETU ID. | ||
+ | * Используйте ваш логин/пароль из ЛК ЛЭТИ. Укажите их в .env-файле, коммитить в репозиторий **не нужно** | ||
+ | * Вы должны получить в системе права администратора. Если не получите - пингуйте нас в Discord. | ||
+ | * В системе все персональные данные заменены на сгенерированные. | ||
+ | - Если ваш вариант включает в себя работу с ОПОП, РП или формой "Распределение документов", авторизуйтесь за пользователя id=1305 (Schimmel Вадим August) на форме "Авторизация за другого пользователя". У этого пользователя есть все права на все документы. | ||
+ | - Проверьте функционирование формы, указанной в задании: | ||
+ | * Инструкции по формам есть по ссылке: https://digital.etu.ru/doku.php?id=navigation:iot | ||
+ | * Большинство форм включают в себя сохранение какого-то состояния (вкладки документа, выдача прав и т.п.). В таком случае задача - ввести в форму какие-то значения (не обязательно осмысленные), сохранить, обновить страницу и проверить, что внесенные данные сохранены. | ||
+ | * В работе с документами - можете создать новый документ или взять существующий в статусе "черновик". Если создаете новый, не забудьте удалить. | ||
+ | * В работе с документами - берите документы с кафедрой, соотвествующей вашему положению в таблице "Варианты заданий" (см. ниже). Так мы избежим конфликтов из-за одновременного выполнения тестов. | ||
+ | * В работе с пользователями - берите пользователей, у которых фамилия соответствует вашей сгенерированной (можно посмотреть сверху в сайдбаре). | ||
+ | | ||
+ | === Перечень кафедр === | ||
+ | |||
+ | Кафедра, в которой вы работаете = (ваш номер в "Варианты заданий") % 40 + 1. | ||
+ | |||
+ | Кафедры: | ||
+ | |||
+ | - каф.АМ | ||
+ | - каф.ЛИНС | ||
+ | - каф.ЭПУ | ||
+ | - каф.ИИСТ | ||
+ | - каф.ВМ | ||
+ | - каф.МНЭ | ||
+ | - каф.РАПС | ||
+ | - каф.ЭП | ||
+ | - каф.ЭУТ | ||
+ | - каф.ФЛ | ||
+ | - каф.ИМ | ||
+ | - каф.ТВ | ||
+ | - каф.МОЭВМ | ||
+ | - каф.МСК | ||
+ | - каф.БЖД | ||
+ | - каф.СО | ||
+ | - каф.ВТ | ||
+ | - каф.САПР | ||
+ | - каф.ФЭТ | ||
+ | - каф.Фот | ||
+ | - каф.МВЭ | ||
+ | - каф.ПМИГ | ||
+ | - каф.ИНЯЗ | ||
+ | - каф.ТОЭ | ||
+ | - каф.СП | ||
+ | - каф.ПЭ | ||
+ | - каф.ТОР | ||
+ | - каф.БТС | ||
+ | - каф.РС | ||
+ | - каф.САУ | ||
+ | - каф.ИКГП | ||
+ | - каф.ЭТПТ | ||
+ | - каф.РЯ | ||
+ | - каф.МИТ | ||
+ | - каф.ФХ | ||
+ | - каф.РЭС | ||
+ | - каф.ИЗОС | ||
+ | - каф.АПУ | ||
+ | - каф.ИС | ||
+ | - каф.ФВиС | ||
+ | |||
+ | |||
+ | Это не все кафедры ЛЭТИ, только те, по которым есть более 100 РП. | ||
==== Варианты средней сложности ==== | ==== Варианты средней сложности ==== | ||
- | Вам необходимо реализовать docker-compose конфигурацию из двух узлов: | + | Вам необходимо реализовать docker-compose конфигурацию из двух узлов (не больше и не меньше): |
* app - контейнер с существующим демонстрационным веб-приложением (https://github.com/moevm/devops-examples/tree/main/EXAMPLE_APP). | * app - контейнер с существующим демонстрационным веб-приложением (https://github.com/moevm/devops-examples/tree/main/EXAMPLE_APP). | ||
* Устанавливать приложение необходимо скачивая репозиторий https://github.com/moevm/devops-examples и копируя файлы из него при сборке вашего контейнера:) | * Устанавливать приложение необходимо скачивая репозиторий https://github.com/moevm/devops-examples и копируя файлы из него при сборке вашего контейнера:) | ||
* Чтобы все заработало, вам придется потратить время и поразбираться - из коробки может не работать. | * Чтобы все заработало, вам придется потратить время и поразбираться - из коробки может не работать. | ||
* Возможно, вам для выполнения заданий потребуются фиксы в исходник - делайте для них патчи ( https://man7.org/linux/man-pages/man1/patch.1.html) | * Возможно, вам для выполнения заданий потребуются фиксы в исходник - делайте для них патчи ( https://man7.org/linux/man-pages/man1/patch.1.html) | ||
- | * tester - контейнер для запуска тестов (состав и особенности тестов задаются в таблице вариантов) | + | * Корнем дерева процессов выступает запущенное веб-приложение |
+ | * tester - контейнер для запуска **всех** тестов (состав и особенности тестов задаются в таблице вариантов) | ||
+ | * Корнем дерева процессов выступает стандартный python http сервер (python -m http.server 3000) | ||
+ | * Этот сервер должен быть запущен в каталоге контейнера, где будет происходить работа тестовых скриптов | ||
+ | * Тестовые скрипты запускаются через docker exec | ||
+ | |||
Оба контейнера должны использовать написанные вами образы, собираемые из локальных Dockerfile. Шаблоны для имен Dockerfile: | Оба контейнера должны использовать написанные вами образы, собираемые из локальных Dockerfile. Шаблоны для имен Dockerfile: | ||
* Dockerfile_app | * Dockerfile_app | ||
* Dockerfile_tester | * Dockerfile_tester | ||
+ | |||
+ | Помимо Dockerfile, вам также необходимо сделать файл README.md, содержащий примеры команд для запуска тестов и проверки всей конфигурации. Это сильно ускорит проверку:) | ||
+ | |||
Параметры конфигурации задаются в таблице вариантов + общие требования ([[http://se.moevm.info/doku.php/courses:devops:project#общие_требования]]). | Параметры конфигурации задаются в таблице вариантов + общие требования ([[http://se.moevm.info/doku.php/courses:devops:project#общие_требования]]). | ||
Line 95: | Line 173: | ||
==== Варианты высокой сложности ==== | ==== Варианты высокой сложности ==== | ||
- | Будут, но в 2023. | + | 1. Автоматизация тестирования курсовых по Android |
+ | |||
+ | Идея - разработать набор github actions, которые будут по состоянию репозитория проверять (базово) соответствие этапам выполнения работы и генерировать / отображать статус в readme. | ||
+ | |||
+ | Подробности об этапах: | ||
+ | |||
+ | https://se.moevm.info/doku.php/staff:courses:application_development_for_mobile_platforms:course_work:topics | ||
+ | |||
+ | Проверяем: | ||
+ | - Макет и UC (есть вики страница, файл макета загружен в репо) | ||
+ | - UI на заглушках (если задан нужный тег- проверяем наличие исходников андроид проекта, его собираемость через github actions, .gitignore , название пакета ) | ||
+ | - Юнит-тесты ( тег, сборка и запуск) | ||
+ | - App is ready (тег, требования, запуск, запуск стресстестов) | ||
+ | - Оценка сложности UI вашего приложения (вики станица и ее содержимое) | ||
+ | - Пояснительная записка (наличие файлов ) | ||
+ | - Интеграционные тесты ( тег, сборка и запуск) | ||
+ | |||
+ | Используем в качестве технологий github actions. Сдаем отдельным репо. | ||
+ | |||
+ | 2. Проверка корректности учебных работ на языке Python (командная строка) | ||
+ | |||
+ | Идея - автоматизировать процесс проверки лабораторных и курсовых работ. | ||
+ | |||
+ | Для проверки кода - pylint, для тестирования работы в командной строке https://github.com/cucumber/aruba, для профилирования работы - valgrind. | ||
+ | |||
+ | Формат выполнения github actions. Сдаем отдельным репо. | ||
+ | |||
+ | Этапы проверки | ||
+ | * Успешная проверка на явные синтаксические проблемы через линтер(не запустится, нет комментов, невменяемые имена переменных....) | ||
+ | * Успешное тестирование работы на заранее известных примерах аргументов командной строки (== приложение не падает с заранее известными аргументами ) | ||
+ | * Стресс-тестирование аргументов командной строки (проверка, что если подавать почти рандомные аргументы, приложение не сломается. Аргументы необходимо генерировать рандомно, но в соответствии с описанием ожидаемой структуры ) | ||
+ | * Стресс-тестирование stdin | ||
+ | * Профилирование работы по памяти и времени ( valgrind + time) | ||
+ | |||
+ | 3. Проверка корректности учебных работ на языке С (командная строка) | ||
+ | |||
+ | Аналогично теме 2, но компилируем в gcc (и проверяем что все ок с компиляцией) + другие линтеры. | ||
+ | |||
===== Правила оценивания ===== | ===== Правила оценивания ===== | ||
Line 106: | Line 222: | ||
+ | Подробно о процедуре проверки https://docs.google.com/document/d/1iqn_jtQ7yP_jgMv1a-jw3qriWTVHDyAeEPAnQT51tl8/edit | ||
===== Правила работы в репозитории ===== | ===== Правила работы в репозитории ===== | ||
Все работы сдаются только и исключительно в виде PR в репозиторий курса. Подробно: | Все работы сдаются только и исключительно в виде PR в репозиторий курса. Подробно: | ||
- | https://github.com/moevm/devops-1h2022/blob/main/README.md | + | https://github.com/moevm/devops-1h2024/blob/main/README.md |
===== По работе в selenium ===== | ===== По работе в selenium ===== | ||
Line 118: | Line 235: | ||
* Примеры скриптов и тестов https://github.com/moevm/devops-examples/tree/main/selenium_tests | * Примеры скриптов и тестов https://github.com/moevm/devops-examples/tree/main/selenium_tests | ||
* Курс https://stepik.org/course/575 | * Курс https://stepik.org/course/575 | ||
+ | * Старая, но актуальная лекция про Selenium https://www.youtube.com/watch?v=gLj6BMmI69I |