Posts Tagged ‘ ror

Debian Squeeze/sid + Apache + Redmine 0.9.3/trunk + MySQL + git/hg

Update: 已可直接从库里安装了~。

# apt-get install redmine redmine-mysql libapache2-mod-passenger
_________________________________________________________________________

按:这是在公司 WIKI 上写的文章,难得这么认真,拿出来分享一下 :)。对比过十多个项目管理系统,然后在比较好的 Redmine, Trac, Mantis 三个当中选择了 Redmine。文中以 Debian Squeeze 为例,但其它 GNU/Linux 特别是 Debian Lenny / Sid、Ubuntu 应该基本一致。

_________________________________________________________________________

一、废话

Debian 的库里有最新的 redmine 发布版(0.9.3),一个命令就可以搞定:

#apt-get install redmine

However……,安装后运行会出现 http 500 service unavailable 等问题。因为 Debian 只有 2.2.3 的 rails,而 redmine 0.9.3 要求 rails 的版本为 2.3.5。

我第一个想法是,既然库里有 redmine,就不折腾了,删掉 rails,再手工装一个新版本。可是 redmine 是依赖于 rails 的,要删得一起删。然后我就想,好,保留它,再装一个新版本覆盖之!就是这个想法……,最后遇到了很多问题,又因为对 ror 不熟,在这上面浪费了不少时间。

没办法,全 purge 掉,实实在在从头来吧。以下以 redmine-trunk 版为例(解决了 0.9.3 中存在的 wiki+php 等一些 bug)。

注:以下 # 开头的命令需以 root 身份执行。

二、依赖关系

#apt-get install ruby rubygems rake mysql-server mysql-client libmysql-ruby libopenssl-ruby
#gem install rails

三、下载 redmine

/var/projects#svn checkout http://redmine.rubyforge.org/svn/trunk redmine

注:稳定发行版本下载 http://rubyforge.org/frs/?group_id=1850

四、创建数据库

# mysql -u root -p
mysql> create database redmine character set utf8;
mysql> grant all privileges on redmine.* to redmine@localhost identified by 'PASSWORD';

五、数据库配置文件

/var/projects/redmine#cat config/database.yml
production:
  adapter: mysql
  database: redmine
  host: localhost
  username: redmine
  password: PASSWORD
  encoding: utf8

六、生成 session key

#rake generate_session_store

会将结果写入 config/initializers/session_store.rb

七、初始化数据库结构

#RAILS_ENV=production rake db:migrate

八、导入默认设置到数据库

#RAILS_ENV=production rake redmine:load_default_data

九、预览!

#ruby script/server webrick -e production

然后可以用浏览器访问 http://server:3000/ ,待测试没问题再继续。

十、用 apache 运行 redmine

WEBrick 虽然能跑,但是超慢!慢到无法忍受的地步(好奇的是,内存和cpu利用率都超低,它在干嘛呢……)。

安装:

#apt-get install apache2 libapache2-mod-passenger

权限:

#chmod -R g+w redmine
#chown -R root:www-data redmine

符号链接:

#ln -s /var/projects/redmine /var/www/redmine

配置文件:

#cat /etc/apache2/conf.d/redmine
RailsEnv production
RailsBaseURI /redmine

Done:

#/etc/init.d/apache reload
$firefox http://server/redmine/

十一、安装/修改 主题/样式(可选)

Redmine 支持基本的主题自定义(可以覆盖默认的 css)。

可以到 http://www.redmine.org/wiki/redmine/Theme_List 下载别人的主题包,解压后将包目录放到 public/themes/ 下面。

#/etc/init.d/apache reload

之后,即可访问 http://server/redmine/settings?tab=display 选择新的主题。

不过我觉得还是默认的耐看。我直接对默认的主题做了一点修改:

--- public/stylesheets/application.css    (revision 3628)
+++ public/stylesheets/application.css    (working copy)

