• Главная
  • О нас
  • Статьи
  • Вакансии
  • Контакты

Обработка событий в GIT

20 Сентябрь 2013 by Juds in How-To tags: Git, PHP, pre-receiv

git_logo2

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

Но все же лучше предотвращать попадание таких комитов в центральный репозиторий, нежели поспешно откатываться на предыдущую стабильную версию. Для реализации этой возможности в системе управления версиями GIT существуют хуки (hooks). Под катом приведен пример систем использующейся в одном из наших проектов.

Общее

В рамках данной статьи рассмотрим «pre-receive« хук. Он является наиболее интересным для нас, поскольку позволяет, при попытке разработчиком закомитить свои изменения, просмотреть их и отклонить, если не будет выполнятся какое-то из условий. Благодаря этому можно реализовать две простые, но очень полезные вещи:

  1. Проверка синтаксиса.
  2. Запрет комитита миграций БД, которые содержат в себе операции типа «ALTER», «DELETE», «DROP», «TRUNCATE».
Первое встечается не часто,но все же не приятно видеть проседания на графиках посещаемости вызванные банальными очепятками в коде.
Второе поможет нам уберечься от нежелательных изменений в нагруженных таблицах содержащих много данных (особенно важно для таблиц с несколькими десятками миллионами записей), которые могут привести к «залипанию» СУБД . И так, приступим.

Обработчик «pre-receive» события

Сам GIT позволяет для pre-recive события вызывать только один скрипт. Но нам ничего не мешает с этого скрипта вызывать другие, необходимые нам. Поместите данный скрипт в каталог с хуками.
Листинг «pre-receive« хука:

#!/bin/sh
# Pre-receive hook executer

if [ -z "$GIT_DIR" ]; then
echo «Don’t run this script from the command line.» >&2
exit 1
fi
while read OLDREV NEWREV REFNAME ; do
for script in find $PWD/hooks/pre-receive.d/ -perm -100 ! -type d
do
$script «$OLDREV» «$NEWREV» «$REFNAME» || exit $?
done
done
exit 0

Проверка синтаксиса PHP

Далее создаем каталог pre-receive.d/ в папке с хуками, и в него помещаем нужные для нас скрипты. В данном случае — скрипт проверки синтаксиса PHP кода (php-syntax-check):

#!/bin/sh
# A pre-receive hook to disallow php syntax errors to be
# committed by running php -l (lint) on them.

EXT=»0″
NOREV=»0000000000000000000000000000000000000000″
OLDREV=$1
NEWREV=$2
REFNAME=$3
TMP_DT=$(mktemp /tmp/git.php-syntax-check.XXXXXX)
git diff-tree -r «$OLDREV» «$NEWREV» > $TMP_DT
while read old_mode new_mode old_sha1 new_sha1 status name
do
# Skip lines showing parent commit
if [ -z "$new_sha1" ]; then continue; fi
# Skip deletions
if [ "$new_sha1" = "$NOREV" ]; then continue; fi
# Check only .php files
if [ echo $name | grep "\.php$" | wc -l -ne 0 ]
then
CHK=git cat-file blob $new_sha1 | /usr/local/bin/php -l
RET=$?
if [ $RET -ne 0 ]
then
echo
echo «!!!! PUSH REJECTED !!!!»
echo
echo «Errors parsing $name.»
echo «LOL! Check your syntax.»
echo
EXT=»1″
fi
fi
done < $TMP_DT
rm -f $TMP_DT
exit «$EXT»

Проверка миграций mysql

И скрипт запрета накатывания нежелательных миграций (mysql-operations-check):

#!/bin/sh
# Pre-receive hook discarding DELETE, ALTER, DROP and TRUNCATE table migrations
EXT=»0″
NOREV=»0000000000000000000000000000000000000000″
OLDREV=$1
NEWREV=$2
REFNAME=$3
TMP_DT=$(mktemp /tmp/git.discard-alter-table.XXXXXX)
git diff-tree -r «$OLDREV» «$NEWREV» > $TMP_DT
while read old_mode new_mode old_sha1 new_sha1 status name
do
# Skip lines showing parent commit
if [ -z "$new_sha1" ]; then continue; fi
# Skip deletions
if [ "$new_sha1" = "$NOREV" ]; then continue; fi
# Check only .sql files
if [ echo $name | grep "\.sql$" | wc -l -ne 0 ]
then
if [ git cat-file blob $new_sha1 | egrep -i "delete|alter|drop|truncate" | wc -l -ne 0 ]
then
echo
echo «!!!! PUSH REJECTED !!!!»
echo
echo «DELETE, ALTER, DROP & TRUNCATE TABLE operations are not allowed.»
echo «Please contact system administrator.»
echo
EXT=»1″
fi
fi
done < $TMP_DT
rm -f $TMP_DT
exit «$EXT»

Источник: highload.com.ua

Лучшие приёмы для увеличения скорости сайта
Дайджест интересных новостей и материалов из мира PHP за последние две недели (8—22 сентября 2013)

Leave a Comment! Отменить ответ

You must be logged in to post a comment.
Уроки
  • Cinema 4D
  • Unity3D
  • PHP
  • Delphi
  • JavaScript
  • Python
  • HTML5
  • Go
Статьи
  • Новости
  • Game Development
  • PHP
  • QA
  • IT Юмор
  • Разное
Теги
Android Composer Delphi excerption experience Game Design game development gameplay Git Go! AOP google Google Analytics HHVM it experience it юмор Laravel Linux manager Phalcon PHP Python QA RFC Selenium Silex Slim Symfony 2 unity3d warcraft Yii Yii 2 Zend Framework 2 Zephir Биографии Новости Обучение веб-разработка высоконагруженные проекты дайджест дизайн исследование подборка ссылки стартап тенденции
О Нас

Juds–компания по разработке программного обеспечения, разработке веб-проектов и мобильных приложений. Все предлагаемые нами решения индивидуальны и направлены на максимально точное удовлетворение потребностей наших партнеров. Мы находимся в постоянном поиске новых ярких решений. Главные критерии – актуальность применения и инновационность.

Статьи
  • Лучшее из мира PHP за 2013
  • Полезные функции Google Analytics
  • Что в SEO можно считать нормальным и работающим, а что – отжившим
  • 30 полезных для себя вещей
  • Дайджест интересных новостей и материалов из мира PHP (20 октября — 10 ноября 2013)
  • Cinema 4D: создаем плагин – объект
IT Юмор
Метки
Android Composer experience Game Design game development google HHVM it experience it юмор Laravel manager PHP unity3d Yii Zend Framework 2 Zephir Новости Обучение веб-разработка дайджест исследование подборка ссылки стартап тенденции
© 2014 Juds. Все права защищены.