Задача: Проработать шаги по настройке связки Redmine 3.4.4 и системы контроля версий базирующейся на Mercurial, плюс при создании проекта именем проекта именовался репозитарий и доступ к нему через Webинтерфейс только тем кто обозначен в Redmine правами доступа. Откуда такой интерес? Просто когда я был на одном из собеседовании то в вакансии было требование работа используя связку Redmine + GIT (данную связку я проработаю обязательно и постараюсь опубликовать в следующих заметках), а я рассказал о своем опыте описанном в этой заметке. Главное принцип один и тот же, значит вникнуть как используется на рабочем месте я смогу.

Все работает от 08.05.2019

Шаг №1: tips_ubuntu_18_04_redmine_v1.odt

Шаг №2: Устанавливаю на систему необходимые пакеты уже после развернутой из заметки Redmine on Ubuntu 18.04.

ekzorchik@srv-bionic:~$ sudo apt-get install apache2 apache2-utils libapache2-mod-wsgi python-setuptools python-pip mercurial libapache2-mod-perl2 libapache-dbi-perl libdbd-mysql-perl -y

Шаг №3: Поднимаю связку Mercurial + Web интерфейс, в основе шаги из заметки:

ekzorchik@srv-bionic:~$ sudo mkdir /var/www/html/hg

ekzorchik@srv-bionic:~$ sudo nano /var/www/html/hg/hgwebdir.cgi

#!/usr/bin/python

from mercurial import demandimport; demandimport.enable()

from mercurial.hgweb.hgwebdir_mod import hgwebdir

import mercurial.hgweb.wsgicgi as wsgicgi

application = hgwebdir('hgweb.config')

wsgicgi.launch(application)

sudo nano /var/www/html/hg/hgweb.config

[paths]

