По мере увеличения числа вовлечённых в проект людей возникает необходимость как-то более эффективно организовывать и управлять их деятельностью. На начальном этапе для этой цели использовались 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 "red325"
</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), то потребуется ввести имя пользователя и пароль.
Авторизация осуществлятся по проектам, т.е. доступ будет возможен только для участников проекта (менеджеры и разработчики).
Для того чтобы всё корректно работало, каталоги репозиториев в /var/hg/ должны совпадать с Identifier репозиториев, которые задаются в настройках репозитория Redmine при его создании (через веб-интерфейс). Также при создании реопзитория в Redmine необходимо указать путь к нему, например /var/hg/project. Репозитории в /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 будет автоматически отсылать уведомления участникам проекта.
Автор: polytechnic