Блог web-мастера POLYGLOTа О жизни, связанной с Linux, PHP, MySQL, JavaScript, AJAX, SVN, CSS и многим другим

10Фев/101

Настройка уведомлений о svn-коммитах (commit)

subversion_logoВчера выполнял настройку уведомлений о 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);

?>

Аналогичным образом полученную информацию можно сохранить в какой-то лог-файл или в БД, а главное – все коротко и ясно.

Связано с категорией: Linux, PHP, Subversion Оставить комментарий
Комментарии (1) Пинги (0)
  1. Спасибо большое! То что нужно, действительно дальше легко сделать с полученными данными все что угодно!


Оставить комментарий


Security Code:

Нет обратных ссылок на эту запись.

Облако меток

Apache Cron crontab PHP Subversion WebMoney WMU WMZ Мир Привет программист

Облако тегов плагина WP Cumulus от сайта "Плагины и шаблоны для WordPress" требует для просмотра Flash Player 9 или выше.

Последние записи

Счетчики

Реклама