/=/var/www/html/hg/**

[web]

allow_push = *

push_ssl = false

allowbz2 = yes

allowgz = yes

allowzip = yes

ekzorchik@srv-bionic:~$ sudo chown -R www-data:www-data /var/www/html/hg/*

ekzorchik@srv-bionic:~$ sudo chmod gu+x /var/www/html/hg/hgwebdir.cgi

ekzorchik@srv-bionic:~$ sudo nano /etc/apache2/sites-available/hg.conf

PerlLoadModule Apache2::Redmine

ScriptAliasMatch ^/hg/(.*) /var/www/html/hg/hgwebdir.cgi/$1

<Directory /var/www/html/hg>

Options +ExecCGI

</Directory>

<Location /hg>

AuthType Basic

AuthName "Mercurial"

Require valid-user

AuthUserFile /dev/null

#Redmine auth

PerlAccessHandler Apache::Authn::Redmine::access_handler

PerlAuthenHandler Apache::Authn::Redmine::authen_handler

RedmineDSN "DBI:mysql:database=redmine_default;host=127.0.0.1"

RedmineDbUser "redmine/instance"

RedmineDbPass "712mbddr@"

</Location>

ekzorchik@srv-bionic:~$ sudo a2ensite hg.conf

ekzorchik@srv-bionic:~$ sudo ln -s /usr/share/redmine/extra/svn/Redmine.pm /usr/lib/x86_64-linux-gnu/perl5/5.26/Apache2/

ekzorchik@srv-bionic:~$ sudo a2dismod mpm_event

ekzorchik@srv-bionic:~$ sudo a2enmod mpm_prefork cgi

ekzorchik@srv-bionic:~$ sudo pip install demandimport

ekzorchik@srv-bionic:~$ sudo service apache2 reload

ekzorchik@srv-bionic:~$ sudo a2dissite

Your choices are: 000-default hg

Which site(s) do you want to disable (wildcards ok)?

Открываю Web-страницу http://IP&DNS доступа в Redmine, авторизуюсь:

  • Login: admin
  • Pass: Aa1234567

перехожу «Администрирование» – «Настройки» – «Хранилища» и привожу «Включенные SCM» к виду где стоит отметка галочкой у системы хранения версий Mercurial, у всех других галочку снимаю и нажимаю «Сохранить». Как видно у меня Mercurial версии 4.5.3

Отмечаю систему хранения версий Mercurial для Redmine 3.4.4

Репозитории будут доступны по адресам http://[my
site or ip]/hg/*. Например, для проекта project адрес будет таким http://[my
site or ip]/hg/project. Если у проекта project будет подпроект subproject1, то его репозиторий будет доступен по адресу http://[mysite or ip]/hg/project/subproject1.

Создаю первый проект:

«Проекты» - «Новый проект»

  • Имя: example

и нажимаю «Создать», затем зайти в созданный проект «example», перейти в «Настройки» – «Участники» – «Новый участник» и добавить необходимых, в рамках изучения добавляю группу «Redmine Admin» и отмечаю роли: Manager & Developer. После нажимаю «Добавить»

После создаю «Новое хранилище» для созданного проекта, для этого перехожу в настройку «Хранилища» – «Новое хранилище»:

  • Тип хранилища: Mercurial
  • Хранилище по умолчанию: отмечаю галочкой
  • Уникальный идентификатор: example (к примеру в честь названия проекта)
  • Путь к хранилищу: /hg/example
  • Кодировка пути: UTF-8

и нажимаю «Создать»

Теперь создаю вручную репозитарий на Ubuntu 18.04 Server где развернут Mercurial + Redmine и инициализирую:

ekzorchik@srv-bionic:~$ cd /var/www/html/hg/

ekzorchik@srv-bionic:/var/www/html/hg$ sudo mkdir example

ekzorchik@srv-bionic:/var/www/html/hg$ cd example/

ekzorchik@srv-bionic:/var/www/html/hg/example$ sudo hg init

ekzorchik@srv-bionic:/var/www/html/hg/example$ cd ~

ekzorchik@srv-bionic:~$ sudo chown -R www-data:www-data /var/www/html/hg/example/

После проверяю, что могу зайти в через Web в репозитарий проекта: http://IP&DNS/hg/example авторизуюсь под учетными данные которые имеют доступ в созданный проект, т. к. я создал под учетной записью admin то их и указываю:

Пробую обратиться к репозитарию через Web-интерфейс

Нажимаю «Вход», но почему-то не пустило

Не пускает в репозитарий по имени проекта

Нужно было в hg.conf поправить <Directory hg> на <Directory /var/www/html/hg>, после сохранить внесенные изменения и перезапустить Apache2:

ekzorchik@srv-bionic:~$ sudo systemctl restart apache2 && sudo systemctl status apache2 | head -n5

Затем нажав клавишу F5 у меня отобразился Web-доступ к репозитарию:

Исправление конфигурационного файла и после F5 я внутри репозитария по имени проекта

Работает. Т.е. я создал проект в Redmine, указал для него используемое хранилище кода, создал сам репозитарий и достук к нему возможен только у авторизованных учетных данных указанных при создании проекта.

Шаг №4: Вот только это все в ручную, хотелось бы чтобы при создании проекта репозитарий создавался автоматически, разберу сейчас:

http://IP&DNS — user&pass — Администрирование — Настройки — Хранилища

  • Автоматически следить за изменениями хранилища: отмечаю галочкой
  • Включить веб-сервис для управления хранилищем: отмечаю галочкой

нажимаю «Сгенерировать ключ» и напротив настройки

API ключ: появится сгенерированный ключ: 2ziknMZ8XHv5twS4OczR

Разрешить ссылаться и исправлять задачи во всех остальных проектах: отмечаю галочкой

Включить учет времени: отмечаю галочкой

и нажимаю «Сохранить»

На заметку: Когда включили веб-сервис следует внести изменения в hg.conf

#Enable Web Service

<Location /sys>

Order deny,allow

Allow from 172.33.33.2

Deny from all

</Location>

ekzorchik@srv-bionic:~$ sudo systemctl restart apache2 && sudo systemctl status apache2 | head -n5

ekzorchik@srv-bionic:~$ sudo nano /usr/share/redmine/extra/svn/reposman.rb

#после Module SCM добавляю

module SCM

module Mercurial

def self.create(path)

Dir.mkdir path

Dir.chdir(path) do

system_or_raise "hg init"

end

end

end

После не забываем сохранить внесенные изменения.

Узнаю синтаксис: /usr/share/redmine/extra/svn/reposman.rb —help

Пробую сперва запустить чтобы строка отработала:

ekzorchik@srv-bionic:~$ ruby /usr/share/redmine/extra/svn/reposman.rb --redmine-host localhost --scm Mercurial --svn-dir /var/www/html/hg --owner www-data --url http://172.33.33.2/hg/ --key 2ziknMZ8XHv5twS4OczR --verbose >> /tmp/repostman.log

Traceback (most recent call last):

24: from /usr/share/redmine/extra/svn/reposman.rb:170:in `<main>'

23: from /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:70:in `require'

22: from /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:70:in `require'

Шаг №5: Создадим задание на запуск скрипта каждую минуту тем самым проверяя если есть новый проект, а под него предопределено хранилище то его нужно создать:

ekzorchik@srv-bionic:~$ sudo nano /etc/cron.d/redmine

* * * * * root ruby /usr/share/redmine/extra/svn/reposman.rb --redmine localhost/redmine --scm Mercurial --svn-dir /var/www/html/hg/repos --owner www-data --url /var/www/html/hg/repos --key=2ziknMZ8XHv5twS4OczR >> /var/log/reposman.log

Проверяю, как создастся репозитарий если я создам проект и предопределю для него репозитарий Mercurial:

Смотрю логи, и вижу что чего-то не хватает, устанавливаю:

ekzorchik@srv-bionic:~$ sudo tail -f /var/log/reposman.log

This script requires activeresource.

Run 'gem install activeresource' to install it.

ekzorchik@srv-bionic:~$ dpkg -l | grep redmine

ii redmine 3.4.4-1

ekzorchik@srv-bionic:~$ sudo gem uninstall activeresource

Successfully uninstalled activeresource-5.1.0

ekzorchik@srv-bionic:~$ sudo gem install activeresource -v 3.2.22.1

вот с этой версией 3.2.22.1 все заработало.

ekzorchik@srv-bionic:~$ ruby /usr/share/redmine/extra/svn/reposman.rb --redmine-host 172.33.33.2 --scm Mercurial --svn-dir /var/www/html/hg --owner www-data -group www-data --url http://172.33.33.2/hg/ --key cRkfajVZi90WNDuTRx16 --verbose

querying Redmine for active projects with repository module enabled...

retrieved 3 projects

processing project example (example)

processing project test (test)

repository for project test already exists in Redmine

processing project tost (tost)

repository for project tost already exists in Redmine

Правильная строчка: от 08.05.2019

ekzorchik@srv-bionic:~$ sudo nano /etc/cron.d/redmine

* * * * * root ruby /usr/share/redmine/extra/svn/reposman.rb --redmine-host 172.33.33.2 --scm Mercurial --svn-dir /var/www/html/hg --owner www-data --group www-data --url http://172.33.33.2/hg/ --key cRkfajVZi90WNDuTRx16 --verbose >> /var/log/reposman.log

Шаг №6: Как работает создание репозитария для проекта:

http://IP&DNS — user&pass (admin&712mbddr@) - Проекты — Новый проекта

  • Имя: aka_ekzorchik
  • Уникальный идентификатор: aka_ekzorchik

и нажимаю «Создать» , затем перехожу в «Участники» – «Новый участник» , отмечаю группу «Redmine Admin» и отмечаю обязательные роли «Manager, Developer» и нажимаю «Добавить». Переходить в настройку «Хранилища» не нужно. Скрипт сам создаст репозитарий, в файле журнала будет

ekzorchik@srv-bionic:~$ sudo tail -f /var/log/reposman.log

processing project aka_ekzorchik (aka_ekzorchik)

repository /var/www/html/hg/aka_ekzorchik created

repository /var/www/html/hg/aka_ekzorchik registered in Redmine with url http://172.33.33.2/hg/aka_ekzorchik

ekzorchik@srv-bionic:~$ ls /var/www/html/hg/aka_ekzorchik/ -al

total 12

drwxrwxr-x 3 www-data www-data 4096 May 8 23:02 .

drwxr-xr-x 8 root root 4096 May 8 23:02 ..

drwxrwxr-x 3 www-data www-data 4096 May 8 23:02 .hg

Также и доступ в Mercurial репозитарий через Web-интерфейс

Репозитарий по имени проекта создался автоматически - цель достигнута

Отлично работает. От 08.05.2019. Чего я добился выше указанными действиями, при использовании Redmine, когда создается проект в автоматическом режиме создается репозитарий по имени проекта, также можно через Web-интерфейс зайти в созданный репозитарий проекта. На этом у меня всё, с уважением автор блога Олло Александр aka ekzorchik.

От ekzorchik

Всем хорошего дня, меня зовут Александр. Я под ником - ekzorchik, являюсь автором всех написанных, разобранных заметок. Большинство вещей с которыми мне приходиться разбираться, как на работе, так и дома выложены на моем блоге в виде пошаговых инструкции. По сути блог - это шпаргалка онлайн. Каждая новая работа где мне случалось работать вносила новые знания и нюансы работы и соответственно я расписываю как сделать/решить ту или иную задачу. Это очень помогает. Когда сам разбираешь задачу, стараешься ее приподнести в виде структурированной заметки чтобы было все наглядно и просто, то процесс усвоения идет в гору. Также прошу на https://win.ekzorchik.ru https://lin.ekzorchik.ru https://net.ekzorchik.ru https://voip.ekzorchik.ru https;//home.ekzorchik.ru