По мере увеличения числа вовлечённых в проект людей возникает необходимость как-то более эффективно организовывать и управлять их деятельностью. На начальном этапе для этой цели использовались Google-таблицы, но их возможности ограничены, и появилось желание перейти на новый уровень. Изучение доступных систем управления проектами показало, что из систем с открытым кодом Redmine наиболее продвинутая и по некоторым показателям обгоняет даже проприетарные системы.
Redmine, действительно, обладает большими возможностями: управление несколькими проектами, отслеживание ошибок, интеграция с репозиториями, перекрёстные ссылки на исправленные баги в коммитах и на коммиты в баг-репортах, назначение разных ролей пользователей в каждом проекте и т.д. Однако процедура установки довольна сложна, а для некоторых очень полезных функций требуется небольшая доработка или использование плагинов. Надеюсь, что предлагаемое ниже руководство поможет желающим использовать Redmine в своих проектах.
$ sudo tasksel install lamp-server
$ 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
$ wget http://www.redmine.org/releases/redmine-3.3.3.tar.gz
$ sudo cp /usr/share/redmine/config/database.yml.example /usr/share/redmine/config/database.yml
$ sudo nano /usr/share/redmine/config/database.yml
production:
adapter: mysql2
database: redmine
host: localhost
username: redmine
password: "[password]"
encoding: utf8
$ sudo apt install ruby ruby-dev build-essential libmysqlclient-dev
$ gem install bundler
$ cd /usr/share/redmine
$ bundle install --without development test rmagick
$ cd /usr/share/redmine
$ bundle exec rake generate_secret_token
$ 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
$ sudo -u www-data bundle exec rails server webrick -e production
http://localhost:3000/
$ sudo apt-get install libapache2-mod-passenger
$ sudo ln -s /usr/share/redmine/public /var/www/redmine
$ sudo nano /etc/apache2/mods-available/passenger.conf
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>
$ sudo nano /etc/apache2/sites-available/redmine.conf
<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>
$ sudo a2enmod passenger
$ sudo a2enmod rewrite
$ sudo a2dissite 000-default
$ sudo a2ensite redmine
sudo chmod 777 /usr/share/redmine/tmp/cache
$ sudo service apache2 reload
http://[my site or ip]/redmine
или просто http://[my site or ip]
. Должна появиться стартовая страничка системы Redmine.$ sudo apt-get install mercurial libapache2-mod-perl2 libapache-dbi-perl libdbd-mysql-perl
$ sudo mkdir -p /var/hg/
$ 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)
$ 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
$ 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/
$ 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
hg init
). $ sudo chown -R www-data:www-data /var/hg/[repository name]
email_delivery:
delivery_method: :smtp
smtp_settings:
address: "10.11.12.13"
port: 25
authentification: :none
enable_starttls_auto: false
openssl_verify_mode: 'none'
--- 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>
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
bundle exec rake redmine:plugins:migrate RAILS_ENV=production
$ sudo service apache2 reload
$ sudo nano /var/hg/fetch_changes
#!/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
[hooks]
changegroup = /var/hg/fetch_changes
К сожалению, не доступен сервер mySQL