RedMine + BitBucket git

В данной статье будет описана связка системы управления проектами RedMine + BitBucket. Я опишу достаточно примитивный способ — подключение зеркала репозитория BitBucket, так как ни один из найденных мной плагинов для RedMine не заработал.

Так как RedMine по умолчанию может работать только с локальными репозиториями, то мы организуем зеркало (выполним клонирование с ключом --mirror) репозитория с BitBucket на локальный сервер с RedMine, а затем подключим его как локальный к проекту.

Также мы будем периодически выполнять git fetch --all -p, чтобы синхронизировать наше зеркало с репозиторием.

Итак. Приступим.

Подготовительные работы

Создадим каталог на нашем сервере с RedMine, в котором будет находиться зеркало репозитория, сделаем его владельцем пользователя redmine. Далее все действия будем выполнять от имени пользователя redmine.

mkdir -p /var/repo
chown -R redmine:redmine /var/repo
sudo -su redmine

В каталоге /var/repo будет находиться каталог с зеркалом репозитория.

Создание ключей SSH

Ключи SSH нужны для доступа к репозиторию на сервере BitBucket. Мы создадим пару ключей (приватный и публичый), затем добавим публичный ключ DeploymentKeys нашего проекта в BitBucket.

Не забудьте изменить команду таким образом, чтобы адрес репозитория и название проекта соответствовали действительности. Далее для простоты везде будет использовано имя myproject.

Создаем ключи:

ssh-keygen -t rsa -N '' -f /home/redmine/.ssh/myproject -C 'RedMine'

В результате в каталоге /home/redmine/.ssh будут созданы два файла: myproject и myproject.pub. Теперь нужно добавить публичный ключ в наш проект в BitBucket.

cat /home/redmine/.ssh/myproject.pub

Данная команда выведет в терминал содержимое файла — скопируйте его в буфер обмена.

Теперь перейдите в свой проект в BitBucket, в левом меню внизу нажмите Settings и затем в меню настроек выберите Deployment keys.

Нажмите Add Key, укажите понятую Вам метку ключа, чтобы Вы могли в них ориентироваться, если их будет несколько, затем в поле Key вставьте из буфера скопированный ключ. Нажмите Add Key.

Клонирование репозитория

Теперь вернемся к нашему серверу RedMine.

Сперва нужно выполнить первоначальное клонирование репозитория в режиме mirror. При первом запуске git ответьте yes на предложение аутентифицировать сервер.

cd /var/repo
git clone --mirror git@bitbucket.org:myaccount/myproject.git myproject

Теперь выполним получение (fetch) всего репозитория.

cd myproject && git fetch --all -p

Теперь у вас локально имеется зеркало Вашего репозитория из BitBucket.

Настройка хранилища проекта RedMine

Локальное зеркало репозитория имеет путь /var/repo/myproject — его-то мы и добавим в настройках проекта в хранилище. На самом деле вместо myproject будет имя Вашего репозитория, как было сказано в предыдущем параграфе.

Откройте настройки проекта в RedMine и перейдите во вкладку Хранилище (в настройках, а не в самом проекте).

Нажмите Новое хранилище.

Выберите тип хранилища: git, при необходимости задайте уникальный идентификатор, затем укажите путь к репозиторию: /var/repo/myproject. Нажмите кнопку Создать.

Теперь перейдите в хранилище самого проекта. Первая загрузка может быть достаточно долгой. Дождитесь завершения. В итоге Вы должны увидеть файлы Вашего проекта. Попробуйте переключиться между ветками либо метками — всё должно работать.

Теперь снова вернитесь в настройки проекта — хранилища и напротив Вашего хранилища нажмите Пользователи. Выполните сопоставление пользователей и нажмите Сохранить.

Всё получилось!

Периодиечская синхронизация зеркала

На самом деле, все изменения, произведенные с репозиторием, автоматически не отражаются в его зеркале. Необходимо периодически выполнять команду get fetch --all -p для выполнения синхронизации.

