понедельник, 6 декабря 2010 г.

How-to install gitosis (мануал с учётом проблем возникающих при установке) + интеграция в redmine

Чтобы не вводить в заблуждение, перетащил собственную статью с хабра, http://habrahabr.ru/blogs/personal/80819/

gitosis — программное обеспечение для хостинга Git репозиториев


image

Установка:


Появился скрипт авто установки пока тестируется
sudo apt-get install python-setuptools git-core -y
mkdir ~/src
cd ~/src
git clone git://github.com/sc0rp1us/gitosis-tools.git
cd gitosis-tools/gitautoinstall
sudo bash main

Дальше следуем инструкциям скрипта




Но вернёмся к статье
Для начала установим необходимые компоненты для запуска gitosis:
  • Для debian & ubuntu выполните следующие команды от пользователя root

apt-get update
apt-get upgrade
apt-get install python-setuptools git-core -y
cd ~/src
git clone git://eagain.net/gitosis.git
cd gitosis
python setup.py install


Далее зайдём в учётную запись через которую будем управлять gitosis'om (назовём её gitadmin), выгрузим дистрибутив и установим его

Настройка:


Теперь нам нужно будет создать пользователя который будет владеть хранилищем(имя может быть любым, но я предпочитаю использовать просто git), к тому же на одном сервере может быть несколько аккаунтов владеющих хранилищами, такому аккаунту не нужен пароль, но необходим действующий shell иначе SSH откажется с ним работать:
P.S. вы конечно можете использовать уже существующую учётную запись, но по соображениям безопасности, крайне не рекомендуется этого делать

  • Для debian & ubuntu выполните следующую команду


sudo adduser --system --shell /bin/sh --gecos 'git version control' --group \
--disabled-password --home /home/git git


Теперь создаём RSA ключ для беспарольного доступа

ssh-keygen -t rsa

Далее, нам необходимо выполнить команду инициализации, она создаст /home/git/repositories, который будет содержать git репозитории, и /home/git/. gitosis.conf, который является символической ссылкой на сам файл конфигурации /home/git/repositories/gitosis-admin.git/gitosis.conf, и добавит открытый ключ SSH в .ssh/authorized_keys также добавив в него опцию Command= которая ограничит ssh доступ запуском gitosis-serve.

sudo -H -u git gitosis-init < /home/gitadmin/.ssh/id_rsa.pub


ОН КОНЕЧНО ДОЛЖЕН ВСЁ ЭТО ДЕЛАТЬ, НО ДЕЛАЕТ ДАЛЕКО НЕ ВСЕГДА, ПОЭТОМУ БУДУТ ТАНЦИ С БУБНОМ, ГОТОВЬТЕСЬ, ВОЗЬМИТЕ БУБЕН, В ЛЕВУЮ РУКУ, И ЛЁГКИМ ДВИЖЕНИЕМ РУКИ УДАРЬТЕ ПО РАБОЧЕЙ ПОВЕРХНОСТИ БУБНА ПРАВОЙ РУКОЙ… Ж: — )


После чего выполняем следующее действие ( Этот костыль нужен не везде, допустим в Debian всё работает и без него, а пользователям RedHat подобных систем скорее всего пригодится ( Это и есть тот загадочный учёт проблем возникающих при установке, точнее один из них ) )

su - git
cat .ssh/authorized_keys | sed 's#gitosis-serve#/usr/local/bin/gitosis-serve#g' > 0
cat 0 > .ssh/authorized_keys && rm 0


Кстати в некоторых системах могу возникнуть проблемы с PATH путями, поэтому в нижеуказанный файлик нужно будет добавить строчку ". /etc/profile" после опции «set -e»

/home/git/repositories/gitosis-admin.git/hooks/post-update

Затем клонируйте репозитарий

git clone git@SERVER:gitosis-admin.git


и вы получите хранилище SSH ключей /home/gitadmin/gitosis-admin/keydir/ (в который нужно будет сложить публичные ключи клиентов), и /home/gitadmin/gitosis-admin/gitosis.conf (в котором нужно будет прописывать параметры репозитариев)

git clone ssh://git@localhost/gitosis-admin.git
Initialized empty Git repository in /usr/gitosis-admin/.git/
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (4/4), done
remote: Total 5 (delta 0), reused 5 (delta 0)
Receiving objects: 100% (5/5), done

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


Предупреждение


Сейчас, gitosis использует HOME переменную окружения для записи файов. Если вы используете sudo без опции -H, то git оставит старое значение HOME на месте, и это вызовет проблемы. В дальнейшем это можно будет обойти, но сейчас не забывайте использование -H.

Вы всегда должны редактировать конфигурационный файл через GIT. Файл символическими ссылками на ~/. gitosis.conf на сервере будет перезаписан при отправке изменений в gitosis-admin.git репозитарий.

Измените настройки по своему желанию, и сделайте commit и push.
После отправки на сервер, gitosis сразу же внесёт изменения, и применит их на сервере.

Управление


Добавление новых пользователей:

— Добавить файл keys/USER.pub
— Разрешить группе чтение/запись в репозитарий (или просто разрешите группе @All)

Для создания нового хранилища, просто дайте право записи для группы и сделайте push.
Например: предположим, Ваше имя пользователя jdoe, и вы хотите создать хранилище MyProject.
В вашем клоне gitosis-admin правьте gitosis.conf и добавить:

