В большинстве случаев, при разработке веб-проекта требуется автоматически обновлять рабочую версию, на помощь на приходят свн-хуки!
Начнем с того, что у нас есть веб-проект и нам необходимо создать для него репозиторий, как это сделать я рассказывал в статье «FreeBSD. Установка и настройка Subversion».
Далее, мы будем обновлять наш проект только через репозиторий!
Подготовка проекта
Сначала сделаем импорт веб-проекта в репозиторий:
Теперь удалим все файлы проекта (не забывайте делать бекапы на всякий случай), и сделаем чекаут:
# rm -rf *
# svn checkout file:///svn/repos/_project_
Hooks
Хуки срабатывают на разные события Subversion, вот некоторые из них:
- start-commit — запускается до начала транзакции, может быть использован для проверки прав.
- pre-commit — запускается в конце транзакции, но до commit, часто используется для валидации данных, например для проверки не пустых лог-собщений.
- post-commit — запускается после транзакции, может быть использовано для отправки e-mail или для резервирования хранилища.
- pre-revprop-change — запускается до изменений в ревизии, могут быть использованы для проверки доступа.
- post-revprop-change — запускается после изменений в ревизии, могут быть использованы для отправки e-mail или для резервирования изменений.
Есть еще «post-lock», «post-unlock», «pre-lock» и «pre-unlock», как видно из названий он срабатывают при блокировке. Я не буду их разбирать, потомучто они у меня интереса пока не вызвали.
Post-Commit Hook
Этот хук срабатывает после любого commit'a репозитория, для его активации надо скопировать шаблон и наделить правами на запуск:
# cp post-commit.tmpl post-commit
# chmod u+x post-commit
Далее, отредактируем файл post-commit, закомментируем все лишнее и добавим наши команды для обновления проекта:
Примерного такой вид в результате будет иметь содержимое ваше хука:
#
# ... тут куча комментариев ...
#
REPOS="$1"
REV="$2"
cd /_project_ && /usr/local/bin/svn update
#commit-email.pl "$REPOS" "$REV" commit-watchers@example.org
#log-commit.py --repository "$REPOS" --revision "$REV"
далее, проверим работает ли хук от имени под которым запущен Subversion и выполним его:
# ./post-commit
Если ответ примерно такой:
то все в порядке!
А если нет, то у вас ошибка в хуке, пишите в комментарии — помогу.
Собственно хук готов, теперь его необходимо проверить, сделайте commit и посмотрите, обновился ли ваш проект — если нет, то скорее всего проблемы с правами на запись файлов вашего проекта.
Необходимо разрешить права на запись файлов веб-проекта пользователю/группе от которой запущен subversion, скорее всего это www.
# chown -R www:www *
# chown -R www:www .*
# chmod -R 775 *
# chmod -R 775 .svn
P.S. Спасибо за помощь в тестировании хук :)



У меня вопрос по поводу загадочной строчки
«cd /_project_ && /usr/local/bin/svn update»
если у меня репозитарий находтся в /var/svn а сам веб проект в /var/www
то эту строчку я должен переписать так
«cd /var/svn && /var/www update» ?
а еще вот:
root@server:/var/svn/hooks# su www-data
$ ./post-commit
sh: ./post-commit: Permission denied
(пермишен денайд выдает)
Что делаю не так? Спасибо!
В примере:
свн репозиторий — /svn/repos/_project_/
файлы проекта — /_project_
Из это следует, что вам надо
покажите права на этот файл
root@server:/var/svn/hooks# ls -l post-commit
-rwxr--r-- 1 root svn 2041 2009-07-16 16:13 post-commit
я так понимаю сменить владельца надо? (спасибо вы мне очень помогаете)
Юра Диденко, да, смените права на файл и не забывайте, что надо обязательно иметь права на выполнение (x)
зы. пожалуйста :)
root@server:/var/svn/hooks# chmod -R g+wsx post-commit
root@server:/var/svn/hooks# ls -l post-commit
-rwxrwsr-- 1 www-data svn 2041 2009-07-16 16:13 post-commit
root@server:/var/svn/hooks# su www-data
$ ./post-commit
./post-commit: 49: /usr/local/bin/svn: not found
./post-commit: 52: /usr/share/subversion/hook-scripts/commit-email.pl: not found
$ exit
я так понимаю первая проблема он не нашел репозиторий все правильно он у меня в /var/svn исправил, вторую опцию я просто закомментировал в файле post-commit
запускаю
root@server:/var/svn/hooks# su www-data
$ ./post-commit
./post-commit: 49: /var/svn: Permission denied
./post-commit: 52: : Permission denied
что-то как-то сложно с правами доступа
/var/svn — это у вас путь до репозитория или до приложения?
да это путь до репозитария
ну так надо не путь до репозитория, а путь до приложения
* вы заходите в каталог где храниться рабочая копия (/var/www)
* выполняете апдейт (whereis svn)
нам путь до репозитория не нужен
svnadmin create /var/svn
chown -R www-data:svn /var/svn
chmod -R g+ws /var/svn
Так был создан репозитарий (я создавал из примера )
1. У вас Ubuntu?
2. Какой путь до программы svn? (whereis svn)
Если в файле post-commit записать так:
cd /var/www && /usr/local/bin/svn update
то получается следующее:
$ ./post-commit
./post-commit: 50: /usr/local/bin/svn: not found
./post-commit: 53: : Permission denied
Это понятно такого пути просто нет /usr/local/bin/svn , репозитарий находится в папке /var/svn веб каталог он же каталог проекта в папке /var/www
/usr/local/bin/svn — это путь до программы, а не репозитория, и нам нужен путь до программы, а не до репозитория!
выполните комманду
root@server:/var/svn/hooks# whereis svn
svn: /usr/bin/svn /usr/share/man/man1/svn.1.gz
я понимаю я туплю, еще раз спасибо вам, за то что нервов еще хватает на переписку со мной ;) спасибо
1. Вы устанавливали как модуль Apache?
2. Используете путь вида «http://...»?
3. Под каким пользователем и группой у вас работает Apache?
/usr/bin/svn — вот это ваш путь, замените «/usr/local/bin/svn» на «/usr/bin/svn»
это все форум pyha.ru меня таким сделал, я все терплю :)Уже лучше стало:
root@server:/var/svn/hooks# su www-data
$ ./post-commit
Пропущено '.'
./post-commit: 53: : Permission denied
))
Я вот так записал:
cd /var/www && /usr/bin/svn update
ок, теперь зайдите в каталог
и выполните
root@server:/var/svn/hooks# cd /var/www
root@server:/var/www# /usr/bin/svn update
Пропущено '.'
Аааа что он хочет?)))
Юра Диденко, а вы делали чекаут?
да небыло чек аута, я пересоздал репозиторий выполнил чекаут но вот что получил
root@server:/var/svn/hooks# ls -l post-commit
-rwxr-xr-x 1 www-data svn 2030 2009-07-17 14:28 post-commit
root@server:/var/svn/hooks# su www-data
$ ./post-commit
Type 'svn help' for usage.
$
? почему
Покажи содержимое файла «post-commit» (только вырежи оттуда комментарии)
---------------------------------------------------------
#Все остальное что выше закоменченно!
REPOS="$1"
REV="$2"
cd /var/www && /usr/bin/svn
#/usr/share/subversion/hook-scripts/commit-email.pl \
# «$REPOS» «$REV» commit-watchers@example.org
---------------------------------------------------------
root@server:/var/svn/hooks# whereis svn
svn: /usr/bin/svn /usr/share/man/man1/svn.1.gz
рабочий каталог проекта /var/www
чекаут делал вот так:
svn checkout file:///var/svn/social /var/www
(я чувствую где-то какая-то мелочь))
Куда «update» дел?
Как вас зовут? я выпью за ваше здоровье сегодня! Спасибо! Вы мне очень помогли!
---------------------------------------------------------
п.с. выставил всем вложенным файлам и папкам владельца www-data.svn как так получилось, до сих пор не понял, мускул отвалился... еще кое-чего... сижу правлю руками, но твой хук;) работает, и мега круто работает! Спасибо еще раз!
Меня зовут Михаил Андреев :)
>мускул отвалился... еще кое-чего
Зарегистрируйтесь на pyha.ru/forum и я вам там помогу ;)
очень приятно Михаил!
>я понял почему мускул отвалился и как владельца ошибочно установил...
# cd /_project
# chown -R www:www *
# chown -R www:www .* <- зачем вот это делаем?
# chmod -R 775 *
# chmod -R 775 .svn
для скрытых файлов
можно ли настроить посткоммит так, чтобы файлы сливались на другой сервер по ftp?
Darkside, можно
Здравствуйте. Помогите пожалуйста написать хук.
Мне нужно чтобы после команды update (после обновления номера ревизии) файлы из одной директории копировались в другую.
Я так понимаю что нужно использовать хук post-revprop-change.bat. Нужно добавить в него строку xcopy D:\Repository\*.* /d D:\test /s /y > info.txt
Что toe нужно добавить в хук чтобы он заработал?
Спасибо!
Забыл написать, что я это делаю на Windowx XP.
Михаил, а
это вообще у вас работает? Если да, то больше ничего не надо, хотя возможно надо прописать полный путь до xcopy.
Я под виндовс не делал хуков, только под FreeBSD и Linux
Да. Если я вручную запускаю этот батник, то он все выполняет. А если я выполняю команду svn update, то номер ревизии меняется но этот хук не отрабатывает.
Может там нужно прописать какие условия? И если они выполняются то выполнять копирование
А разве у вас нету хука «post-update»?
Неа, нету.Вот все что есть:
post-commit,post-lock,post-revprop-change,post-unlock,post-update,pre-commit,pre-lock,pre-revprop-change,pre-unlock,start-commit
Если я сам сделаю батник с названием post-update.bat и туда вставлю строку копирования, будет работать?
:)
А не, сорри. Это я уже сам его создал руками. Его не было:)
Я проверил, что если его вручную создать, то он не работает.
Может я что то не правильно делаю.
После команды svn update хук post-update должен автоматически срабаотывать без дополнительных команд и настроек?
Ну, в принципе вам подойдет «post-revprop-change», потестите его, впишите в хук:
И посмотрите — срабатывает ли он. Также можете потестить методом тыка все хуки и узнать, какой вам понадобиться...
Хуки если вручную запускаю отрабатывают как надо. а вот после update не работает:((
Не знаю что еще придумать:(
Я говорю, впишите во все хуки, нечто
и узнаете, что выполнилось
Я так и сделал. Ни один из хуков на update не сработал. Но зато срабатывает хук post-commit после команд delete и import
А Вы не подскажете еще, на какие команды срабатывает хук post-revprop-change.
Сделал как описанно выше, запуская hook скрипт и получаю
Skipped '.'
Что это может быть?
1. Скорее всего не там вызываете svn update, покажите хук (только без комментариев в файле).
2. Вы его вручную сейчас выполняете?
REPOS="$1"
REV="$2"
cd /var/www/vhosts/c2342/night && /usr/bin/svn update
/var/www/vhosts/c2342/night — это мой хомяк :)
и в ручную запускал хук и коппитить пробовал и видел ту же ошибку в логах свн клиента
Собственно вот, запускаю в ручную из домашней дериктории (там, где проект должен лежать)
linux $ /usr/bin/svn update
Skipped '.'
разобрался, моя ошибка.
не сделал
svn import /_project_ file:///svn/repos/_project_
сейчас разбираюсь
Ну так проблема осталась или как?
Пока да :(
Если я в ручную скрипт запускаю — все выполняется корректно, а именно —
если были коммиты — папка проекта обновляется, если небыло коммитов, то так, как написано у вас:
At revision тут_номер_ревизии
Но когда я коммичу, оно мне пишет ошибку
post-commit hook failed (exit code 255) with no output.
пока не могу поять в чем дело :(
1. Под кем выполняется subversion? Он имеет право писать данные в проект (update)?
2. У хуков проставлены права на запуск?
1 — не знаю, наверное попробую у хостера узнать. что я заметил, так это то, что на всех папках (в домашней дериктории и папка проекта и свн и прочее хранится) одинаковая группа (не знаю, имеет ли это значение).
2 — да, я когда проверял запускал сам хук файл
vitaly, у вас svn установлен как модуль apache? В хук добавьте инструкцию touch/mkdir для того чтобы потом определить права у созданного файла/каталога
> vitaly, у вас svn установлен как модуль apache?
не знаю :) могу узнать у хостера.
> В хук добавьте инструкцию touch/mkdir ...
т.е. попробовать создать дерикторию, перейти в нее и там попробовать update сделать?
Через хук создайте директорию, после чего посмотрите какие у нее права (команда ls -la)
прописал в хуковом скрипте создание дериктории — ничего не создало :( наверное прав нет (опять таки, запустил в ручную хуковый скрипт — все создало. значит ошибки в «синтаксисе» нет)
Да, скорее всего права, однако рекомендую прописать до программ полный путь, например /bin/mkdir, /bin/cp и т.д.
Узнать можно их через команду whereis (whereis cp)
при выполнении
где /var/www/ — папка проекта
file:///var/svn/ — папка репозитория
файлы из базы репозитория появляются не в /var/www, а в /var/www/svn
и при подключении с удаленного репозитория вылазиет ошибка :
А какие файлы у вас в /var/svn/ ?
Извините, всё напутал в попыхах )
svn import
проходит нормально, появляется содержимое репозитория, а вот после
как раз файлы из базы репозитория появляются не в
В /var/svn директории :
conf
dav
db
hooks
locks
Вроде разобрался(ОС Debian) :
для меня выглядит как :
только нужно ещё добавить в конце папку проекта /var/www
то есть полностью команды выглядит так :
После этого
выдает
e1da, ну вроде все хорошо :)
adw0rd, извините, забыл поблагодарить, многие говорили мне, что так работать с svn невозможно(видимо очень мало русскоязычных материалов).
e1da, вы о хуках, или о тех примерах команд которые скидывали?
я и о хуках в частности, и о синхронизации svn репозиториев на разных системах.
А если репозиторий и рабочий проект на разных серверах.
Вот пишем на продакшн-сервере:
Что то не видно тут hooks.
Как можно отловить событие? Хук нашел только в репозитории.
В этом случае надо заходить на удаленный сервак и выполнять svn update. А как это вам решать.
Вот еще почитайте , может заинтересуетесь.
Допустим задача простая: на «обновленном|update» сайте в шаблоне прописать номер ревизии автоматом. Что бы визуально на разных копиях проекта можно было отследить версию. Наверное самое простое написать скрипт обновления.
Можете создать скрипт, который будет срабатывать при http-запросе. Он будет осведомлен о коммите, после чего будет запускать апдейт.
Это самое простое и не красивое решение.
много букф афтор жжот
тут более понятно
больше интересует как сделать игнорирование папок в хуках например у меня в СВН есть движок и папка files хочю пряму на сервере в СВН поместить рабочую копию минуя копирования папки files с 20 гб
хуки до сих пор не автоматизированы в рабочей копии сайта хранится хлам '.svn'
логично делать хук примерно такой конструкции
логично делать хук примерно такой конструкции
чего 20 гигов делают в свн? Сделайте для них
Это не хлам, это фича. Можно всегда откатить либо задиффить файлы, и т.д.
Я средствами nginx лочу доступ ко всем файлам начинающиеся с «.*» и не вижу проблем с хранением «хлама», но если вам не нужно это, то делайте svn export.
в чем смысл?
svn: warning: 'files' is not under version control
ну что мне вам сказать, либо у вас нет каталога ./files/, либо он не под свн
еще проблема после постинга в каталог сайта появляются .mine .r17 .r18 как от них избавтся например до актуальной версии
Удалить файлы, после чего апнуться. Но по нормальному, во время слияния надо коррентно мержить, а если пофиг, то пропускать из репы версию поверх рабочей или наоборот.
Здравствуйте! Прочитав всю тему и комментарии, у меня не получилось сделать так, чтобы после фиксации рабочего проекта, его последняя версия выгружалась из хранилища в указанную папку. Допустим есть хранилище E:/SVN
папка E:/1 — в которой разрабатывается сам проект
и папка E:/2 — сюда должен попадать тот проект после фиксации.
Хотелось бы узнать, как должен выглядеть post-commit.bat в этом случае?
Давайте разберемся по порядку, сначала создайте тесты для проверки работы хука. Например создавайте каталог в post-commit.bat или дописывайте файл, сами придумайте.
После чего, когда удостоверитесь что хук работает, делайте svn export или как вы там хотите выгружать данные в E:/2
Данные хочу выгружать с помощью хука, т.е. автоматизировать процесс обновления файлов на сайте до последней версии. Что бы я ни делал, хук не работает. Либо ничего не происходит, либо «операция завершена неудачно» или как-то там, при этом куча всяких «кракозябр» вылазит при фиксации. Я вот что хочу узнать, как правильно в самом хуке прописать пути... наверно что-то с синтаксисом не верно. С SVN начал работать совсем недавно...поэтому полный чайник ещё в этом плане.
пропишите банально в post-commit.bat:
и удостоверьтесь что каталог создался
Не создаёт, в окошке фиксации пишет вот это:
post-commit hook failed (exit code 1) with output:
и тут куча непонятного всего...
что делать?
привести сюда
т.е. мне надо полностью весь ответ
вот ошибки:
post-commit hook failed (exit code 1) with output:
«#!» Ґ пў«пҐвбп ўгв॥© Ё«Ё ўҐиҐ©
Є®¬ ¤®©, ЁбЇ®«пҐ¬®© Їа®Ја ¬¬®© Ё«Ё Ї ЄҐвл¬ д ©«®¬.
.
.
.
и дальше всё в таком же духе, это тестовый хук, который вы говорили сделать... да и любые другие то же самое выдают.
вот вам на будующее, если текст нечитаем...
а теперь покажите свой хук.
Там не должно быть #!/bin... У вас виндовс, а не никсы :)
Взял стандартный post-commit, удалил всё закомментированное и добавил mkdir c:/testdir
не работало.
дошло до того, что кроме этой строки вообще ничего не осталось((
Это строки недолжно быть не в коем случает, если она есть, то ваш хук на ней и остановится, вызвав ошибку. Что собственно мы и видим
Скажите пожалуйста, что надо прописать\удалить в стандартном пост-коммите?
Я не работаю с Windows, даже не знаю как для нее выглядят хуки. У вас же я так понял есть примеры? Должны идти в комплекте с сабвершеном для Windows.
вот чистый хук:
#!/bin/sh
.
.
тут куча закоментированного текста
.
.
REPOS="$1"
REV="$2"
mailer.py commit «$REPOS» «$REV» /path/to/mailer.conf
и всё.
А называется он post-commit.bat?
Да, расширение я поменял с tmpl на bat, говорят можно ещё exe, но там что-то ещё надо шаманить.
К сожалению не смогу вам помочь, так как у меня нет Windows, что бы проверить и написать вам готовый хук. Однако вы можете дать мне удаленный доступ по RDP на свой компьютер с Windows
Посмотрите вот эту страничку
Возможно она сможет немного помочь
Мне то оно ничем не поможет, это возможно вам поможет. Мне нужна платформа для проверки, а не информация, если вы не может предоставить доступ, то иначе вам я никак не смогу помочь...
Спасибо за терпение и помощь! Всё получилось и прекрасно работает!!!
пожалуйста