Для этого следует добавить запись в crontab удобным Вас способом. Я предпочитаю добавлять файлы в каталог /etc/cron.d, Вы же можете воспользоваться командой crontab -e. Главное, чтобы нижеприведенные команды запускались от имени пользователя redmine.

Итак, давайте создадим файл nano /etc/cron.d/bitbucket с вот таким содержанием:

*/5 * * * *    redmine    cd /var/repo/myproject && git fetch --all -p

Или же вместо создания файла можем выполнить crontab -e и заполнить файл такой же самой строкой, но без указания имени пользователя:

*/5 * * * *    cd /var/repo/myproject && git fetch --all -p

Вы должны использовать какой-то один из способов, но не оба сразу.

Таким образом, мы добавили в крон задание, которое будет выполняться каждые 5 минут и производить синхронизацию нашего зеркала репозитория с репозиторием в BitBucket.

На этом всё. Успехов в разработке!

Литература:
[1] http://www.redmine.org/projects/redmine/wiki/HowTo_Easily_integrate_a_(SSH_secured)_GIT_repository_into_redmine
[2] http://stackoverflow.com/a/5968449

RedMine + BitBucket git: 6 комментариев

  1. Застреваю на этом : git clone —mirror git@bitbucket.org:myaccount/myproject.git myproject
    Все выше сделала по мануалу, просит пароль. Какие только не вводила, не работает, не авторизует. Какой пароль надо вводить???

    1. У вас, наверное, RSA-ключ создан с паролем (passphrase) — его и требуется ввести, скорее всего.
      Статья была написана довольно давно. С тех пор появились WEB-HOOKs в битбакете и в гитхабе — лучше использовать их функциональность вместо крона.
      Вам не придется периодически обновлять локальный репозиторий — веб-хуки инициируют настраиваемый HTTP-запрос при любых изменениях в репозитории.
      Почитайте про то, как работают веб-хуки.
      Но это не избавит вас от того, что сам локальный git не сможет авторизоваться из-за парольной фразы, которую вы задали для приватного RSA-ключа.
      В общем — пересоздайте RSA без пароля — и все заработает, а потом, все таки, лучше перейти на веб-хуки.

      1. Почитаю про веб хуки спасибо. Я впрочем их уже тоже настраиваю.
        Ключ создавала вашей же командой. Ничего лишнего не добавляла
        С гитлаба вебхуки post уходят (пишет что все ок), редмайн в продакшн.лог тоже их видит. Но почему то в репозитории редмайн изменения не появляются…
        В redmine также поставила плагин web-hook-gitlab, он что ли не отрабатывает, не пойму(

        1. Я писал свой веб-хук клиент на питоне. Он никакого отношения к редмайну не имеет. Его же я использую и на стейджинге и в продакшене. Теперья просто пушу код в репозиторий и, если это была ветка develop, автоматически обновляется стейджинг, если это была ветка master — обновляется продакшн. Ну и при любом пуше в репозиторий всегда обновляется репозиторий на сервере с редмайном. Это простенький скрипт, который отвечает на http запрос (предварительно в веб-сервере нужно отфильтровать чужие IP-адреса), затем анализирует JSON в теле этого запроса, берет оттуда значение поля [push][changes] и, если оно совпадает с нужным (develop или master), то запускает процесс обновления — простой bash-скрипт, где прописано: git reset --hard HEAD и git pull

          Что касается создания RSA-ключей. Команда то моя, но там в процессе работы будет запрошен пароль (passphrase) и желательно его не задавать, чтобы не возникло ситуаций, когда его нужно ввести, но это невозможно, так как команда запущена не в интерактивном режиме (через крон или еще как-то).

    1. Я какие-то пробовал до того, как пришел к решению, которое описал в статье — ни один плагин не работал нормально. Поэтому, собственно, и было придумано то, что описал.
      Но это было уже достаточно давно. Наверняка есть уже нормальные рабочие плагины. Я больше не поднимал этот вопрос.

      Кстати, сейчас давно уже можно реализовать тоже самое, что описано в статье, но через веб-хуки, а не планировщик. Что намного лучше и эффективней, чем периодически дергать репозиторий.

Прокомментировать