Git хуки: как я автоматизировал деплой на сервер одной командой
Вечная проблема «залить файлы на сервер»
Раньше я обновлял сайт так: правил код локально, открывал FileZilla, перетаскивал файлы на сервер. Если забыл какую-то папку — сайт падал с ошибкой. Если заливал не туда — тоже проблема.
Потом я открыл для себя Git хуки. И теперь деплой выглядит так: git push production — и код сам улетает на сервер, обновляется, кеш сбрасывается.
Как это работает
На сервере создаётся bare-репозиторий, в нём вешается post-receive хук. Когда я пушаю в этот репозиторий, хук выполняет три действия:
1. Копирует новые файлы из репозитория в рабочую директорию сайта
2. Запускает composer install, если есть новые зависимости
3. Сбрасывает кеш WordPress через WP-CLI
Всё это занимает секунд 5. Раньше через FTP — минута-две.
Мой хук
Самый простой post-receive хук, который я написал:
#!/bin/bash
git --work-tree=/var/www/site --git-dir=/var/repo/site.git checkout -f
cd /var/www/site && composer install
wp cache flush
Работает безотказно уже год. Если что-то идёт не так — пушаю фикс, через 5 секунд сайт снова работает.
Безопасность
Я не храню пароли в репозитории. Все секреты в .env файле на сервере, а сам .env добавлен в .gitignore. При деплое хук копирует .env.example, если .env не существует.
Также настроил хуки на pre-commit, которые запускают линтер и проверяют синтаксис PHP. Если код кривой — коммит отклоняется. Это спасает от глупых ошибок в продакшне.
Совет
Если вы до сих пор таскаете файлы на сервер через FTP — поставьте Git и настройте деплой через хуки. Это займёт час времени, но сэкономит дни в перспективе.