Хуки после фиксации в Subversion

У меня возникли проблемы с работой хуков после фиксации. Subversion, похоже, не запускает мой хук после фиксации, когда я фиксирую измененный файл в моем репозитории.

Я использую TortoiseSVN и VisualSVN с Subversion, я смог зайти в пользовательский интерфейс VisualSVN и создать внутри него ловушку, которая работала, однако я бы хотел использовать исполняемую ловушку после фиксации в папке хуков моей установки, чтобы выполнить мой крючок.

Я изменил имя с post-commit.tmpl на post-commit.bat в папке / hooks моего репозитория и просто выполняю простое обновление в пакетном файле:

"C:\Program Files\TortoiseSVN\bin\svn.exe" update "C:\mypath\myworkingcopy"

Когда я запускаю командный файл сам по себе, он обновляет мою рабочую папку, поэтому я думаю, что он не запускается, когда я по какой-то причине фиксирую. Похоже, это не проблема с разрешениями, так как все делается локально на моем компьютере, однако я настроил его для работы в качестве сетевой службы, но по-прежнему испытываю ту же проблему ... какие-либо предложения?


person mgrenier    schedule 16.04.2013    source источник
comment
Вопрос следует задать в ServerFault, AFAIK.   -  person bahrep    schedule 16.04.2013
comment
Почему ServerFault, а не StackOverflow?   -  person mgrenier    schedule 17.04.2013
comment
Вы можете принять и / или проголосовать за ответ, если это помогло. Спасибо!   -  person bahrep    schedule 28.08.2014


Ответы (5)


Прежде всего, все перехватчики выполняются на СЕРВЕРЕ, а не на различных клиентских машинах. Это C:\mypath\myworkingcopy на сервере? В противном случае он не будет обновляться.

Во-вторых, это дурной тон делать что-нибудь в хуке, которое может занять слишком много времени. Если вашему хуку нужно нечто большее, чем svnlook, скорее всего, вы делаете это неправильно. Например, сколько времени может потребоваться для обновления этой рабочей копии? 10 секунд? 30 секунд? минута? Это дополнительное время, которое разработчик должен сидеть и ждать завершения своего коммита Subversion.

Намного, намного лучше использовать что-то, что может реагировать на события фиксации и делать такие вещи, как обновления рабочих копий или развертывание на веб-серверах за пределами ловушки после фиксации. Я настоятельно рекомендую Jenkins для этой работы. У Дженкинса есть несколько приятных особенностей:

  • Это рентабельно (бесплатно не победить)
  • Он хорошо поддерживается (задайте вопрос в Stackoverflow и получите быстрый ответ).
  • Это несложно настроить и использовать.

А теперь вернемся к вашему вопросу:

Сначала убедитесь, что крюк движется. Добавьте в конец пакетного скрипта одну строку:

 exit 2

Это заставит Subversion думать, что ловушка после фиксации не удалась, и вы должны получить сообщение об ошибке при фиксации. В противном случае ваш скрипт после фиксации не работает. Убедитесь, что сценарий запускается учетной записью, на которой запущен сервер Subversion.

Если вы получили сообщение об ошибке, скрипт запущен. Однако команда svn может не возвращать ошибку, которую улавливает процесс после фиксации. Обычно я не рекомендую писать хуки на языке пакетного программирования Windows из-за его ограничений. Используйте Python, Perl или PowerShell. Они лучше при обнаружении условий ошибки, и вы можете выйти из своего скрипта при обнаружении.

Опять же, все работает отлично, но вы смотрите не на ту рабочую копию (ту, что на вашем компьютере, а не на сервере). Когда вы запускаете ловушки вне сервера Subversion для тестирования, запускайте их на сервере от имени пользователя Subversion, запускающего серверный процесс.

Попробуйте эти вещи и посмотрите, решит ли это вашу проблему.


Дополнительные комментарии

Я создал репозиторий с svnadmin create и запустил его с помощью svnserve. Я обновил svnserve.conf, чтобы можно было оформить заказ и зафиксировать код.

Я вошел в каталог hooks, переименовал pre-commit.tmpl в pre-commit.bat и установил его как:

set 1>&2
echo "Blocked my me!" 1>&2
exit 2

Когда я попытался зафиксировать свои изменения, я получил:

