GIT deployment

… или «нестандартное использование системы управления версиями».

Возможности GIT выходят за пределы управления версиями. Я использую его в качестве инструмента для развертывания проекта на сервере. Требуется: идентичные настройки среды проекта на рабочей станции (или испытательном стенде) и «боевом» сервере, GIT на клиенте, SSH на сервере и два простеньких скрипта.

Прежде всего создайте GIT-репозиторий в своей рабочей директории и поместите в него исходный код.

git init
git add .
git commit -m "Let there be light!"

Потом создайте GIT-репозиторий на боевом сервере.

ssh user@example.com
cd path/to/site
git init

Затем отредактируйте (там же, в директории проекта на «боевом» сервере) файл .git/hooks/post-receive так, чтобы он был примерно таким:

#!/bin/sh
cd ..
env -i /path-to-git/git reset --hard

… и сделайте его исполнимым.

chmod a+x .git/hooks/post-receive

Путь к git можно узнать, выполнив команду:

whereis git

После этого отключитесь от сервера и в локальной консоли выполните команду:

git push --force ssh://user@example.com/path/to/project/.git master:master

…и ваш локальный проект будет развернут на боевом сервере. А чтобы автоматизировать операцию, создайте исполняемый файл git-deploy.sh c таким содержанием:

#!/bin/bash
git add .
git commit -a --amend --reuse-message=HEAD
git push --force ssh://user@example.com/path/to/project/.git master:master

Каждый раз, когда вы будете выполнять этот файл, все внесенные изменения добавятся к последнему комиту и выгрузятся на сервер. То есть в истории вашего проекта не будет лишних комитов, связанных с выгрузкой на сервер, а будет только история разработки. Все эксперименты можно проводить в параллельных ветках, выгружаться на сервер они будут только после того, как вы «сольете» изменения в ветку master.

GIT deployment: 4 комментария

  1. Исправьте, пожалуйста,
    chmod 777 .git/hooks/post-receive
    на
    chmod a+x .git/hooks/post-receive

    Чем строже разрешения, тем надёжнее. Писать в наш файл посторонним юзерам не нужно.

  2. А как быть если на сервере в каталоге сайта есть масса пользовательских данных — загруженные картинки, ролики,… Скрипт их потрет, ведь в локальном репозитарии их нет. Какое решение будет оптимальным для таких сайтов?

  3. gitignore поможет. Вписываете в него файлы и директории, которые не надо «замечать» — и все! При развертывании он их не сотрет.

Добавить комментарий

Ваш e-mail не будет опубликован.