Настройка Jenkins для django проекта с нуля

    Всем привет.

    Значительное время в нашем проекте использовалась самописная система интеграционного тестирования — чекаут кода по хуку в системе контроля версий, прогонка тестов с поддержкой отчётов по покрытию кода, запись результатов в отдельный html-файл, который был доступен разработчикам через веб. Естественно, потом пришлось делать поддержку локов, чтобы одновременно не запускалось сразу два тестирования и т. п.

    В конце концов на ее поддержку стала уходить ощутимая часть рабочего времени, которая давно свела к нулю все преимущества простоты разработки такой системы, и было решено установить нормальный сервер Continuous Integration.

    В качестве новой системы был выбран Jenkins, о его установке и настройке для django-проекта и пойдет речь в этой статье. Кто заинтересовался, добро пожаловать под кат.


    Установка Jenkins


    В случае Ubuntu добавляем ключ и источник (source) для установки пакетов:
    wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
    vi /etc/apt/sources
    #add "deb http://pkg.jenkins-ci.org/debian binary/"

    В случае других ОС смотрим сюда:
    https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins

    Затем:
    
    apt-get update
    apt-get install jenkins
    

    После установки Jenkins запустится и будет слушать соединения на порту 8080, для того чтобы изменить порт, следует отредактировать в файле /etc/default/jenkins переменную HTTP_PORT (и другие переменные при необходимости)

    Установка плагинов


    Jenkins установлен и работает, теперь можно заняться установкой необходимых плагинов.

    Переходим в меню Manage Jenkins -> Manage Plugins, вкладка Available. Выбираем необходимые нам плагины:
    • Cobertura Plugin (Покрытие кода)
    • Violations Plugin (Отчеты о коде — pylint, pyflakes, pep8)
    • Git/Mercurial/SVN Plugin — кто что использует, так как мы используем Git, то далее на скриншотах будут показаны опции для GIT Plugin.


    Django Jenkins


    Для интеграции тестов django с сервером Jenkins будем использовать пакет django-jenkins (Кстати его автор, kmmbvnr, присутствует на хабре, передаю привет!). Пакет генерирует отчёты в xml-формате по всем выполненным тестам, плюс генерирует отчёты статических анализаторов кода. Эти отчёты затем обрабатываются собственно сервером Jenkins.

    Установка:
    
    pip install django-jenkins
    pip install pep8
    pip install pyflakes
    

    Добавляем настройки для нашего django проекта:
    INSTALLED_APPS += ('django_jenkins',)
    JENKINS_TASKS = ('django_jenkins.tasks.run_pylint',
                     'django_jenkins.tasks.run_pep8',
                     'django_jenkins.tasks.run_pyflakes',
                     'django_jenkins.tasks.with_coverage',
                     'django_jenkins.tasks.django_tests',)
    

    Теперь у нас есть команда manage.py jenkins, которая будет выполнять тесты и создавать отчёты для Jenkins. Сейчас можно попробовать запустить её, чтобы посмотреть, что всё работает без ошибок. В случае успеха должен создаться каталог build с отчётами.

    Настройка Jenkins


    Данная часть статьи является немного переработанным оригинальным руководством по django-jenkins: https://sites.google.com/site/kmmbvnr/home/django-hudson-tutorial

    Итак, создаём новый проект: New Job -> Build a free-style software project





    Настраиваем взаимодействие с SCM:



    При указании repository browser Jenkins будет показывать ссылки на diff-файл ревизий при просмотре списка изменений в сборке.

    Настраиваем проверку SCM на наличие изменений раз в полчаса:





    Добавляем выполнение команды из django-jenkins (Add build step -> execute shell):





    Выбираем Publish Cobertura Coverage Report и прописываем путь к отчёту:





    Выбираем Publish JUnit test result report и также прописываем путь к отчётам:





    Выбираем Report Violations и снова прописываем пути к отчётам:






    Настраиваем email -уведомления если требуются:





    Интеграция Selenium тестов


    Для возможности запуска Selenium тестов в Jenkins, если таковые имеются, я добавил
    класс JenkinsTestRunner в библиотеку django-selenium, о которой писал в своей предыдущей статье.

    Результаты


    Всё настроено, можно нажать на Build Now и наслаждаться результатами:


    А потом и заняться исправлением ошибок.

    Спасибо за внимание.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 18

      +5
      Думаю, хорошей идеей было бы хранить питонячьи зависимости в vcs в файлике requirements.txt, и создавать virtualenv для каждого проекта. Что-нибудь вроде этого:
      pip install -sr requirements.txt -E /home/venvs/<project>
      /home/venvs/<project>/bin/python manage.py jenkins [app_list]
      

        0
        Спасибо, очень кстати, сам я плохо разбираюсь в лучших практиках использования virtual env.
          +1
          А особенно хорошей идеей при использовании CI будет использовать ещё и кэш пакетов, что сильно экономит время билда.

          Вот пример скрипта деплоя, который использует кэш и разделение зависимостей для ускорения: gist.github.com/847813#file_buildenv.sh
            0
            Еще можно просто задавать переменную окружения PIP_DOWNLOAD_CACHE.
              0
              Да, так проще, если всё на одном хосте тестируется, деплоится и разрабатывается (;
          +1
          Я настроил недавно jenkins для PHP-проекта. Ничего не скажу — по удобству опережает CruiseControl+PHPUnderControl, другого не пробовал. Но есть один баг/фича — в codebrowser файлы выводятся полностью на главной странице вне зависимости от вложенности в файловой системе — пример можно посмотреть тут: http://ci.thephp.cc/job/bankaccount/Code_Browser/?. Такой подход хорош когда в проекте пара десятков файлов. У нас же — тысячи (8781 файл, 1002 директории), в игноре примерно половина. Получается — codebrowser прекрасно генерирует файлик отчёта (html), но жопа наступает на этапе его отображения — всё пипец как тормозит (подозреваю — навешиваются события яваскриптовые либо тяжёлые обходы/селекотры) и в конце концов хром крашится.

          Так вот вопрос — можно ли как-то список файлов отображать также иерархично, как и в файловой системе?

          Мой вопрос на stackoverflow — так на него никто и не ответил, просмотрели ажно 4 раза :)
            0
            Тут я тоже не смогу помочь — у нас code browser в redmine.
            +2
            Настройку Jenkins CI для любого типа проектов нельзя считать завершенной без установки вот этого очень важного плагина ;)!
            +1
            Не подскажете как прикрутить нагрузочное тестирование? Что бы можно было видеть как производительность меняется от версии к версии, в виде графика например.
              0
              Смотря что использовать для нагрузочного тестирования. Я работал только с Apache Jmeter, вот здесь есть неплохая статья как прикрутить его к Jenkins: http://lincolnloop.com/blog/2011/oct/12/load-testing-jmeter-part-2-headless-testing-and-je/. И графики есть вроде бы которые вам нужны.

                0
                Спасибо, как вариант можно попробовать.
              +2
              Спасибо, как раз под руку.
                0
                PyLint и на вашем скриншоте показывает лошадиное количество ошибок.
                К сожалению, многие из багов в отчете таковыми не являются.
                Вы занимались его настройкой для Django-проектов?
                Или интеграцией django-lint?
                Может быть поделитесь своим pylint.rc?
                  0
                  2500 это еще не так много, я не знаю ваш случай, но в нашем случае большинство ошибок правильные (). К тому же хоть на графике и написано pylint, на самом деле это суммарные ошибки pylint, pyflakes и pep8. Многие из них дублируются, поэтому при исправлении одной — на само деле исправляешь 3.

                  Посмотрите вот сюда чтобы увидеть по-настоящему большое количество ошибок: )
                  jenkins.shiningpanda.com/nltk/job/NLTK-py2.5/63/
                    0
                    Ну, есть специфичные для Django косяки. Пример:
                    E1101: Instance of 'ForeignKey' has no '<field_name>' member

                    Я только взвел все это дело и душа перфекциониста жаждет только правильных ошибок.
                    Видимо, придется допиливать django-jenkins и django-lint для этих целей.
                      0
                      Да, есть такие косяки, но по моему опыту они o() малое от остальных.

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое