Встановлення Redmine + налаштування та інтеграція SVN сховищ

Redmine — це вільна (free as freedom) система управління проектами та відстеження помилок. Написаний на Ruby on Rails Вихідний код поширюється під GNU GPL ліцензією.

Ми використовуємо Redmine для управління проєктами понад два роки. За цей час у системі набралося 80ть проєктів і півсотні користувачів.

Встановлення Redmine на Ubuntu 10.04 Server

Ставимо необхідні пакети:

aptitude install redmine redmine-mysql

Інсталяційні скрипти пропонують налаштувати пакет:

Встановлення Redmine + налаштування та інтеграція SVN сховищ

Обираємо з якою СУБД працюватиме Redmine:

Встановлення Redmine + налаштування та інтеграція SVN сховищ

Вводимо пароль адміністратора MySQL і пароль доступу до БД самого Redmine:

Встановлення Redmine + налаштування та інтеграція SVN сховищ

Встановлення Redmine + налаштування та інтеграція SVN сховищ

Якщо після цього порівняння таблиць виставляється в latin1_swedish_ci (або в будь-яке інше кодування, відмінне від utf8_general_ci), додаємо в /etc/mysql/my.cfg у секцію mysqld директиву collation-server = utf8_general_ci і character-set-server = utf8. Після чого видаляємо повністю БД і створюємо нову базу Redmine з порівнянням utf8_general_ci. Тепер розгортаємо нову базу Redmine:

# cd /usr/share/redmine/
/usr/share/redmine# rake db:migrate RAILS_ENV="production" 

Після чого у нас будуть усі таблиці в utf8_general_ci і з кирилицею не буде жодних проблем.

Налаштування mod-passenger

Mod Passenger використовується для зв'язування вебсервера Apache і додатків, написаних на Ruby On Rails.
З його допомогою Apache може працювати як вебсервер для ROR додатків.

Встановлення пакетів:

aptitude install libapache2-mod-passenger

Завантажуємо модуль Apache:

a2enmod passenger

Налаштовуємо vhost для Redmine:

vim /etc/apache2/sites-enabled/redmine.example.com
<VirtualHost *:80>
  ServerName redmine.example.com
  ServerAlias redmine.example.com
  DocumentRoot /usr/share/redmine/public
  # Без PassengerDefaultUser www-data Redmine не зможе завантажити файли на сервер
  PassengerDefaultUser www-data
 
  <Directory /usr/share/redmine/public>
    Orderallow,denyAllow from all
    RailsEnv production
  </Directory>
</VirtualHost>

Після цього Redmine має бути доступний за адресою https://redmine.example.com

Налаштування SVN сховищ та їхня інтеграція з Redmine

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

Установимо необхідні пакети:

aptitude install subversion 
aptitude install libapache2-svn libapache-dbi-perl libapache2-mod-perl2 libdbd-mysql-perl libdigest-sha1-perl

Завантажимо всі необхідні модулі Apache:

a2enmod dav
a2enmod dav_svn
a2enmod perl

Далі додамо один рядок у конфіг модуля:

vim /etc/apache2/mods-enabled/perl.load
LoadModule perl_module /usr/lib/apache2/modules/mod_perl.so
PerlLoadModule Apache::Redmine

Для того, щоб користувачі могли авторизуватися в svn під тими самими обліковими даними, що і в Redmine, створимо символічне посилання на скрипт Redmine.pm (можна просто скопіювати його, але краще створити посилання)

ln -s /usr/share/redmine/extra/svn/Redmine.pm /usr/lib/perl5/Apache/Redmine.pm

Налаштуємо vhost для svn:

vim /etc/apache2/conf.d/svn.example.com
<VirtualHost *:80>
        ServerName svn.example.com
        ServerAlias svn.example.com
 
        <Location /svn>
                 # підключаємо модуль dav svnDAV svn
                 SVNParentPath"/var/svn" 
 
                 # налаштовуємо авторизацію за логіном/паролемAuthType Basic
                 AuthName redmine
                 Require valid-user
 
                 # підключаємо скрипт Redmine.pm
                 PerlAccessHandler Apache::Authn::Redmine::access_handler
                 PerlAuthenHandler Apache::Authn::Redmine::authen_handler
 
                 # налаштовуємо підключення до БД
                 RedmineDSN "DBI:mysql:database=redmine_default;host=localhost" 
 
                 # логін і пароль для доступа до БД Redmine
                 RedmineDbUser "redmine" 
                 RedmineDbPass "password" 
        </Location>
 
        <Location /svn-private>
                  DAV svn
                  SVNParentPath"/var/svn"Orderdeny,allowDeny from all# only allow reading orders
                  <Limit GET PROPFIND OPTIONS REPORT>
                  Allow from redmine_server_ip
                  </Limit>
        </Location>
</VirtualHost>

svn-private потрібен для того, щоб дозволити самому Redmine отримувати доступ до сховищ без авторизації. Це дасть змогу повністю автоматизувати створення і підключення сховища до нового проєкту. Так само його можна використовувати на своїх серверах для оновлення вихідних кодів без необхідності авторизації.

Тепер за адресою https://svn.example.com/svn повинен виводиться діалог авторизації.

Автоматичне створення SVN сховищ для проєктів

Для цієї задачі існує скрипт /usr/share/redmine/extra/svn/reposman.rb. Він під час запуску звіряє створені проєкти в Redmine і наявні svn-сховища. І якщо є проєкт для якого немає сховища - він створить його. Для того щоб це запрацювало, потрібно прописати запуск reposman.rb у crontab:

*/5 * * * * /usr/share/redmine/extra/svn/reposman.rb --redmine redmine.example.com --key=ключ --svn-dir /var/svn --owner www-data --url https://svn.example.com/svn-private/ --verbose

Опис аргументів скрипта:

  • --key — API ключ. В Redmine Адміністрування → Налаштування → Сховище → API ключ. Вибираємо Згенерувати ключ і копіюємо його в скрипт.
  • --redmine — хост, на якому висить redmine.
  • --svn-dir — шлях до svn.
  • --owner — власник сховища.
  • --url — url до svn (svn-private потрібен для того, щоб redmine міг отримувати доступ до сховищ без авторизації).

Усе, налаштування завершено. Тепер можна спробувати створити проєкт, через деякий час для нього автоматично буде створено сховище. Після слід додати учасників у проєкт і спробувати авторизуватися з використанням їхніх облікових даних у сховищі.