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

    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

    И собственно всё!
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 7

      0
      Я когда-то писал небольшой враппер для управления gitosis-репозиториями, может кому-то будет полезен: git.hackndev.com/?p=farcaller/gm.git;a=summary
        0
        Возник вопросик. А почему вы считаете, что bare-репозиторий должен находится на той же машине, что и основной репозиторий?

        И кстати, чтобы не делать скрипт на кроне, я исправил файл /redmine_root/lib/redmine/scm/adapters/git_adapter.rb, строки
        def branches
          branches = []
          cmd = "#{GIT_BIN} --git-dir #{target('')} branch"
        

        заменил на
        def branches
          branches = []
          cmd = ""cd #{target('')} && #{GIT_BIN} fetch && #{GIT_BIN} --git-dir #{target('')} branch"
        


        Это привело к тому, что теперь обновление репозитария в redmine происходит при обновлении страницы «Хранилище». Как только допилю этот хак до состояния плагина, выложу по человечески =)
          0
          >> branches = []
          >> cmd = "«cd #{target('')} && #{GIT_BIN} fetch && #{GIT_BIN} --git-dir #{target('')} branch»

          а как такая конструкция будет себя вести, если какой либо программист выложит в репо пару гектаров контента, как это иногда бывает?
            0
            естественно, плохо. Но если честно, я слабо представляю коммит в проект в пару гектар…

            И хотелось бы всё-таки узнать ответ на вопросик. Про bare-репозиторий.
          0
          >>естественно, плохо. Но если честно, я слабо представляю коммит в проект в пару гектар…
          ну скажем на пару я немного преувеличил, но вчера собственноручно пришлось залить пол гиктара в репо, даже при учёте того что это всё находилось в локальной сети, заняло немало времени

          >> bare-репозиторий должен находится на той же машине, что и основной репозиторий?
          >> И хотелось бы всё-таки узнать ответ на вопросик. Про bare-репозиторий.
          да действительно тут я оплошал, куда bare-репозитарий склонируете соответственно там он и будет лежать, и работать хоть с redmine'om хоть с чем
            +1
            За howto — спасибо, прям в закладки.

            Но объясните мне, почему все до припадка строят заборы
            sed 's/gitosis-serve/\/usr\/local\/bin\/gitosis-serve/g' ????

            sed 's#gitosis-serve#/usr/local/bin/gitosis-serve#g'!!!
            указав после s разделитель можно использовать ЛЮБОЙ символ, хоть пробел, ага! Правда не стоит так делать, по очевидным причинам снижения читабельности.
              0
              Спасибо за правку, внёс изменения в статью.

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое