Система управления проектами Redmine + Mercurial на Ubuntu 16.04 +10


По мере увеличения числа вовлечённых в проект людей возникает необходимость как-то более эффективно организовывать и управлять их деятельностью. На начальном этапе для этой цели использовались Google-таблицы, но их возможности ограничены, и появилось желание перейти на новый уровень. Изучение доступных систем управления проектами показало, что из систем с открытым кодом Redmine наиболее продвинутая и по некоторым показателям обгоняет даже проприетарные системы.

Redmine, действительно, обладает большими возможностями: управление несколькими проектами, отслеживание ошибок, интеграция с репозиториями, перекрёстные ссылки на исправленные баги в коммитах и на коммиты в баг-репортах, назначение разных ролей пользователей в каждом проекте и т.д. Однако процедура установки довольна сложна, а для некоторых очень полезных функций требуется небольшая доработка или использование плагинов. Надеюсь, что предлагаемое ниже руководство поможет желающим использовать Redmine в своих проектах.

Компоненты


Система управления проектами Redmine


> Официальный сайт

Основные возможности:

  • ведение нескольких проектов
  • система отслеживания событий (bug, feature)
  • разные роли пользователей (менеджер, разработчик, репортер) по каждому проекту
  • поддержка новостей, документов, файлов, wiki, форумов для каждого проекта
  • интеграция с системами управления версиями (SVN, Git, Mercurial)
  • уведомления о событиях по электронной почте
  • возможность учёта времени работы

Система контроля версий Mercurial


> Официальный сайт

Кросс-платформенная распределённая система управления версиями.

Также понадобится


Web-сервер и система управления базами данных. Использованы Mysql и Apache.

Установка


Инструкция составлена на основе полезной, но сильно устаревшей инструкции
HowTo Install Redmine 1.2.x with Mercurial and Subversion on Ubuntu Server 10.04.

Также использовалась официальная инструкция по установке
Redmine Installation Guide.

Предполагаем что у нас уже есть сервер с предустановленным на нём Ubuntu Server 16.04. Дальнейшие инструкции описывают установку системы управления и вспомогательного ПО.

Итак, начнём. Сначала устанавливаем LAMP server:

$ sudo tasksel install lamp-server

Во время установки понадобится ввести пароль root-пользователя базы данных MySQL (не путать с паролем root операционной системы).

Создаём базу данных MySQL и пользователя redmine для работы с ней. Вместо [password] вставляем желаемый пароль пользователя.

$ mysql -u root -p
(вводим пароль root базы данных MySQL)
> create database redmine character set utf8;
> create user 'redmine'@'localhost' identified by '[password]';
> grant all privileges on redmine.* to 'redmine'@'localhost';
> exit

Скачиваем Redmine со страницы www.redmine.org/projects/redmine/wiki/Download или командой

$ wget http://www.redmine.org/releases/redmine-3.3.3.tar.gz

Распаковываем Redmine в каталог /usr/share/redmine. Находим подкаталог config и копируем config/database.yml.example в config/database.yml. После этого редактируем файл, для того чтобы установить «production» режим базы данных:

$ sudo cp /usr/share/redmine/config/database.yml.example /usr/share/redmine/config/database.yml
$ sudo nano /usr/share/redmine/config/database.yml

Вводим текст и сохраняем файл (ctrl+x):

production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: "[password]"
  encoding: utf8

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

$ sudo apt install ruby ruby-dev build-essential libmysqlclient-dev

Устанавливаем Bundler:

$ gem install bundler

Теперь можно установить gems, необходимые для Redmine:

$ cd /usr/share/redmine
$ bundle install --without development test rmagick

Создаём случайный ключ, который Rails будет использовать для шифрования данных в cookie:

$ cd /usr/share/redmine
$ bundle exec rake generate_secret_token

Дальше создаём структуру базы данных (выполняем в /usr/share/redmine):

$ RAILS_ENV=production bundle exec rake db:migrate
$ RAILS_ENV=production bundle exec rake redmine:load_default_data

Устанавливаем необходимые права доступа:

$ cd /usr/share/redmine
$ sudo chown -R www-data:www-data files log tmp public/plugin_assets
$ sudo chmod -R 755 files log tmp public/plugin_assets

При желании можно протестировать установку Redmine с помощью веб-сервера WEBrick:

$ sudo -u www-data bundle exec rails server webrick -e production

После запуска WEBrick стартовая страница Redmine должна быть доступна в браузере по адресу http://localhost:3000/

Интеграция с Apache


Установить Passenger:

$ sudo apt-get install libapache2-mod-passenger

Добавить символьную ссылку на public каталог Redmine:

$ sudo ln -s /usr/share/redmine/public /var/www/redmine

Необходимо настроить пользователя Passenger по умолчанию, для этого редактируем файл:

$ sudo nano /etc/apache2/mods-available/passenger.conf

Нужно добавить следующую строчку и сохранить (ctrl+x):

PassengerDefaultUser www-data

В итоге файл должен выглядеть так:

<IfModule mod_passenger.c>
  PassengerRoot /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
  PassengerDefaultRuby /usr/bin/ruby
  PassengerDefaultUser www-data
</IfModule>

Далее создать конфигурационный файл redmine.conf для apache:

$ sudo nano /etc/apache2/sites-available/redmine.conf 

Добавить следующий текст и сохранить (ctrl+x):

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www
        ServerName myservername

        RewriteEngine on
        RewriteRule   ^/$  /redmine  [R]

        <Directory /var/www/redmine>
                RailsBaseURI /redmine
                PassengerResolveSymlinksInDocumentRoot on
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined
</VirtualHost>

Подключить модули Passenger и Rewite:

$ sudo a2enmod passenger
$ sudo a2enmod rewrite

Отключить default вебсайт и подключить redmine:

$ sudo a2dissite 000-default
$ sudo a2ensite redmine

Установить права доступа на /tmp/cache Redmine:

sudo chmod 777 /usr/share/redmine/tmp/cache

Перезапустить Apache:

$ sudo service apache2 reload

Теперь можно открыть любимый браузер и зайти на http://[my site or ip]/redmine или просто http://[my site or ip]. Должна появиться стартовая страничка системы Redmine.

Установка Mercurial


Необходимо установить пакеты:

$ sudo apt-get install mercurial libapache2-mod-perl2 libapache-dbi-perl libdbd-mysql-perl

Создать директорию, в которой будут храниться репозитории проектов:

$ sudo mkdir -p /var/hg/

Теперь мы хотим сделать репозитории доступными по http протоколу. Для этого необходимо создать cgi-скрипт:

$ sudo nano /var/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)

Теперь нужно создать файл hgweb.config:

$ sudo nano /var/hg/hgweb.config

Добавить следующее содержимое и сохранить:

[paths]
/=/var/hg/**
[web]
allow_push = *
push_ssl = false
allowbz2 = yes
allowgz = yes
allowzip = yes

Установить разрешения для файлов:

$ sudo chown -R www-data:www-data /var/hg/*
$ sudo chmod gu+x /var/hg/hgwebdir.cgi

Теперь надо создать conf файл для Apache:

$ sudo nano /etc/apache2/conf-available/hg.conf

Добавить следующее содержимое и сохранить:

PerlLoadModule Apache2::Redmine
 ScriptAliasMatch ^/hg/(.*)  /var/hg/hgwebdir.cgi/$1

    <Directory /var/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;host=127.0.0.1" 
        RedmineDbUser "redmine" 
        RedmineDbPass "[password]" 
    </Location>

Ещё необходимо создать ссылки:

$ sudo ln -s /etc/apache2/conf-available/hg.conf /etc/apache2/conf-enabled/
$ sudo ln -s /usr/share/redmine/extra/svn/Redmine.pm /usr/lib/x86_64-linux-gnu/perl5/5.22/Apache2/

Включить CGI модуль и перезапустить Apache:

$ sudo a2enmod cgi
$ sudo service apache2 reload

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

Чтобы клонировать репозиторий надо будет выполнить:

$ hg clone http://[my site or ip]/hg/project

Если клонируемый проект не публичный (устанавливается в настройках проекта через веб-интерфейс системы Redmine), то потребуется ввести имя пользователя и пароль.

Авторизация осуществляется по проектам, т.е. доступ будет возможен только для участников проекта (менеджеры и разработчики).

При создании репозитория в веб-интерфейсе Redmine необходимо указать путь к нему, например /var/hg/projectname. Репозитории в /var/hg необходимо создать вручную для каждого проекта и инициализировать командой (hg init).

После создания нового репозитория надо убедиться, что у него установлены нужные права доступа:

$ sudo chown -R www-data:www-data /var/hg/[repository name]

В принципе, есть возможность автоматизировать создание репозиториев. Информация об этом есть в руководстве по ссылке HowTo Install Redmine 1.2.x with Mercurial and Subversion on Ubuntu Server 10.04

Уведомления о фиксации изменений по email


Redmine поддерживает уведомления о разных событиях (изменениях в жизни баг/фич и т.п.). Для того чтобы пользоваться этим функционалом достаточно настроить способ отправки email-сообщений. Делается это в файле /usr/share/redmine/config/configuration.yml В файле имеются шаблоны для разных конфигураций. Нужно разкомментировать и отредактировать нужный.

Например, так:

  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: "10.11.12.13"
      port: 25
      authentification: :none
      enable_starttls_auto: false
      openssl_verify_mode: 'none'

Обратите внимание, что каждая секция в файле configuration.yml сдвинута на два пробела. Это важно.

Базовые уведомления должны быть доступны после указания способа рассылки электронных писем. Однако для уведомлений об изменениях в репозитории необходимо использовать внешний плагин. Скачать его можно с сайта github.com/lpirl/redmine_diff_email.

Установим этот плагин. Для этого скопируем содержимое плагина в каталог /usr/share/redmine/plugins/redmine_diff_email. В соответствии с инструкцией по установке плагина изменяем файл /usr/share/redmine/app/views/repositories/_form.html.erb:

--- OLD
 +++ NEW
 @@ -23,6 +23,7 @@
    <%  button_disabled = ! @repository.class.scm_available %>
    <%= repository_field_tags(f, @repository) %>
  <% end %>
 +<%= call_hook(:view_repository_form) %>
  </div>
  <p>

Оригинальный плагин работает с устаревшей версией redmine. Для redmine-3.3 нужно внести изменения в файл
/usr/share/redmine/plugins/redmine_diff_email/db/migrate/002_add_repositories_is_diff_email_attached.rb. Содержимое файла должно быть таким:

class AddRepositoriesIsDiffEmailAttached < ActiveRecord::Migration
  def self.up
    add_column :repositories, :is_diff_email_attached, :boolean, :default => false, :null => false
    Repository.update_all(["is_diff_email_attached = ?", true])
    Repository.update_all(["is_diff_email = ?", true])
  end

  def self.down
    remove_column :repositories, :is_diff_email_attached
  end
end

После этого в каталоге /usr/share/redmine выполнить команду для обновления базы данных:

bundle exec rake redmine:plugins:migrate RAILS_ENV=production

Перезапускаем Redmine:

$ sudo service apache2 reload

Если плагин установлен правильно, то в списке плагинов Administration > Plugins появится Redmine Diff Email Plugin, а также в веб-интерфейсе Redmine SomeProject > «Settings» Tab > «Repositories» Tab > «Edit» появятся настройки уведомлений.

Кроме того, чтобы информация об изменениях в репозиториях автоматически отслеживалась Redmine, необходимо выполнить дополнительные действия. Сначала нужно включить WS для управления репозиториями и сгенерировать API key. Как это делается:

* В web-интерфейсе Redmine в меню Administration выбрать Settings
* Перейти на вкладку Repositories
* Включить 'Enable WS for repository management'
* Кликнуть на ссылку 'Generate a key'
* Сохранить изменения кнопкой 'Save'

Далее создаём скрипт:

$ sudo nano /var/hg/fetch_changes

Добавляем следующий текст и сохраняем: (необходимо заменить [your API key] сгенерированным в API-ключом)

#!/bin/sh
curl "http://localhost/redmine/sys/fetch_changesets?key=[your API key]"  > /dev/null 2>&1

Устанавливаем права доступа для созданного файла:

$ sudo chown www-data:www-data /var/hg/fetch_changes
$ sudo chmod ug+x /var/hg/fetch_changes

Остаётся добавить в /var/hg/hgweb.config секцию [hooks], чтобы скрипт fetch_changes выполнялся после каждого коммита:

[hooks]
changegroup = /var/hg/fetch_changes

Теперь при изменениях в репозитории Redmine будет автоматически отсылать уведомления участникам проекта.
-->


К сожалению, не доступен сервер mySQL