+tr.priority-1, table.list.issues tr.priority-1 a { color: black; }
+
+tr.priority-2, table.list.issues tr.priority-2 a { color: #1c1cf3 /*similar to blue*/; }
+tr.priority-3, table.list.issues tr.priority-3 a { color: #1c1cf3; font-weight: bold; }
+
+tr.priority-4, table.list.issues tr.priority-4 a { color: red; }
+tr.priority-5, table.list.issues tr.priority-5 a { color: red; font-weight: bold; }
+
+tr.status-3, table.list.issues tr.status-3 a,
+tr.status-4, table.list.issues tr.status-4 a { color: green; font-weight: normal; }
+
+tr.status-5, table.list.issues tr.status-5 a,
+tr.status-6, table.list.issues tr.status-6 a { color: gray; font-weight: normal; }

以上加的几行,使得以不同的颜色区分不同优先级(低/高/紧急等)、不同状态(新建/进行中/反馈/已关闭等)的 issue。

十二、安装插件(可选)

很方便,下面是安装 email tls 插件的例子:

#ruby script/plugin install git://github.com/collectiveidea/action_mailer_optional_tls.git

更新数据库:

#RAILS_ENV=production rake db:migrate:upgrade_plugin_migrations
#RAILS_ENV=production rake db:migrate_plugins

十三、配置 email 发送功能 —— 任务建立/变更时,发送邮件提醒(可选)

以 GMail 为例,先要安装上一步提到的 email 插件,然后:

#cat config/email.yml
production:
  delivery_method: :smtp
  smtp_settings:
    tls: true
    address: "smtp.gmail.com"
    port: 587
    domain: "smtp.gmail.com" # 'your.domain.com' for GoogleApps
    authentication: :plain
    user_name: "xxxxx@gmail.com"
    password: "xxxxxxxxxxxxxxxx"

完了 reload apache 即可。这里 http://server/redmine/settings?tab=notifications 有一些设置选项。我去掉了 bcc,选中了纯文本。

修改 1:

--- app/models/mailer.rb    (revision 3628)
+++ app/models/mailer.rb    (working copy)
-    subject "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] (#{issue.status.name}) #{issue.subject}"
+    subject "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] #{issue.subject}" 

     s = "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] "
-    s << "(#{issue.status.name}) " if journal.new_value_for('status_id')
     s << issue.subject

修改的目的,是使得 redmine 发送的邮件提醒在标题中不要包含 issue 的状态(新建/进行中/已关闭等),从而使得关于同一个问题的所有提醒邮件在 GMail 中都能自动组织成一个会话,非常有利于上下文的理解。

redmine 默认在邮件标题中包含 issue 的状态信息,使得每一次状态变更的邮件都分散到不同的会话中,很讨厌。

修改 2:

--- config/locales/zh.yml    (revision 3628)
+++ config/locales/zh.yml    (working copy)
-  text_journal_changed: "{{label}} 从 {{old}} 变更为 {{new}}"
-  text_journal_set_to: "{{label}} 被设置为 {{value}}"
-  text_journal_deleted: "{{label}} 已删除 ({{old}})"
-  text_journal_added: "{{label}} {{value}} 已添加"
+  text_journal_changed: "{{label}}:{{old}} -> {{new}}"
+  text_journal_set_to: "{{label}}: -> {{value}}"
+  text_journal_deleted: "已删除:{{label}} ({{old}})"
+  text_journal_added: "已添加:{{label}} {{value}}"

对中文翻译的一点修改,这是邮件提醒中对 issue 变更的说明,我觉得太啰嗦了,不直观明了,没有重点。

注:如果你发现发出去的邮件,issue 链接都是带 3000 端口号的,而你现在用 apache 跑 redmine 不需要端口号,可以去 http://server/redmine/settings 改“主机名称”。这是因为你第九步的时候无意中保存过这个设置。

十四、打 patch(可选)

以下是作者提供的一个 patch,使得在 redmine 中,可以将任务指派给一个组/group,该组的所有成员都会收到邮件提醒(只是,该任务不会显示在“我的工作台”里)。

redmine#wget http://www.redmine.org/attachments/download/2965/0001-Allow-issues-to-be-assigned-to-a-Group.-2964.patch
redmine#patch -p1 < 0001-Allow-issues-to-be-assigned-to-a-Group.-2964.patch

注一:执行 patch 的时候,它会有一点小抱怨,可不予理会。

注二:http://server/redmine/groups ,此处可以增删/编辑小组及其成员。

十五、与版本控制软件集成(Git / Mercurial)

配置系统(使得只有组内的成员才可以查看/修改项目代码,不同的项目使用不同的组):

#groupadd saas
#echo 'if [ "saas" == "$(id -gn $(whoami))" ]; then umask 007; fi' >> /etc/profile

Update:
在 /etc/profile 中设置 umask 只会影响 login shell,而我们通过 git push 过来的文件仍然是默认的 755 权限(修改 .bashrc 等亦无效)。

要设置 git push 到服务器的文件的权限为 770(同组成员可写),正确的做法是:

# echo "session optional pam_umask.so umask=007" >> /etc/pam.d/common-session

此外,以下方法应该也可以(没有测试):

# echo "Subsystem git /bin/bash -c 'umask 007; /usr/bin/git'" >> /etc/ssh/sshd_config

安装 git:

#apt-get install git-core

初始化 git 版本库:

#mkdir /var/projects/saas
#cd /var/projects/saas
#git --bare init
#chown -R root:saas ../saas
#chmod -R 770 ../saas

版本库初始化完成,若要增加新的开发者(各自使用自己的帐号),由管理员执行:

#useradd -m -s /bin/bash -g saas username # 注意,若不指定,默认的 dash 会出错

并将其 pub key 添加到 /home/username/.ssh/authorized_keys 之内。

开发人员在客户端的操作:

$git config --global user.name "xxx yyy"
$git config --global user.email "xxx@gmai.com"
$git clone username@server:/var/projects/saas

测试:

$cd saas
$echo hello > world
$git add .
$git commit -a -m 'hello world'
$git push origin master

以后再 push,就不需要 “origin master” 这两个参数了。

最后,因为初始化版本库的时候我们用了 –bare 参数,在 /var/projects/saas 下是看不到项目代码文件的。

可以生成一份代码拷贝,用来在 apache 下进行测试:

#cd /var/www
#git clone /var/projects/saas
#chown -R root:saas saas
#chmod -R 770 saas
#addgroup www-data saas

开发者 push 完后,apache 下的代码并不会自动更新,若想测试(这个测试相当于预览,因为开发人员 push 之前是需要先在自己的机器上认真测试的)更新后的代码:

/var/www/saas$git pull # 注意,各用自己的帐号执行,不要用 root

至此,版本管理系统已经正常工作,还剩最后一件事:那就是告诉 Redmine,我们版本库的路径。

浏览器里打开 Redmine,新建一个项目,然后在“设置”里会有个标签叫“版本库”,选择 git,并在 path 里填 /var/projects/saas 就搞定了!

另,hg 的设置与 git 非常相似,大部分参数都一样,不另述。

十六、升级 redmine svn trunk(可选)

#svn update
#rake tmp:cache:clear
#rake tmp:sessions:clear

可能还要执行第七步和第十二步提到的更新数据库的操作。升级之前应该先备份,在测试实例上确认没有问题再升级。

十七、备份redmine数据

一是数据库:

#mysqldump -u redmine -p redmine > redmine.$(date +%F).sql

二是上传的文件:

/var/projects/redmine#tar cvzf ../redmine.uploaded.files.$(date +%F).tar.gz files/

(完)