Transmitting file data .svn: E165001: Commit failed (details follow):
svn: E165001: Commit blocked by pre-commit hook (exit code 2) with output:
[...]
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.RB;.RBW
PERL_JSON_BACKEND=JSON::XS
PERL_YAML_BACKEND=YAML
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 42 Stepping 7, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=2a07
[...]
"Blocked my me!"

Хук должен удалить среду (включая PATH), но я предполагаю, что это только в Unix, а не в Windows. Вы можете увидеть, что PATHEXT определено.

Затем я переименовал pre-commit.bat в pre-commit.tmpl и создал post-commit.bat`, который выглядит так:

echo This post-commit hook shall fail! 1>&2
exit 2

Во время фиксации я получил следующее:

Transmitting file data .
Committed revision 3.

Warning: post-commit hook failed (exit code 2) with output:
This post-commit shall fail!

Похоже, все работает по плану. Я не использую VisualSVN и не работаю в качестве службы. Интересно, может быть проблема с вашей переменной среды PATHEXT.

Может быть, посмотрите, как он установлен в вашей учетной записи, на которой запущен сервер Subversion, и посмотрите, есть ли там .BAT.

Я не могу сразу думать ни о чем другом.

person David W.    schedule 16.04.2013
comment
Сначала убедитесь, что крюк движется. Добавить в конец пакетного скрипта эту одну строчку - не идеальная идея. 1 - неинформативно 2 - не отлаживаемое. Эхо внутри крючка поможет больше - person Lazy Badger; 17.04.2013
comment
@LazyBadger Эхо внутри крючка не сработает, если крючок не сработает. Subversion использует STDOUT и печатает STDERR только в случае сбоя перехвата. Добавление exit 2 внизу позволит узнать, работает ли крючок. Помните, что это крючок с одной линией. Эхо не расскажет вам слишком много. Я хотел, чтобы это было как можно проще. - person David W.; 17.04.2013
comment
В настоящее время я работаю на машине разработки, чтобы провести тестирование, поэтому мой клиент и сервер являются одним и тем же, так что да, моя рабочая копия находится на сервере. Я попытался добавить exit 2 без ошибок, поэтому он вообще не работает. Я могу вызвать внешнюю задачу для завершения обновления в соответствии с вашим предложением, что, я согласен, вероятно, является хорошей идеей, однако проблема остается в том, что ловушка для вызова внешней задачи все еще должна работать. Первоначально у меня была возможность изменить эту папку, но просто чтобы гарантировать отсутствие проблем с разрешениями, я явно дал права на изменение для сетевых служб, которые все еще не запускают ловушку. - person mgrenier; 17.04.2013
comment
@mgrenier Я так и подозревал. Допустим, ваш репозиторий находится в C:\svn_repo. Каталог хуков находится в C:\svn_repo\hooks. Так далеко? В этом каталоге находится файл post-commit.tmpl. Вы переименуете его в post-commit.bat. Правильный? Это должен быть исполняемый файл. - person David W.; 17.04.2013
comment
@mgrenier Вы используете VisualSVN, поэтому вы используете Apache httpd и используете либо http://, либо https:// в качестве протокола. Все должно работать. Это возможно: Subversion всегда вызывает post-commit в качестве имени программы. Windows творит чудеса, выясняя, что программа должна называться post-commit.bat. Это делается через переменную окружения PATHEXT. Интересно, эта переменная не установлена ​​или установлена, и что-то еще вызывается ... - person David W.; 18.04.2013
comment
@mgrenier Смотри мои комментарии к моему ответу - person David W.; 18.04.2013
comment
Спасибо, Дэвид, после проверки переменной среды PATHEXT ее содержимое выглядит следующим образом: .COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS; .JSE; .WSF; .WSH; .PSC1 Я предполагаю потому что .BAT там, проблема не в этом? - person mgrenier; 18.04.2013
comment
@mgrenier Пока нет post-commit.com или post-commit.exe где-нибудь в% PATH% перед post-commit.bat, post-commit.bat должен выполняться. Если хихикает, попробуйте скопировать мой post-commit.bat хук и посмотрите, работает ли это. Мне нужно скачать VisualSVN, чтобы посмотреть, не делает ли он что-нибудь забавное. - person David W.; 18.04.2013

Я почти сошел с ума от этого, моя проблема заключалась в том, что выход 2 не отправлял ничего в пост-фиксации моему svn-клиенту. Он работал хорошо в стартовой фиксации, перед фиксацией, но в пост-фиксации я никогда не получал никаких ошибок. Итак, моя основная проблема заключалась только в вызовах полного пути в самом скрипте.

Итак, если вам кажется, что пост-фиксация никогда не работает, и вы пробовали выход 1 в скрипте, и у вас нет ошибок, попробуйте что-то вроде этого:

#!/bin/sh
/bin/touch /home/folder/post_commit_works
person Javier P    schedule 01.10.2013

  • Предоставьте учетной записи сетевой службы доступ к папке C:\mypath\myworkingcopy и C:\Program Files\TortoiseSVN\bin\svn.exe рабочей копии.

  • Если это не сработает, давайте запишем вывод ловушки в файл журнала, чтобы получить некоторые подсказки по основной причине:

    1. Rename your current post-commit.bat file to post-commit-run.bat.
    2. Create the following file as your post-commit.bat file:

      call "%~dp0post-commit-run.bat" %* > %1/hooks/post-commit.log 2>&1

    3. Зарегистрируйтесь в репозитории и проверьте созданный файл журнала. Результат даст вам подсказку о первопричине.

person bahrep    schedule 16.04.2013
comment
Я попробовал захватить технику вывода, но файл не создается ... по какой-то причине ловушка post-commit.bat, похоже, никогда не срабатывает - person mgrenier; 16.04.2013
comment
@mgrenier aww, я пропустил C:\Program Files\TortoiseSVN\bin\svn.exe часть. У вас установлен TortoiseSVN на сервере? Почему бы тебе не выполнить %VISUALSVN_SERVER%bin\svn.exe? - person bahrep; 16.04.2013
comment
Я пробовал использовать как путь TortoiseSVN, так и путь VisualSVN к svn.exe, и ни один из них не работал ... Я просто попытался использовать% VISUALSVN_SERVER%, и это, похоже, не решило мою проблему - person mgrenier; 16.04.2013
comment
на самом деле нет необходимости в журнале: все, что обработчик напечатал в stderr, будет упорядочен обратно клиенту, что упрощает диагностику сбоев обработчика и для Win stderr = stdout - person Lazy Badger; 17.04.2013

Расширенная версия ответа Дэвида

  1. Убедитесь, что хук post-commit действительно выполнен: добавьте в post-commit.bat echo ANYTHING и при фиксации из CLI вы должны видеть ЛЮБОЙ вывод на экран (в случае TSVN in будет в окне фиксации)
  2. Если выполняется скрипт-перехватчик (это должно быть так), вам необходимо протестировать разрешения (для каталога Рабочей копии) учетной записи, под которой вы запускаете VisualSVN Server - NetworkService может иметь недостаточные разрешения для файлов - я подозреваю это, потому что любое обновление svn, даже для последней версии WC, выводится на стандартный вывод, и вы должны видеть этот вывод из хука после фиксации.

>svn up "z:\wc"

Updating 'wc':

At revision 3.


Правки и исправления

Спасибо Дэвиду за то, что упомянул мои идиотские ошибки и освежил память. Хотя версия bahrep с журналированием файлов будет работать, этот тип ловушки после фиксации (в post-commit.bat)

echo Running 1>&2
svn up "z:\wc-auto" 1>&2
exit 2

передать все вывод ловушки на экран при фиксации

z:\wc>svn ci -m "Testing hook"
Sending        file.txt
Transmitting file data .
Committed revision 13.

Warning: post-commit hook failed (exit code 2) with output:
Running
Updating 'Z:\wc-auto':
U    Z:\wc-auto\file.txt
Updated to revision 13.
person Lazy Badger    schedule 16.04.2013
comment
Если вы эхо, вы должны echo something 1>&2, а затем добавить exit 2 в конец крючка. В противном случае вы не увидите сообщения. Subversion никогда не отображает STDOUT, а отображает STDERR только в случае сбоя ловушки. - person David W.; 17.04.2013

У меня была такая же проблема при выполнении post-commit.bat. Я полагал, что Subversion в Windows запускается после фиксации, когда у сценария есть .exe в качестве расширения.

Попробуйте скомпилировать пакет после фиксации в исполняемый файл с помощью Bat2Exe или bat2exe.net и посмотрите, запустится ли он.

person mavili    schedule 02.07.2013
comment
Пробую этот метод. Пожалуйста, помогите им в этом. stackoverflow.com/questions/17811220/ - person Mansoorkhan Cherupuzha; 24.07.2013