[group myteam]
members = jdoe
writable = myproject


Сейчас нам нужно отправить изменения в gitosis

git add .
git commit -am 'add new project Michael Queally-1 and users'
git push


Теперь нам нужно переинициализировать gitosis

sudo -H -u git gitosis-init < /home/gitadmin/.ssh/id_rsa.pub su - git cat .ssh/authorized_keys | sed 's#gitosis-serve#/usr/local/bin/gitosis-serve#g' > 0 && \
cat 0 > .ssh/authorized_keys && rm 0


Создаём репозиторий на локальной машине в учётной записи откуда был взят PUBLIC key

mkdir myproject
cd mypyroject
git init
git remote add MYSERVER git@MYSERVER:myproject.git
touch testfile
git add .
git commit -am 'add test file'
git push MYSERVER master:refs/heads/master


Вот и все. Теперь, если вы добавите других членов в members, они тоже смогут использовать этот репозитарий

Интеграция в redmine:


Создаём директорию для bare репозитариев, и задаём владельца

mkdir -p /srv/redmine/git_repositories/
chown wwwrun:wwwrun /srv/redmine/git_repositories/


Генерируем ssh ключ для пользователя под которым работает web-сервер (в моём случае это apache)

sudo -H -u wwwrun ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/var/lib/wwwrun/.ssh/id_rsa):
Created directory '/var/lib/wwwrun/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/lib/wwwrun/.ssh/id_rsa.
Your public key has been saved in /var/lib/wwwrun/.ssh/id_rsa.pub.
The key fingerprint is:
86:58:61:7b:56:5e:55:85:74:4f:12:33:ad:dc:1f:90 wwwrun@vzserv
The key's randomart image is:
+--[ RSA 2048]----+
| o . o**+* |
| o o ..Eo+. |
| .. o. . |
| o .. |
| .. |
| . |
| |
| |
| |
+----------------------+


Добавляем ключ в keydir и задаём на него права

cp /var/lib/wwwrun/.ssh/id_rsa.pub /home/gitadmin/gitosis-admin/keydir/wwwrun@vzserv.pub
chown gitadmin:gitadmin /home/gitadmin/gitosis-admin/keydir/wwwrun@vzserv.pub


Добавляем пользователя в репозиторий

su - gitadmin
cd gitosis-admin/
vim gitosis.conf # Добавляем пользователя в нужный нам репозиторий
git add .
git commit -am 'add redmine'

Created commit 7f94aac: add redmine
2 files changed, 2 insertions(+), 1 deletions(-)
create mode 100644 keydir/wwwrun@vzserv.pub

git push
Counting objects: 8, done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 745 bytes, done.
Total 5 (delta 2), reused 0 (delta 0)
To git@127.0.0.1:gitosis-admin.git
608aa58..7f94aac master -> master


Переинициируем gitosis (после чего он пересоздаст .ssh/authorized_keys но иногда он это делает криво)

sudo -H -u git gitosis-init < /home/gitadmin/.ssh/id_rsa.pub
gitadmin's password:
Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/


Делаем пару шаманских действий заменяем в .ssh/authorized_keys gitosis-serve на /usr/local/bin/gitosis-serve

su - git
cat .ssh/authorized_keys | sed 's#gitosis-serve#/usr/local/bin/gitosis-serve#g' > 0 && cat 0 > .ssh/authorized_keys && rm 0


Создаём директорию для bare репозитария и делаем правильный git clone

cd /srv/redmine/git_repositories

sudo -H -u wwwrun git clone --bare git@127.0.0.1:PROJECTNAME.git
cd PROJECTNAME
sudo -H -u wwwrun git --bare remote add origin git@127.0.0.1:PROJECTNAME.git
ls

HEAD branches config description hooks info objects packed-refs refs


Теперь пишем скрипт для самостоятельного обновления локального redmine репозитария, я назвал его gir(gitosis-in-redmine) и сохраняем его скажем в /root/scripts
#!/bin/sh
#The script for pull in bare gitosis repository

#set var
uname=wwwrun #Указываем в переменной имя пользователя от которого запускается наш httpd(в моём случае apache2)
rdir=/srv/redmine/git_repositories #Адрес директории где лежат подготовленные bare репозитории
tmpls=/tmp/tmpls #Указываем адрес temp файла !!! У нас должны быть права на запись !!!
#end var

#start check
if [ `whoami` == $uname ]
then

#start exec
touch $tmpls
ls -1 $rdir > $tmpls
while read LINE; do
cd $rdir/$LINE
git --bare fetch origin :master
echo "update git repository $LINE"
done < $tmpls rm $tmpls #end exec else echo "Start me from the user $uname" fi #end check


И добавляем его в крон

echo "10 * * * * wwwrun /root/scripts/gir" >> /etc/crontab
/etc/init.d/cron restart
Shutting down CRON daemon done
Starting CRON daemon


Теперь актуальность этого репозитария для resmine будет составлять 10 минут
Далее открываем браузер и идём в Redmine (Не забывайте что этот bare репозитарий должен находиться на одном сервере вместе с Redmine'om)
Кликаем следующую последовательность

Projects>projectname>Settings>Repository>

Далее в поле SCM выбираем GIT, а в поле Path to .git directory
прописываем получившийся у нас путь /srv/redmine/git_repositories/PROJECTNAME.git

И собственно всё!
Enhanced by Zemanta