войти зарегистрироваться

Разработка whois

индекс
174,05

Поднимаем subversion для приятной разработки

В один прекрасный день мне надоело заливать по ftp\ssh все изменения, внесённые в проект. К этому моменту я уже вынашивал идею перенести разработку под управление SVN — контроль версий, всё-таки приятная штука. В итоге было решено совместить приятное с полезным — и контроль версий, и автоматическое обновление проекта. По традиции — повествование будет вестись на примере моего любимого debian'a.
Заметку можно считать дополнением статьи svn tips (по крайней мере — первого пункта).

Про установку\настройку SVN можно почитать в следующих топиках:Создаём init-скрипт, для запуска svn-сервера с системой (изначально — скрипт был найден где-то на просторах интернета. вроде бы, я в нём что-то менял :) ).
/etc/init.d/svn:
#!/bin/sh -e
#
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6

# Get LSB functions
. /lib/lsb/init-functions
. /etc/default/rcS

SVNSERVE=/usr/bin/svnserve
SVN_USER=subversion
SVN_GROUP=www-data
SVN_REPO_PATH=/usr/share/svn/

# Check that the package is still installed
[ -x $SVNSERVE ] || exit 0;

case "$1" in
 start)
  log_begin_msg "Starting svnserve..."
  umask 002
  if start-stop-daemon --start --chuid $SVN_USER:$SVN_GROUP --exec $SVNSERVE -- -d -r $SVN_REPO_PATH
  then
   log_end_msg 0
  else
   log_end_msg $?
  fi
 ;;
 stop)
  log_begin_msg "Stopping svnserve..."
  if start-stop-daemon --stop --exec $SVNSERVE
  then
   log_end_msg 0
  else
   log_end_msg $?
  fi
 ;;
 restart|force-reload)
  "$0" stop && "$0" start
 ;;
 *)
  echo "Usage: /etc/init.d/svn {start|stop|restart|force-reload}"
  exit 1
 ;;
esac
exit 0
Дадим всем право на исполнение, настоятельно порекомендуем системе запускать svn при старте и заодно стартанём его:
chmod a+x /etc/init.d/svn
update-rc.d svn defaults
invoke-rc.d svn start
Настроим обновление рабочей копии при коммите — хук /usr/share/svn/hooks/post-commit:
#!/bin/sh
exec > /tmp/svnup 2>&1
# весь вывод скрипта будет направлен в файл /tmp/svnup
for path in `svnlook dirs-changed /usr/share/svn | fgrep '/trunk/' | cut -d '/' -f 2- | sort -u`
# получаем список директорий, изменённых в коммите, отрезаем первую
# часть (в моей репе - /trunk) и, если такой путь есть — делаем там svn up
do
        if [ -d "/var/www/$path" ]
        then
                echo $path
                /usr/bin/svn up -N /var/www/$path
        fi
done
Не забываем выдать право на исполнение:
chmod a+x /usr/share/svn/hooks/post-commit
А так же — проследить за тем, чтобы у пользователя subversion:www-data были права на запись в необходимые каталоги /var/www/$path.
Дальнейшая работе (обустройство репозитария) уже выполняется на машине разработчика (ну разве что — потом выгрузить рабочую копию на сервере в нужную папку).
И, как обычно, — надеюсь, что материал окажется кому-нибудь полезным.
_________
Текст подготовлен в ХабраРедакторе

комментарии (60)

  • мне кажется, эта тема уже неоднократно освещалась в различных топиках:
    • упс… запостил случаем.
      поиск:
      habrahabr.ru/search/? q=svn+trac

      вот неплохая версия:
      habrahabr.ru/blogs/development/29440/

      давеча даже распечатал с хабра одну из подобных статей. к сожалению, уже не помню, какую.
      думаю, интереснее было бы почитать про svn+trac, т.к. svn поднимается достаточно просто… (например skazkin.habrahabr.ru/blog/29716/).

      а еще есть интересные плаги:
      для Visual Studio: VSTrac (для трака), и ankhsvn для SVN.
      для Eclipse: Mylyn (для трака и JIRA), SVNKit для SVN собсно.

      может, как add-in к статье)
      • спасибо. помучил поиск, внёс изменения в статью.
        • отлично :)) такая себе аггрегация-комиляция статей получилась!))
  • Рекомендую обратить внимание на Git. Пост про установку SVN попахивает детством. Вы бы еще про CVS написали…
    • никак не могу понять, чем Git «взрослее» нежели subversion, или CVS… мне кажется, просто в различных разработках применяются тулзы, которые удобнее для данной разработки…
      • Во-первых Git правильно организован, в отличие от того же svn. Во-вторых более широкие возможности работы с репозиторием. Ну и как вариант — при использовании гита автору для одного себя не понадобилось бы поднимать сервер, так как гит и без сервера отлично работает.
        Насчет «в различных разработках применяются тулзы, которые удобнее для данной разработки», все перечисленные инструменты служат одной цели — версионный контроль. И удобство можно лишь оценивать по большим или меньшим возможностям работы с версиями. Вот тут гит все мейнстримныe vcs и опережает на голову.
        • разработка ведётся не на машине с репозиторием, так что сервер поднимать бы всё-таки пришлось.
          * ушёл читать добро от тов. los_t.
        • при использовании гита автору для одного себя не понадобилось бы поднимать сервер, так как гит и без сервера отлично работает.

          SVN тоже умеет
          • Этот способ знаю, но это изврат. У гита проще.
        • для использования SVN для одного не требуется поднимать сервер также… ставите tortoisesvn и локальный репозиторий вполне нормально работает.
          я пишу на c# в данный момент. использую VS. для работы использую плаг для VS->SVN. когда работаю под Eclipse, использую плаг для Eclipse. вот вам и удобства в разработке. если кому нравится работать отдельным интерфейсом — пусть юзает Git. я достаточно долго выбирал оптимальный для себя вариант. SVN оказался найудобнейшим.
          кроме всего, «более широкие возможности» — очень сильно звучит. опишите поподробнее, т.к. аргументации я по-прежнему не увидел. и «опережения на голову» также не вижу… под винду смотрел git. я не впечатлен, по правде. сейчас посмотрю еще раз, дабы не быть субъективным…
          • Начните с blog.tarantsov.com/2007/12/nine-reasons-to-use-git.html и просмотрите www.youtube.com/watch? v=4XpnKHJAok8 Дальше только детальное изучение.
            Не стоит забывать что все большее количество разработчиков (особенно под web) мигрируют с windows на альтернативные OS. Я работаю на Leopard+Textmate и пользуюсь консольным интерфейсом git. В свое время активно пользовался и VS и Eclipse поэтому знаю о чем говорю — консольный интерфейс при грамотном использовании не менее эффективен чем виндовые поделки.
            • Да, git вообще клёвая штука. Я пытался вначале разобраться с bzr, не мог вкурить по-нормальному. Взглянул на гит, легко нашел документацию. Всё хорошо описано, да и сам гит построен очень даже логично и рационально, поэтому осилить его — не проблема. А умеет он всё то же, что и svn, плюс разные полезные плюшки в нагрузку.
    • 1. Пост про svn, а не svn и другие системы
      2. Напоминает старый анекдот:
      Приходит покупатель в магазин:
      (покупатель)-У вас туалетная бумага есть?
      (продавец)-Туалетной нет, есть наждачная, брать будете?
      • А у меня вызывают грусть посты когда в 2008 году человеку «надоело заливать по ftp\ssh все изменения» и он решил открыть для себя svn. Поэтому я оставляю за собой право давать адекватные советы не относясь столь скурпулезно к теме поста.
        • ну… «открыть» — это сильно сказано, открыл я его для себя всё-таки года 2 назад.
          «установить на сервер» — вот более корректный вариант.
          • Сорри, значит сложилось неправильное впечатление.
        • seymour, нравится ваш стиль комментария! Чувствуется тонкая интеллигенция :)
  • Тема не раскрыта — про «автоматическое обновление проекта» ни слова не сказано.
    • Настроим обновление рабочей копии при коммите — хук /usr/share/svn/hooks/post-commit

      а это?..
      • А зачем что-то вырезать?
        Почему нельзя сразу сделать svn up в рабочей версии на сервере?
        Или вы таким образом пытаетесь сделать оптимизацию — дескать если изменения не затронули trunk, то и не выкладывать?

        И еще момет — по какому урлу рабочая версия лезет в репозитарий?
        Есть подозрение, что процесс встанет на запросе пароля к репозитарию.
        • у меня в svn 3 проекта, обновлять нужно только 2. выборочное обновление — ибо в каждом проекте туева хуча папок — как-то не интересно ждать несколько минут, пока закончится полный svn up, ради изменений в паре папок.
          урл пошлый — svn://localhost. анонимусам чтение открыто.
  • subversion.tigris.org/faq.html#website-auto-update
    • приведённый мной скрипт:
      * может работать с более чем одним проектом
      * блокирует\пытается обновить только те каталоги, в которые были внесены изменения (т.о. время коммита уменьшается)
      * не требует перекомпиляции после внесения в него изменений :)
      • Второй пункт сомнительный.
        Апдейт с локального сервера 350 мегабайт бинарных данных (из них изменено около 150) занимает около 1.5—2.5 секунд. У Вас столько исходников есть? (на текстовые данные делается diff и передается уже он).
        • Я не про объём изменённых данных, а про количество папок, которые SVN заблокирует при обновлении. 2500 папок дольше блокировать, чем 10.
          • Только что проверил локально. svn update блокирует директории/файлы только на запись. И то только те, которые действительно изменились.
            • При выполнении 'svn up', происходит создание файлов .svn/lock во всех подкаталогах.
  • НЛО прилетело и опубликовало эту надпись здесь.
    • от чёрт… я Вам ниже ответил :)
    • Чтобы сделать раздельные коммит и пуш, не обязательно разбираться с гитом, когда уже есть svn. Можно просто разобраться с rsync и делать пуш им.
      • НЛО прилетело и опубликовало эту надпись здесь.
        • Кто сказал заменять? Не заменять, а дополнять.
          • НЛО прилетело и опубликовало эту надпись здесь.
            • А как, кстати, в гите обстоят дела с пушем на несколько application серверов?
              • НЛО прилетело и опубликовало эту надпись здесь.
    • Во-вторых, практика автоапдейта проекта после коммита порочна.

      Чем порочна? Само собой не надо выкладывать на рабочий сервер, а только на тестовый — думаю в этом плане как раз удобно. Закоммитил, протестировал проект целиком.
      • НЛО прилетело и опубликовало эту надпись здесь.
  • практика автоапдейта проекта после коммита порочна.
    В курсе. Основная часть разработки идёт у меня на машине — там же и тестится на апаче. Коммит делается только после пройденных тестов.
    Часто бывает такое, что стоит закоммитить нерабочий код.
    На этот случай ведь можно распилить репозиторий на 2 части: собственно для закидывания коммитов и для отлаженных участков… У меня подобных проблем пока не возникало — над проектом один работаю, так что не задумывался над этой проблемой.
    советую сразу разбираться с гитом
    Дома на досуге обязательно поковыряю… кхе… осталось дождаться досуга :)
    спасибо.
    • НЛО прилетело и опубликовало эту надпись здесь.
  • Мне кажется поднимать svnd — очень нерационально для такой простой задачи.
    Для этого хватит svn+ssh:// который работает куда приятнее. + есть возможность использовать ключ -c, который включает компрессию на ssh-тунель.
    • а для какой задачи поднятие svnd было бы рационально?
      • В тех случаях, когда над проектом работает больше 2-3 человек рационально поднимать svnd или webdav (http[s]).

        Один-два человека прекрасно могут работать с svn'ом через ssh и не нагружать сервер лишним демоном (светить открытый порт).

        NB. Напишите, пожалуйста, про права доступа к репозитарию. Этот момент в статье не освещен и многие могут просто не подумать об этом. Результатом будет куча репозитариев с анонимным чекаутом.
        • У меня на сервере порт светится только для внутрисети, да для впн. Так что не страшно. А демон такой уж заметной нагрузки не создаёт.
          Про права доступа написано в статье «Установка и настройка SVN (сервер+клиент)», надеюсь интересующийся народ таки обратит внимание.
  • вопрос не совсем по теме…
    Использую SVN (+tortoiseSVN) и очень доволен. Но не везде есть доступ к шеллу и установлен SVN.
    Возможно кто-то в курсе тулзы, которая бы делала то же самое что и SVN, только с помощью залитых на сервер ПХП скриптов или(и) FTP протокола.
  • Git наше все. Это раз. А два — для маленьких и средних проектов (с 1-5 разработчиками), нам все же удобнее пользовать фтп/сфтп и Coda как IDE/редактор
    • НЛО прилетело и опубликовало эту надпись здесь.
    • Оффтоп. Праздный интерес — побовали ли Вы текстмейт? Если да, то как можно попробовав текстмейт редактировать код в Coda?
      • Редактировать нужно в том, в чем быстрее выходит. У меня — в Коде.
        И у коллеги, что слева от меня.

        Конечно я пробовал текстмейт. И в свое время из-за него перешел на Mac.

        Но вот парадокс.
        • Озадачили Вы меня… Прийдется еще раз обратить внимание на коду. В свое время я даже html+css быстро редактировать в ней не смог — вернулся к текстмейту.

          BTW, я на мак изначально тоже из-за текстмейта пересел :)
      • … а еще, у Coda однозначно круче иконка.
        • … и превьюшки сайтов!
          • … и анимация их открытия!
  • На работе, в корпоративных задачах и условиях SVN есть Super Good!!!

    Но для домашних/одиночных разработок я в конце концов счёл его несколько избыточным и остановился на Norton GoBack и т.п. утилитах, делающих журналирование всех изменений файловой системы с возможностью отката/восстановления отдельных файлов.
    • Круто, а слияние branch'ей тебе тоже GoBack делает?
      • Я что хотел сказать, в том же SVN есть куча вещей, удобных даже для одиночной разработки, как то: ветви, комментирование коммитов (в goback можно откатиться к дате, но хрен вспомнишь что ты изменил и когда) и т.д.
        И мне лично не понятно, что там такого «тяжёлого», что вместо использования специального софта извращаются с FTP, системами бекапа файлов и т.д. Для создания локального репозитория вообще же не надо устанавливать никакой сервер и т.д., средствами того же TortoiseSVN делается в пару кликов.
  • BTW, что-то мне кажется что большинство товарищей агитирующих тут за svn разрабатывают на php. Верно?
Только авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста.