Пример автоматизации рассылки почты по коммиту в git/msmtp
В этой статье рассмотрен пример использования git хука post-commit для отправки информации о коммите, на указанный в сообщении коммита емайл, по средствам msmtp(обычно он идет в комплекте msysGit).
Составитель статьи — artzub. Любые выражения благодарности и сочувствия в его сторону.
Для того, чтобы msmtp начал отправлять письма ему необходимо прописать настройки в файле msmtprc.txt.
Чтобы узнать расположение этого файла выполните:
Эта команда выведет на экран всю информацию о конфигурации msmtp.
Должно быть что-то подобное:
Как видно конфигурации не найдено.
Давайте создадим файл в каталоге C:\Documents and Settings\All Users\Applicati
on Data\.
По какой-то причине msmtp не хочет у меня читать «user configuration», поэтому я рекомендую использовать system configuration.
Теперь проверим, что настройки приняты правильно для начала повторим ввод команды
Должен быть следующие:
Теперь проверим, что отправляет:
Должно прийти на ваш майл письмо с веденным вами текстом.
Все на этом настройку msmtp закончим.
В мое компании используется система управления проектами, которая умеет импортивать письма как сообщения к задачам по установлены правилам импорта.
Этим и обусловлен определенный формат сообщения коммита и наименования ветвей в git репозитроии.
Пример сообщения:
Создадим в папке .git/hooks файл post-commit содержащий следующий код:
Хук сгенерирует письмо и отправит его с помощью msmtp.
Хук выполняется после выполнения команды git commit.
Составитель статьи — 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 содержащий следующий код:
- #!/bin/sh
- # получаем из переменной GIT_AUTHOR_IDENT майл текущего коммитера
- sender=`git var GIT_COMMITTER_IDENT | sed "s/>.*//" | cut -f 2 -d '<'`
-
- #проверяем наличие в первой строке сообщения коммита текста sendmail
- 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
-
- #определяем из второй строчки сообщения коммита майл, #на который необходимо отправить письмо, #по-умолчанию ставиться майл текущего коммитера.
- to=$sender
- 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
- 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/[ ]*//"`
- fi
-
- #формируем тему сообщения, которая берется из названия ветви#но это пожеланию, можно сделать чтоб тема была взята из первой строчки основного текста сообщения
- subject=`git branch | grep -e "^\*" | cut -f 2 -d '*' | cut -f 2 -d ' '`
-
- #форматируем письмо#указываем от кого
- echo "From: "$sender > temp.tmp
- #кому
- echo "To: "$to >> temp.tmp
- #тему
- echo "Subject: "$subject >> temp.tmp
- #формат тела писмьма и кодировку
- echo "Content-Type: text/plain; charset=UTF-8" >> temp.tmp
-
- #берем из лога git последние сообщение за исключениием управляющего текста
- (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
- echo; >> temp.tmp
-
- #добавляем diff соверщеного комита, #нам нужны только строчки начинающиеся с diff, index, +++, --- и @@#но если вам нужны все строки diff то убираем команду grep#Также удаляем все строки содержащии только пробелы, знак табуляции и пустые.
- (git diff HEAD^ | grep -e "^diff" -e "^index" -e "^+++" -e "^---" -e "^@@" | sed -e "/^[+-][ ]*$/d" -e "/^[ ]*$/d" -e "/^$/d") >> temp.tmp
-
- #выполняем команду отправки почты#--read-envelope-from указывет, что брать данные об отправителе из письма#-t указывает, что бать информацию об получатели из письма
- msmtp --read-envelope-from -t <temp.tmp
- rm temp.tmp
- fi
Хук сгенерирует письмо и отправит его с помощью msmtp.
Хук выполняется после выполнения команды git commit.



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