Яндекс.Метрика

    Питон

    Интеграция shared hosting и SVN

    Этот скрипт более исследовательский, чем предназначен для серьезных групп разработчиков. Создавался мною чтобы изучить python получше. Но тем не менее, я успешно пользуюсь им более полугода.

    Данная статья для тех разработчиков, которые ведут некоторый проект в SVN, имея удаленный сервер, доступ к которому есть по ftp и ssh, но устанавливать на который ничего нельзя.

    схема деплоя

    Схема деплоя у меня очень простая — я просто обновляю файлы на удаленном сервере. Именно это и реализовано с помощью скрипта.

    Разработчик закрепляет код в хранилище. После этого запускается (автоматически или вручную) скрипт на питон, который загружает обновленные файлы на сервер и удаляет старые. У меня скрипт запускается автоматически, благодаря тому, что я использую БилдСервер CruiseControl (java), который наблюдает за хранилищем и позволяет мне выполнять некоторые события, увидев, что в хранилище появилась более новая версия кода.
    Требования к окружению
    1. Сервер в локальной сети
      • хранилище SVN, svn.exe добавлен в PATH
      • установленный python 2.5, python.exe добавлен в PATH
      • доступ к SSH. У меня есть урезанная версия cygwin, на которой есть фактически только ftp+ssh, поэтому буду рассчитывать что и у вас она есть.

    2. Удаленный сервер
      • подняты ssh, ftp
      • нет возможности установить сторонний софт

    3. В папке сервера C:\Program Files\CruiseControl\projects\project1 хранится рабочая копия кода, синхронизированная с той, что на production сервере. То есть фактически, совпадает код на production сервере и в этой папке.
    4. Скрипт находится по пути C:\svn\apply_svn_changes\publish_web_site.py
    5. У пользователя из под которого вы запускаете скрипт есть права выходить в интернет по ftp и ssh, а так же запускать файлы на данном сервере.
    6. Сайт на production сервере находится в папке web/project относительно домашней папки ftp.

    Скрипт запускатся из консоли так:
    > python C:\svn\apply_svn_changes\publish_web_site.py -c "C:\Program Files\CruiseControl\projects\project1\source" --host ftp_user@production.com -p ftp_password -d sites/ms

    Скрипт смотрит в папку «C:\Program Files\CruiseControl\projects\project1\source», где узнает текущую версию кода, версию кода в хранилище. Он сравнивает их, узнавая какие файлы и папки следует удалить, а какие — закачать заново или создать. Это делается с помощью команды svn diff . После этого он составляет план выполнения задач, сохраняя план во временной папке.
    Скрипт открывает план, коннектится по ftp к указанному серверу и начинает план исполнять.
    После чего отключается. Все изменения пишет в лог.

    Основной код на pastebin, весь скрипт на depositfiles.

    Попробуйте так же запустить скрипт с ключом --help
    python "C:\svn\apply_svn_changes\publish_web_site.py" --help
    1. ssh нужен лишь для того, чтобы осуществить удаление папок с сервера с помощью rm -rf ./[...] (это дурацкий нарост на общей гладкости системы, хак, но мне пришлось пойти на него).