Git

индекс
244,39

Пример автоматизации рассылки почты по коммиту в git/msmtp

В этой статье рассмотрен пример использования git хука post-commit для отправки информации о коммите, на указанный в сообщении коммита емайл, по средствам msmtp(обычно он идет в комплекте msysGit).


Составитель статьи — artzub. Любые выражения благодарности и сочувствия в его сторону.

Настройка msmtp


Для того, чтобы msmtp начал отправлять письма ему необходимо прописать настройки в файле msmtprc.txt.
Чтобы узнать расположение этого файла выполните:
$ msmtp -P

Эта команда выведет на экран всю информацию о конфигурации msmtp.
Должно быть что-то подобное:
ignoring system configuration file C:\Documents and Settings\All Users\Applicati
on Data\msmtprc.txt: No such file or directory
loaded user configuration file c:/Documents and Settings/Admin\msmtprc.txt
msmtp.exe: account default not found in c:/Documents and Settings/Admin\msmtprc.
txt

Как видно конфигурации не найдено.

Настройка

Давайте создадим файл в каталоге C:\Documents and Settings\All Users\Applicati
on Data\
.
# Прописываем конфигурацию по-умолчанию для всех аккаунтов.
defaults
tls on
tls_certcheck off
logfile ~/.msmtp.log
# Прописываем конфигурацию вашего майла
account gmail
host smtp.gmail.com
port 587
auth on
user <ваше майл>
password [пароль к ниму]
# Указываем системе какой аккаунт использовать по-умолчанию
account default : gmail

По какой-то причине msmtp не хочет у меня читать «user configuration», поэтому я рекомендую использовать system configuration.

Тестирование

Теперь проверим, что настройки приняты правильно для начала повторим ввод команды
$ msmtp -P

Должен быть следующие:
loaded system configuration file C:\Documents and Settings\All Users\Application
Data\msmtprc.txt
ignoring user configuration file c:/Documents and Settings/Test\msmtprc.txt: N
o such file or directory
using account default from C:\Documents and Settings\All Users\Application Data\
msmtprc.txt
host         = smtp.gmail.com
port         = 587
timeout        = off
. . .

Теперь проверим, что отправляет:
$ msmtp -f yourmail -- yourmail <<EOF
>First line
>Second line
>EOF

Должно прийти на ваш майл письмо с веденным вами текстом.

Все на этом настройку msmtp закончим.

Хук post-commit


Немного слов о ...

В мое компании используется система управления проектами, которая умеет импортивать письма как сообщения к задачам по установлены правилам импорта.
Этим и обусловлен определенный формат сообщения коммита и наименования ветвей в git репозитроии.
Пример сообщения:
sendmail
to: yourmail
[new_state=comment]
Внесены изменения в статью.


Код хука

Создадим в папке .git/hooks файл post-commit содержащий следующий код:
  1. #!/bin/sh
  2. # получаем из переменной GIT_AUTHOR_IDENT майл текущего коммитера
  3. sender=`git var GIT_COMMITTER_IDENT | sed "s/>.*//" | cut -f 2 -d '<'`
  4.  
  5. #проверяем наличие в первой строке сообщения коммита текста sendmail
  6. if [ `git log -1 | grep -v "^Date:" | grep -v "^commit " | grep -v "^Author:" | grep -v " *Signed-off-by: " | sed "/^ *$/d" | head -1 | sed "s/[   ]*//"` == "sendmail" ]; then
  7.  
  8. #определяем из второй строчки сообщения коммита майл, #на который необходимо отправить письмо, #по-умолчанию ставиться майл текущего коммитера.
  9.   to=$sender
  10.   if [ "`git log -1 | grep -v "^Date:" | grep -v "^commit " | grep -v "^Author:" | grep -v " *Signed-off-by: " | grep -v "^[ ]*sendmail[ ]*$" | grep -e "^[ ]*[Tt][Oo]\=" | sed "/^[ ]*$/d" | head -1 | cut -f 2 -d '=' | sed "s/[ ]*//"`" != "" ]; then
  11.     to=`git log -1 | grep -v "^Date:" | grep -v "^commit " | grep -v "^Author:" | grep -v " *Signed-off-by: " | grep -v "^[ ]*sendmail[ ]*$" | grep -e "^[ ]*[Tt][Oo]\=" | sed "/^[ ]*$/d" | head -1 | cut -f 2 -d '=' | sed "s/[ ]*//"`
  12.   fi
  13.  
  14. #формируем тему сообщения, которая берется из названия ветви#но это пожеланию, можно сделать чтоб тема была взята из первой строчки основного текста сообщения
  15.   subject=`git branch | grep -e "^\*" | cut -f 2 -d '*' | cut -f 2 -d ' '`
  16.   
  17. #форматируем письмо#указываем от кого
  18.   echo "From: "$sender > temp.tmp
  19. #кому
  20.   echo "To: "$to >> temp.tmp
  21. #тему
  22.   echo "Subject: "$subject >> temp.tmp
  23. #формат тела писмьма и кодировку
  24.   echo "Content-Type: text/plain; charset=UTF-8" >> temp.tmp
  25.   
  26. #берем из лога git последние сообщение за исключениием управляющего текста
  27.   (echo; git log -1 | grep -v "^Date:" | grep -v "^commit " | grep -v "^Author:" | grep -v " *Signed-off-by: " | grep -v "^[ ]*sendmail[ ]*$" | grep -v "^[ ]*[Tt][Oo]\=" | grep -v ".*$subject.*" | sed "/^[ ]*$/d") >> temp.tmp
  28.   echo; >> temp.tmp
  29.   
  30. #добавляем diff соверщеного комита, #нам нужны только строчки начинающиеся с diff, index, +++, --- и @@#но если вам нужны все строки diff то убираем команду grep#Также удаляем все строки содержащии только пробелы, знак табуляции и пустые.
  31.   (git diff HEAD^ | grep -e "^diff" -e "^index" -e "^+++" -e "^---" -e "^@@" | sed -e "/^[+-][ ]*$/d" -e "/^[ ]*$/d" -e "/^$/d") >> temp.tmp
  32.  
  33. #выполняем команду отправки почты#--read-envelope-from указывет, что брать данные об отправителе из письма#-t указывает, что бать информацию об получатели из письма
  34.   msmtp --read-envelope-from -t <temp.tmp
  35.   rm temp.tmp
  36. fi


Хук сгенерирует письмо и отправит его с помощью msmtp.
Хук выполняется после выполнения команды git commit.
+6
14 декабря 2009, 10:50
20
VlK

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

+1
shuvalov #
с подсветкой кода было б лучше… а уж с форматированием отступами — совсем сказка!
0
artzub #
Ну как сейчас?
0
shuvalov #
стало много лучше
0
artzub #
VIK, спасибо за публикацию!
Может быть кому-то пригодится!
Я лично искал такую информацию.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.