Skip to content

Сервер разработки на основе Gitosis

28/12/2010

Если Вы пользовались Joyent или Heroku, Вам должен быть знаком способ которым они делают связку хостинга и git: Вы делаете git push нужной ветки и сервер запускает этот код. Я решил сделать то же самое на своём маленьком сервере.

Основные требования к серверу были такими:

  • Использование git. Я конечно знаю SVN и CVS, но git для меня гораздо удобнее.
  • Автоматический рестарт Ноды с нужным скриптом при git push
  • Авторизация по открытому ключу, чтобы не вводить логины-пароли, и чтобы никто кроме меня не мог делать push на мой сервер
  • Возможность выполнять скрипты после получения кода но до перезапуска Node — например чтобы вызывать JSLint

Установка Gitosis

За приём соединений от git будет отвечать Gitosis. Сначала надо поставить на сервер git, если он ещё там не установлен:

sudo apt-get install git-core

Т.к. gitosis это по сути набор Python-скриптов, для его работы нужен Python. Впрочем, если Вы собирали node.js, он у Вас уже стоит. Дополнительно потребуется пакет python-setuptools

sudo apt-get install python-setuptools

Ставим сам gitosis:

mkdir ~/gitosis
cd ~/gitosis
git clone git://eagain.net/gitosis.git

Заходим в свежесозданную директорию и запускаем инсталлятор:

cd gitosis
python setup.py install

Настройка сервера

Теперь нам нужен пользователь под которым будет крутиться git/gitosis. Назовём его git:

sudo adduser \
--system \
--shell /bin/sh \
--group \
--disabled-password \
--home /home/git \
git

Мы запретили этому пользователю вход, но назначили шелл чтобы SSH работал нормально. Ещё для работы SSH нам понадобятся ключи. Генерируем их на той машине где мы редактируем код (если это ещё не сделано):

ssh-keygen -t rsa

Это пример для linux, в Windows создать ключи можно например в PuTTY. Копируем публичный ключ на сервер, например в /tmp/id_rsa.pub. Теперь нам надо добавить этот ключ в качестве разрешённого в gitosis:

sudo -H -u git gitosis-init < /tmp/id_rsa.pub

Ключ должен лежать в таком месте где пользователь git сможет его прочитать. Если всё сделано правильно, git дважды сообщит об инициализации репозитория.

Конфигурация gitosis хранится в виде репозитория и применяется при git push — как раз наш будущий сервер в миниатюре 🙂 Чтобы всё это нормально работало, нам надо в репозитории конфига сделать post-commit скрипт исполняемым.

sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

Теперь выгружаем конфиг gitosis на нашу локальную машину:

git clone git@192.168.175.129:gitosis-admin.git
cd gitosis-admin

Локальный git попросит добавить ключ сервера в список доверенных. Добавляем. У нас будет локальная копия конфигурационного файла и директории с ключами. Открываем gitosis.conf, видим примерно следующее:

[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = sas@SAS

Сейчас задана одна группа из одного проекта (конфиг) с одним пользователем (собственно я). Создадим другой проект, для хранения нашего сайта. Добавляем в конец конфига:

[group deploy]
writable = site_deploy
members = sas@SAS

В members естественно прописываете своего пользователя, как он указан в группе gitosis-admin. Комиттим изменения, делаем push на сервер.

git add gitosis.conf
git commit -m "Created new project"
git push origin master

Теперь делаем git clone нового репозитория в какую нибудь директорию локальной машины:

git clone git@192.168.175.129:gitosis-admin.git

Git скажет что мы клонировали пустой репозиторий (в принципе так оно и должно быть). Надо наполнить его чем нибудь. Я взял стандартный hello world из nodejs.ru/api.html. Сохраняем код в файл server.js в той папке куда мы клонировали репозиторий, потом отпрвляем наш файл на сервер.

git add server.js
git commit -m "Initial commit"
git push origin master

Если всё прошло нормально, файл должен отправиться на сервер.

Автоматическая выкладка кода

Теперь мы можем из git отправлять файлы на сервер, но код пока просто там хранится. Сделаем так чтобы новый код распаковывался в директорию нашего сайта. Идём в репозиторий:

cd /home/git/repositories/site_deploy.git/

Предположим что код сайта лежит в /etc/node. Идем в директорию хуков внутри репозитория, делаем post-update хук исполняемым и редактируем его:

cd hooks
chmod +x post-update

Внутри этого хука изначально есть только одна команда: exec git-update-server-info. Закомментируем её и добавим свою, распаковывающую последний коммит транка в заданную директорию:

git archive --format=tar HEAD | (cd /etc/node && tar xf -)

Эта команда распакует HEAD в /etc/node. Имейте в виду, gitosis у нас работает под пользователем git и директория должна быть доступна ему на запись.

Попробуем изменить файл server.js и отправить его на сервер ещё раз. После git push origin master в выбранной Вами директории должен появиться файл server.js.

Теперь осталось сделать так чтобы этот файл автоматически запускался нодой. Снова открываем хук post-update и добавляем нужную команду после git archive. Можно сделать либо просто node /etc/server.js & (не забыв вывести куда нибудь лог ошибок) либо использовать систему запуска вроде Init + Monit или supervise. Туда же можно добавлять дополнительные команды вроде JSLint.

P.S. Настройка Gitosis — дело непростое. Если возникли какие нибудь вопросы или сложности, предлагаю обсуждать их на форуме.

Ссылки по теме

Advertisements
15 комментариев
  1. А почему не просто использовать Capistrano?

    • Честно говоря не работал с ним. Это что то из Ruby? Оно работает с Git?

      • Да, через git репозиторий. Рубисты вообще git предпочитают. Реже mercurial.

        Изначально заточен под проекты на рельсах, но нично не мешает прикрутить его для проектов на php или ещё на чём-нибудь.

        Из бонусов: можно настроить разворачивание хоть на 10 серверов, с разной конфигурацией и возможностью отката конфигурации. Сам планирую менять хостинг, и все хостящиеся сайты деплоить через capistrano.

        В общем, если есть вопрос, с чем поковыряться на каникулах, рекомендую денёк/другой потратить на капистрано. На Хабре была статья, про настройку деплоя именно проекта на php.

  2. Sergey permalink

    посмотрите в сторону gitolite — то же самое, но по крайней мере в debian testing ставится без лишних телодвижений с помощью
    sudo apt-get install gitolite

    просто я недавно пробовал и то и другое — gitolite показался проще в установке. А работают они одинаково хорошо…

  3. Спасибо большое! Интересная статья. Попробую как — нибудь дома на локальной машине для начала развернуть данную схему.

  4. пока не ясно к чему ты там gitosis прикрутил, в задаче с одним сайтом и без него всё работает: http://joemaller.com/990/a-web-focused-git-workflow/

    …доработаешь автоматическую раскидку хуков, тогда дело будет 😉

    • У меня там есть автоматическое создание каркасов сайтов с генерацией нужных директорий, репо и всяких стартовых конфигов. Я потом это опишу.

  5. Dehimer permalink

    «Теперь выгружаем конфиг gitosis на нашу локальную машину:»
    то есть на машину, которая будет с репозиторием соединяться?

Trackbacks & Pingbacks

  1. Сервер разработки на основе Gitosis « nodeJS
  2. Resources « VBooklet Publisher

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: