Октябрь 18, 2008
Continuous Integration в django проекте
Предпосылки
Проект относительно небольшой с командой из 4 разработчиков. Хотелось процесс разработки максимально приблизить к описанному в книге Continuous Integration: Improving Software Quality and Reducing Risk Были поставлены требования:
- юнит-тестинг
- проверка кода на соответствие стандартам
- автоматизированный подъем проекта на сервере для тестирования
- быстрый прогон тестов (до 10 секунд)
Юнит-тестинг
Доктест сразу отпал (с тдд маловато общего). В юнит-тестинге сразу столкнулся со сложностью:
отсюда
- The models.py file. The test runner looks for any subclass of unittest.TestCase in this module.
- A file called tests.py in the application directory — i.e., the directory that holds models.py. Again, the test runner looks for any subclass of unittest.TestCase in this module
Стандартный механизм запуска тестов требует, чтоб в тесты были плотно интегрированны в рабочий проект. С чем лично я не согласен. Считаю, что тесты должны быть отделены от продакшн кода и должны лежать в отдельной директории. Также не устраивало, что джанго создает MySql тестовую базу данных, что сильнейшим образом замедляет выполнение тестов.
С базой данной проблема решалась путем замены MySql на Sqlite (: memory: — она в оперативной памяти) во время тестинга (решение отсюда).
Для того чтоб тесты лежали в отдельной директории, в этой же директории был создан файлик suite.py, в котором приблизительно в таком виде все происходит Вот две функции из кода выше:
Для моков используем PyMock — довольно таки неудобная штука, в плане своих мало информативных эрроров (иннапроприейт экшн). Вроде есть либы получше.
Проверка кода на соответствие стандартам
Для проверки кода используется утилита pep8 Внедрялось с некоторым недовольством со стороны разработчиков. Но довольно таки полезная вещь для поддержания порядка в коде.
Билд-сервер
Можно сказать, что какой там билд сервер может быть в питоне и что там билдить. Я не знаю как его назвать иначе. В моем случае это сервер с Windows, на котором стоит TeamCity. Очень удобная штука в работе, с отличным веб интерфейсом. Конфигурить очень просто и быстро. Позволяет делать Pre-tested Commit (в моем случае не очень хорошо работало). Он периодично проверяет SVN (мы его используем) на наличие изменений и запускает билд скрипт- в моем случае это обычный build.bat файл, который делает апдейт из свн, выполняет тесты и рестартует Apache, который у нас на сервере. С этого момента проект можно открывать и тестировать на билд сервере. Участники проекта, в зависимости от конфигурации оповещений узнают об успешности или провале билда.
Реалии проекта и планы
Для команды это первый проект с использованием Contineous Integration. Как и первый серьезный django проект. Дедлайн как всегда очень рядом. Вероятно, не все звенья процесса разработки близки к идеалу, но процесс есть и работает. В планах внедрить Selenium тесты, cделать автоматизированный деплой проекта в продакшн.



А почему использовался pep8, а не pylint?
Очень хороший вопрос, в силу того, что это мой первый проект на питоне, вероятно многих хороших инструменов еще не знаю. Посмотрю, и возможно внедрю в проект.
А что используется для управления проекта? В смысле bug tracker, wiki и так далее.
Использую trac + bitten (плагин для continuous integration) и очень советую. Все вместе поднимается за час.
Selenium тоже отлично интегрируется с bitten и позволяет рисовать красивые графики. Вот пример bitten’а http://bitten.edgewall.org/build/trunk
А насчет pylint’а, то помимо того что его можно прогонять как шаг при очередном build'e, он еще отлично интегрируется в eclipse+pydev что позволяет видеть не аккуратности и ошибки еще на этапе написания кода, до помещения в SVN.
Очень интересно.
Мы используем самописный баг трекер для раздачи тасок (там ничего лишнего и заточено под нас). Инфу по проекту храним в обычном вики. Трек видели, но по сравнению с нашим интранетом выглядит монстрячно.
Основная штука которая привлекает это то что в trac’е можно ставит ссылки на commit’ы и тикеты взаимно и не напрягаясь.
Если нужна помощь с поднятием и/или интеграцией — пишите, поможем:)
Интересно почитать про первый опыт на джанго)))..
Самому прийдется скоро фактически сделать тоже самое. Учтем опыт коллег))
Помоему bitten для trac будет в самый раз.
Спасибо за пост!