Настройка уведомлений о svn-коммитах (commit)
Вчера выполнял настройку уведомлений о svn-коммитах, и сегодня выпала минутка, чтобы поделится своим опытом.
Существуют две возможности выполнить настройку уведомлений:
- взять готовое решение на pl или py, отсылающее изменения вам на почтовый ящик (так было у меня на прошлом сервере);
- написать свой уникальный модуль выполняющий все необходимые действия (так сделал я в этот раз).
Остановимся на каждом из них подробнее …
Первый общий шаг – настрока svn-хука (hook)
Начать стоит с того, что первый шаг для обеих возможностей общий – это настройка svn-хука, который расположен в папке hooks корневой папки репозитория. Хуки могут быть разных типов (post-commit, pre-commit и т.д., названия файлов говорят сами за себя), но так как нам необходимо уведомлять об уже совершенном действии, то нам необходим хук post-commit. Для этого нам необходимо сначала взять файл post-commit.tmpl, переименовать его в post-commit и дать ему необходимые права на выполнение:
cd /path/to/repo/hooks
cp post-commit.tmpl post-commit
chmod +x post-commit
А затем необходимо привести его содержимое к следующему виду:
#!/bin/sh
REPOS="$1"
REV="$2"
строка запуска скрипта уведомления
Использование готового решения для уведомлений о svn-коммитах
Если вам некогда морочить голову с написанием своего скрипта и достаточно простой отсылки уведомления на почту о выполненных изменениях, то вам вполне будет достаточно готового решения, например, на perl.
Сначала необходимо загрузить готовый скрипт отсюда или из любого другого места, в нашем случае это файл commit-email.pl и дать ему необходимые права на выполнение (также может потребоваться захардкодить путь к svnlook, в мое случае это был "/usr/bin" ).
Далее необходимо в хуке post-commit в качестве «строки запуска скрипта уведомления» указать путь к загруженному файлу и передать ему необходимые парметры. Для commit-email.pl обязательными являются параметры номер ревизии, путь к репозиторию и имя поятового ящика для уведомления, а в качестве дополнительных параметров я в него передавал префикс темы и почтовый адрес отправителя сообщения:
/path/to/scripts/commit-email.pl "$REPOS" "$REV" --from from@example.com -s "svn commit:" to@example.com
И далее необходимо проверить работоспособность скрипта передав ему в консоли путь к репозиторию и номер ревизии:
./post-commit /path/to/repo 5
и получить в почтовый ящик долгожданное сообщение о коммите.
Написание своего php-уведомлятора о svn-коммитах
Предже чере перейти к написанию кода кратко остановимся на используемой svn-утилите svnlook:
- svnlook author /path/to/repo/ - используется для получения автора последнего коммита;
- svnlook changed /path/to/repo/ - используется для получения списка измененных файлов;
- svnlook log /path/to/repo/ - используется для получения комментария по выполненному коммиту;
- svnlook diff /var/svn/myproject/ - используется для получения изменений кода по последнему коммиту.
Далее перейдем непосредственно к действиям. Все можно сделать по аналогии. Сначала в хуке post-commit в качестве «строки запуска скрипта уведомления» указажем путь к нашему файлу и передадим ему необходимые парметры. Нам потребуются номер ревизии, путь к репозиторию и имя поятового ящика для уведомления:
/path/to/scripts/commit-email.php "$REPOS" "$REV" to@example.com
А далее по указанному пути нужно разместить наш скрипт commit-email.php.
<?
// Путь к репозиторию, номер ревизии и имя ящика-получателя получаем в качестве аргументов
$repository = isset($argv[1]) ? $argv[1] : '';
$revision = isset($argv[2]) ? $argv[2] : '';
$to = isset($argv[3]) ? $argv[3] : '';
// Определяем имя проекта
$project_name = end(explode("/", $repository));
// Определяем автора, сообщение и изменения коммита при помощи svnlook
$author = exec('svnlook author ' . $repository);
$subject = "'$project_name' svn-уведомление о коммите ревизии ".$revision;
$changed = exec('svnlook changed ' . $repository);
$log = exec('svnlook log ' . $repository);
$log = (! empty($log)) ? " с комментарием '".$log."'" : "";
// Получаем изменения кода
$diff = '';
$fp = popen('svnlook diff ' . $repository, "r");
while(!feof($fp)) {
$diff .= fread($fp, 1024);
flush();
}
pclose($fp);
// Формируем тело сообщения
$message = date("c")." $author выполнил коммит ревизии $revision в проекте '$project_name'$log.
Были изменены следующие файлы:
$changed
Изменения следующие:
$diff";
// Отправляем комментарий
mail($to, $subject, $message);
?>
Аналогичным образом полученную информацию можно сохранить в какой-то лог-файл или в БД, а главное – все коротко и ясно.
Нет обратных ссылок на эту запись.
октября 6, 2011 - 21:47
Спасибо большое! То что нужно, действительно дальше легко сделать с полученными данными все что угодно!