Merge Files and Documents - Design Wireframes Posted
Shane Pearlman from the Redmine UX team has created some wireframes for his proposed changes to Redmine's File and Document modules. The Redmine teams are thinking about merging the two modules together into a single Media Library module. The UX team is still looking for more feedback on the designs. If you are a heavy user of these modules or want to help contribute to Redmine's direction, please reply on the forum thread.
Redmine 1.0 Feature: Caching Text Formatting
One of the new features included in Redmine 1.0 is the ability to cache the text formatting. Each time Redmine displays any text markup, like Textile, it has to run the text through a conversion process to get HTML. This means that an issue with 30 comments will run this conversion runs 31 times, once for the issue description and once for each comment.
The Cache Text Formatting feature will take the results of that conversion and save it so the next time that HTML is needed, the conversions can be skipped. By default this is off but it can be turned on by in the Administration Settings with the option "Cache formatted text".
It uses Ruby on Rails' MemoryStore for caching. This will save the cached data to the memory of the running Ruby process. But it can replaced with any other Cache Store. For example, I just setup a memcached cache for demo.redmine.org using the following configuration:
# config/additional_environment.rb
#
config.gem 'memcached' # For other hosts
# config.gem 'memcached-northscale', :lib => 'memcached' # For Heroku.com
require 'memcached'
config.cache_store = :mem_cache_store, ::Memcached::Rails.new
If you are interested in more details about this feature, checkout issue #4482 and my blog post where I went through how the text formatting works in more detail.
BugMash 1.0 Results
This weekend we held the first ever Redmine BugMash. 21 bugs were fixed, including everything needed for the upcoming 0.9.5 release.
- pre can't be inside p
- projects.atom with required authentication
- Week number calculation in date picker is wrong if a week starts with Sunday
- mail handler fails when the from address is empty
- Member role forms in project settings are not hidden after member added
- session cookie path does not respect RAILS_RELATIVE_URL_ROOT
- External links not correctly displayed in Wiki TOC
- "fiters" and "options" should be hidden in print view via css
- Ellipses at the end of snippets shouldn't be textilized
- NoMethodError (undefined method `[]' for nil:NilClass)
- Add a hook to the issue report (Summary) view
- Ruby 1.9 - wrong number of arguments (1 for 0) on rake db:migrate
- Ruby 1.9 - when attempting to change password error raised IOError in MyController#password
- SVN Repository: Can not list content of a folder which includes square brackets.
- Navigation to the Master Timesheet page (time_entries)
- redmine:email:receive_imap fails silently for mails with subject longer than 255 characters
- Fewer SQL statements generated for watcher_recipients
- Exclude "fields_for" from overridden methods in TabularFormBuilder
- TimelogController#destroy assumes success
- Search for Numeric Value
- Login and mail should not be case sensitive
I also wanted to especially thank the participants who where able to get a patch contributed:
- Andrew Fenn
- Greg Mefford
- Gregor Schmidt
- Holger Just
- Jan
- Jean-Baptiste Barth
- Jérémy Lal
- Yuki Kita
- and many others who helped out on IRC this weekend.
Because of the success of this BugMash, we are considering having another one. So if you weren't able to participate this time, there will be another one soon. If you're interested in helping out, as a participant or an organizer, leave a comment below.
BugMash 1.0
I'm organizing the first Redmine BugMash this weekend. It's loosely based off the Rails Bridge BugMash with the goals of:
- cleaning up Redmine for the 1.0 release and
- getting more people contributing to Redmine
I'll be working on the Wiki pages for the event as well as putting together a list of issues I'd like to resolve. If you have some time and would just to join, stop by irc this weekend and we'll help you get started.
Redmine Client - Access the Redmine API in Ruby
Redmine 1.0 will include a REST API so I've started to build a Rubygem to make accessing the API in Ruby easy. So far redmine_client has support for all of the current APIs in Redmine, including:
- Read/write support for Issues
- Read/write support for Projects
- Read support for News
Installation is an easy gem install redmine_client
and it's used just like ActiveResource. For example to change Issue #19000 on the demo.redmine.org site using the "bob" user:
require 'rubygems'
require 'redmine_client'
RedmineClient::Base.configure do
self.site = 'http://demo.redmine.org'
self.user = 'bob'
self.password = 'somepassword'
end
issue = RedmineClient::Issue.find(19000)
issue.subject = "Changed via the API"
issue.save
Both the Redmine API and the redmine_client are under development so I'll be adding new features over the next few months up to Redmine 1.0. Feel free to fork the project on Github and hack away at it.
YARD - Local Redmine Documentation Download
Redmine has a large codebase and sometimes it's hard to find the class or method that you need for your custom development. Since I recently added support to Redmine for YARD (a powerful Ruby documentation tool) I figured that I'd post the generated documentation here.
YARD generates HTML documentation from Redmine's code comments, so it's fully automatic. I like YARD over RDoc because it has a better design and has a JavaScript search builtin.
To install, just extract one of these zip files and open the index.html
in a web browser. Instant local documentation!
- Redmine YARD documentation from trunk at r3631
- Redmine YARD documentation from trunk at r3631 with Ruby on Rails 2.3.5
If you want to regenerate the documentation from your Redmine, just install the YARD gem (gem install yard
) and run rake yard
while in the Redmine root directory.
If you want to improve the documentation or code comments, feel free to submit a patch to Redmine and we will integrate it into the core.
Redmine Continuous Integration Server
The development group at finnlabs have setup a continuous integration server for Redmine at ci.finn.de. It's currently testing the entire range of supported Ruby versions and databases with Redmine (and some versions that aren't fully supported yet):
- Redmine 0.9.x on MySQL with Ruby 1.8.7
- Redmine 0.9.x on Postgres with Ruby 1.8.7
- Redmine 0.9.x on Sqlite3 with Ruby 1.8.7
- Redmine trunk on MySQL with Ruby 1.8.7
- Redmine trunk on Postgres with Ruby 1.8.7
- Redmine trunk on Sqlite3 with Ruby 1.8.7
- Redmine 0.9.x on MySQL with Ruby 1.9.1
- Redmine 0.9.x on Postgres with Ruby 1.9.1
- Redmine 0.9.x on Sqlite3 with Ruby 1.9.1
- Redmine trunk on MySQL with Ruby 1.9.1
- Redmine trunk on Postgres with Ruby 1.9.1
- Redmine trunk on Sqlite3 with Ruby 1.9.1
- Redmine 0.9.x on MySQL with Ruby jruby
- Redmine 0.9.x on Postgres with Ruby jruby
- Redmine 0.9.x on Sqlite3 with Ruby jruby
- Redmine trunk on MySQL with Ruby jruby
- Redmine trunk on Postgres with Ruby jruby
- Redmine trunk on Sqlite3 with Ruby jruby
It's hooked up to the official Redmine repository so every code change will run the tests to make sure nothing was broken and report to the #redmine
IRC channel. This will really make it easy for the Redmine developers to make sure Redmine runs correctly on the broadest set of platforms it can.
Thanks Holger Just, Gregor Schmidt, Konstantin Haase, and the rest of the team at finnlabs for managing this resource for the Redmine community.
Community Update #6
There's been a lot of activity in the Redmine community over the past few months. Here are some highlights from November 2009:
Code changes
Close versions
Versions can now be given a status which will close a version, preventing assigning new issues to it (#1245). This is great if you want to prevent adding additional features to a version, like during a release process. The three version statuses are:
- open: no restriction
- locked: can not assign new issues to the version
- closed: can not assign new issues and can not reopen assigned issues
Url to fetch changesets for a repository
In #2925 a new action was added to allow fetching the changesets for a repository to be triggered by a url. This means that when:
http://your-redmine.com/sys/fetch_changesets
is called Redmine will fetch all of the changesets for all projects.
You can also specific only one project to fetch with http://your-redmine.com/sys/fetch_changesets?id=my-project-id
.
Update trackers from the issue form
Feature #2405 changed the issue form so the Tracker Type can be changed as part of an issue update. This means that if a Feature was entered incorrectly as a Bug, it can be updated directly. Doing this used to require Moving the issue first.
Add or remove columns from the issue list
Feature #4272 adds a new set of options to the Issues list filters. Now you can add, remove, and reorder columns on the fly. I've found this useful for running reports on the issues like: "What are the target versions of issues that have an estimate, are due this week, and are assigned to someone?".
Tree based menus
Redmine will now support Tree based menus. This means any of the menus (the project menu, the top menu, the administration menu) can now have submenus and submenus. The Redmine core isn't taking advantage of this change yet, but some plugins have created additional menus and I suspect this will be used more in the near future.
The feature request shows an example of how the menus are structured as well as how to use the new API.
Allow custom fields for Versions
#4219 added support for defining custom fields on Versions.
Copy and Move
A 'Copy' check box was added to the Issue Move form. This will make it easy to copy multiple issues to another area of Redmine (e.g. different project, different Tracker). Added for Feature #1847.
Managers able to create subprojects
#2963 fixed a bug so users with the "Add Project" permission can now create sub projects. Before, they could only create top level projects.
"View Issues" user permission
#3187 adds a new permission "View Issues". This permission has always been "on" for users but now it is possible to turn it off if you don't want someone to see the issues list at all.
Allow [#id] as subject to reply by email
When the Email Receiving option is Redmine is configured, sending an email with the subject line of:
Subject: [#101]
would not find issue #101 correctly. Bug #3653 corrects this.
child_pages wiki macro on with ?version in URL
#4152 added the ability to specify a specific page version when using the child_pages
wiki macro.
Community Events
6 new themes from Rajesh Krishnan
Rajesh Krishnan has released 6 new themes for Redmine. Each one has a different color scheme with some minor variations. If you're looking for a new theme for your Redmine, check them out.
Screenshot pasting plugin
Jean-Philippe Lang posted a quick plugin for Redmine that shows how a screenshot can be pasted directly into the issue form using a Java applet.
Redmine Harvest plugin
Jim Mulholland created a plugin to integrate Harvest time tracking into Redmine. He includes a short screencast of how it works on his blog post.
Scrum PM plugin
Marcin Jędras is working on a Scrum plugin for Redmine. It current supports some drag and drop planning but he's planning to add more features in the next releases.
iRedmine - iPhone app
Thomas Stägemann has released an iPhone app for Redmine called iRedmine. It's released under the GPL and the code is available on Github. I've tried it out and it's a great start. There are still some bugs but I've already found it useful, especially while traveling.
Community Update #5
There's been a bunch of activity in the Redmine community lately. This post will highlight some of the major changes from September and October.
Code changes
Groups
Jean-Philippe Lang added group support to the Redmine trunk. This makes it easy to assign a set of people to each project. Each group can be given an existing Role in Redmine so you can control their permissions using the existing settings. Added in r2869 for Issue #1018.
Attachments are added to an issue even during a failed save
A bug was fixed when a user would:
- Try to post an update to an issue with a file attachment.
- The update failed because someone else updated the issue first.
- Attachments would still be added to the issue, without a journal entry.
r2875 changed this so the attachments would be deleted if the update failed (step #3). I don't agree with the behavior, I'd rather have Redmine store the attachments and then try to reattach them after the user resubmits. Added for Issue #3846.
Include spent time in the Activity
When time is logged to a project, it can now be included as part of the Activity stream. This also works on the cross-project Activity stream (e.g. http://example.com/activity). Added in r2877 for Issue #3809.
Customize the Issue filters on custom queries
Issue #2883 added the ability to edit the filters on a custom query. So if you use custom queries for reporting, you can now add or remove filters to modify the data that's displayed without having to edit the custom query itself.
Remove Watchers
Jean-Philippe Lang added the ability to remove issue watchers in r2977. I've been missing this feature for some time, since I use watchers to make sure specific people are notified of changes to issues.
Hide user profiles if they have no visible activity
User profiles (at /account/show/user-id) are now hidden unless the user has any public activity. This will be useful to hide user accounts who should not be listed in the public. Added in r2986 for Issue #3720.
Community Events
Backlogs plugin
Mark Maglana released the Backlogs plugin, a plugin that will help a team visualize the work in progress and work remaining. The announcement contains a url to a demonstration of the plugin.
Workload plugin
Christopher Mann created a Workload plugin for Redmine. It looks interesting and might compliment the Schedules plugin. The plugin can be downloaded from the forum thread or from Github.
Amazon S3 storage plugin
Christopher Dell has created a plugin that will let Redmine save file uploads to Amazon's S3 service. I'm extremely interested in this, since S3 storage is very cheap and makes hosting Redmine in the cloud a lot easier. I'm planning on trying out the plugin and posting a review of it here.
Bugzilla migration script
Ralph Juhnke has posted a new migration script to convert a Bugzilla install to Redmine. His script has been posted to Github and should work with both Redmine 0.8.x and trunk.
Redmine Repository Controls plugin
Brian created the Redmine Repository Controls plugin. This plugin allows more fine grained repository access control and permissions, based on Subversion's SVNAuthz file. It currently only supports Subversion but he's left the ability to support any SCM that uses WebDav. More information can be found on it's Google Code page.
Redmine Risk plugins
Daniel Neis Araujo and Nicolas Bertet both created two different risk management plugins for Redmine. The plugins are both trying to make it easy for Redmine users to define and evaluate the different risks that are involved in a project. As I haven't looked at either one yet, if you are using one please let me know what you think in the comments.
Community Update #4
I have a lot of updates from Redmine for the Community Updates so I'm going to split them into a few posts. This update will cover events from July 13th through September 1st.
Code changes
Git Branch support
Adam Soltys created a patch to add branch support for the git SCM repository. This patch will let you browse through all of the branches in a git repository including the revisions and diffs. It's gone through a few bug fixes but I've had some great experience using it in production on my Redmine so far. This was committed in r2840 for Issue #1406.
If you would to try this out, my Stuff To Do project is public.
Exporting a custom issue query to PDF will use the custom columns
In r2841 Jean-Philippe Lang fixed a bug that prevented custom columns from working with the issue list PDF export.
Journal entry in Issue not displaying correctly
I added a small tweak to the Journal entries (Issue notes) so any lists are aligned properly when Gravatars are enabled or disabled. Committed in r2848 for Issue #3771.
Community Events
Wiki Extensions plugin
Haru Iida has made several updates to his Wiki Extensions plugin. It's under rapid development so if you're interested in it I'd recommend watching the forum thread about it.
Code Review plugin
Haru Iida also released a few new versions of the Code Review Plugin with a bunch of bug fixes and compatibility updates. You can find the release notes in these forum topics: Code Review Plugin 0.2.0 Released. and Code Review Plugin 0.2.7 Released..
NewIssueAlerts plugin
chantra created a new plugin called NewIssueAlerts. When it's installed, it will let you setup a Redmine project to add an email address into the new issue email notification. This would be useful to notify specific people whenever an issue is created. You can read about the plugin on the forum thread and download the plugin from Github
Global Filter Plugin
Kumudha Rangachari posted the Global Filter plugin which will display a list of your global filters on the Redmine homepage. This would be very useful if you use saved Queries a lot and need to navigate to them quickly. The wiki page has some documentation as well as the Readme file on the Github project.
It also includes a related change which I think is interesting. On the issue list there will be a new set of filters which can be used to further the issue list to show only specific projects. This is visible on the wiki page in the screenshot at the very bottom. Personally, I think this feature would be good to be included in the Redmine core.
Default Assigned User
Robert Chady created a plugin that adds the ability to automatically assign an issue to a default user when it's created. I'm thinking of using this on my smaller projects, where one person is responsible for the majority of the work. You can get the plugin from Github and read about it in Issue #482.
I'm thinking about writing these posts at the end of every month. Let me know if you like that idea in the comments below.
Embedding Github's Gist into Redmine
Asynchronous Email Delivery
I wanted to share a simple performance tweak for Redmine's email notifications that you might not know about
Overview
Redmine sends email notifications when an event happens, like an issue update. This happens entirely within the HTTP request/response cycle; so if your email server is slow, Redmine will also be slow because it's waiting on the server to respond. The basic steps Redmine takes during an issue update is:
- User updates issue #100 with a new comment
- Redmine saves the comment to the database
- Redmine connects to the email server to deliver the email notifications
- The email server receives the connection and sends the email
- Redmine redirects the User to the updated issue #100
So if the emailing steps (#3 and #4) take a long time, the user would have to wait for the email server to send the email before the user saw the new page. If we can bypass the email steps, the user would be able to do keep working while the email is processed.
The standard Rails way for bypassing the email server is to use a message queue and run a background process to send emails. There is a specialized Rails plugin that can do this for email, called ar_mailer. But Redmine comes with another option that is trivial to setup and gives good enough performance. This option is the :async_smtp
and :async_sendmail
delivery_methods, added in issue #613. To configure them, all you have to do is to change one option in your config/email.yml
and restart Redmine.
SMTP configuration example
production:
# Was "delivery_method: :smtp"
delivery_method: :async_smtp
smtp_settings:
tls: true
address: "secure.emailsrvr.com"
port: 587
domain: "littlestreamsoftware.com"
authentication: :plain
user_name: 'projects@littlestreamsoftware.com'
password: 'plugins'
Sendmail configuration example
production:
# Was "delivery_method: :sendmail"
delivery_method: :async_sendmail
How it works
The code for this is so trivial, I'm going to include it entirely in this post:
### From config/initializers/10-patches.rb
# Adds :async_smtp and :async_sendmail delivery methods
# to perform email deliveries asynchronously
module AsynchronousMailer
%w(smtp sendmail).each do |type|
define_method("perform_delivery_async_#{type}") do |mail|
Thread.start do
send "perform_delivery_#{type}", mail
end
end
end
end
ActionMailer::Base.send :include, AsynchronousMailer
The guts of this code is in the Thread.start
method call. That will start a new Ruby thread to connect to the email server and perform the actual email delivery. The original thread can continue on it's merry way and return the HTML response back to the user. So the flow above would let steps 3 and 4 happen in parallel to step 5. This might not be a large performance improvement, due to how Ruby threads work, but it's an easy thing to setup and could shave seconds off of your response time.
If your looking for an easy performance tweak, or you've noticed that your email server is responding slowly this would be worth the 10 minutes to test out.
Technical note: This is a grossly simplified version of Ruby thread performance. There are a lot of factors that will determine how much faster (if at all) this will make Redmine, including if either thread becomes blocked while waiting on IO (e.g. network IO to the web server, network IO to the email server). At the very worst case, the performance will be almost as good as sending mail synchronously.
Rails 2.3.4 Support
Recently Redmine was upgraded to run on the latest version of Ruby on Rails, 2.3.4. Redmine has been running on older versions of Ruby on Rails, 2.2.2 in trunk and 2.1.2 in 0.8.x. This upgrade will also allow us to take advantage of new Ruby on Rails APIs and third party code. I was able to fix the major bugs during the upgrade but like any other major change, there will be a few small bugs that appear over the next few weeks.
If you are able to run Redmine in a test environment, please upgrade to the latest trunk and let us know about any bugs or odd behavior you find. If you can troubleshoot the bug and are able to provide a patch, that would be awesome.
With this upgrade complete, I'm going to focus my energy into building the REST API for Redmine. I'm hoping to build out the authentication part first so plugin developers will be able to add their own APIs. If you have an idea of what you'd like to use a Redmine API for, please comment on the API ideas forum thread I've posted.
Community Update #3
It's time for another update on what's been happening in the Redmine community. This installment covers from May 18th through July 12th.
Code Changes
Anonymous issue creation via email
Redmine's mail handler is a very powerful component, allowing users to send email to create new issues or update existing ones. r2789 added some additional options, including the ability to accept email from unknown users and automatically create accounts for them. This makes it easy to publish an email address for anyone to send new requests directly to Redmine.
Enhancement to about script
The about script, commonly called script/about
, is used to let someone know what version of Redmine and Ruby on Rails you are running. #3387 enhanced the script to also include information about the installed Redmine plugins and their version. I know this will help me support my plugins by understanding what versions people encounter bugs on.
Administration panel breadcrumbs
A few sections of the Administration panel now has breadcrumb links to help navigate up a level. Personally, I'd like to redo the entire navigation of the Administration panel, but that will have to wait. r2810 added breadcrumbs for:
- Custom Fields
- Enumerations
- Issue statuses
- Roles
- Trackers
- Users
Fix for Bazaar merge tags
When branches are merged in Bazaar, a merge commit is performed. Redmine wasn't able to parse these merge commits which causing some commits to be missing from Redmine's database. Scott Aubrey supplied a patch for parsing the merge commits correctly, which was committed in r2780.
Enumerations storage change
r2777 included a major internal change to how Enumerations are stored. Enumerations include time entry activities, document categories, and issue priorities. To the user or administrator of Redmine, this change has no real impact. But plugin developers can take advantage of this change by being able to define their own custom Enumerations. If you are a plugin developer and need to store data that is similar to the existing Enumerations, I'd recommend you try to take advantage of this change.
Plugin hooks
A few plugin hooks were added for plugin developers.
:view_versions_show_contextual
- r2771:view_account_left_bottom
- r2772:view_account_right_bottom
- r2772:model_changeset_scan_commit_for_issue_ids_pre_issue_update
- r2773:controller_messages_new_after_save
- r2774:controller_messages_reply_after_save
- r2774:controller_wiki_edit_after_save
- r2774:controller_timelog_edit_before_save
r2775
User Groups under development
I also noticed that Jean-Philippe Lang has started development on user groups in a separate groups
branch. User groups is one of the major features scheduled for 0.9 and I know several organizations that are looking forward to this feature, especially the time savings it'll have. There's no time estimate when this will hit trunk but I suspect it will be over the next few weeks.
Community Events
There was a huge number of plugins developed over the past months. I'm so happy that the community is really innovating with plugins.
Campfire notification plugin
Edouard Brière created a Redmine plugin that will send issue notifications to a Campfire room. This would be useful to get real time notification of Redmine updates into your company chatroom. I wonder if someone will create one of these for IRC.
Code review plugin - 0.1.8.6
Haru Iida has released a new version of the Code Review plugin. This is a minor release that includes some bug fixes from the last release.
Developer Rates plugin
Shaun Gilroy has released a plugin called Developer Rates. From what I've heard, this plugin will let you attach an hourly rate to each time entry in Redmine. It's worth a look if you want to track any hourly costs in Redmine.
HoptoadServer plugin
Jan Schulz-Hofen has released the HoptoadServer plugin. Hoptoad is a service that will collect and manage errors from a Ruby on Rails application. The service provides a free plugin that you use to report to the Hoptoad servers. The HoptoadServer plugin allows Redmine to act as a Hoptoad server, replacing the need for the Hoptoad service. I'm already using this plugin with a few applications I'm hosting and I've been very happy getting all the errors sent directly to Redmine.
Hudson plugin
Toshiyuki Ando has released a plugin to integrate the Hudson continuous integration system into Redmine. The Hudson plugin has been under active development, with several releases in the past month. I don't run Hudson, but the integration this plugin provides is making me consider a switch to Hudson.
Issue import script
Joe Chin Hi Rene posted an example script that can be used to import issues from a CSV file into Redmine. If you're looking for a quick way to get a bunch of issues created, this script might be a good starting point.
Laconi.ca plugin
Ciaran Jessup has released a Laconi.ca plugin for Redmine that will integrate Redmine notifications into Laconi.ca, Twitter, or Identi.ca. Once configured, this plugin will send notifications to the service making it easier to other people to follow what's happening in Redmine. This continues the recent trend of having Redmine send it's notifications out to external services.
Squeejee theme - 0.2.0
Mischa The Evil has uploaded a new version of the Squeejee theme for Redmine. This is a darker theme than the default Redmine theme and includes a wide variety of graphics. Mischa has done a terrific job of documenting which versions of Redmine, browsers, and plugins are compatible with it. If you're looking for a high quality theme with great support, I'd recommend trying anything Mischa packages.
Redmine Collapse plugin - 0.2.2
Mischa The Evil also released a few updates to his Redmine Collapse plugin. This plugin modifies the default layout of Redmine so the entire sidebar can be hidden away from view. This is useful if you work with a lot of data or need more monitor space. Once again, Mischa has some great documentation on it's compatibility on the plugin page.
Watersky theme
Konstantin Zaitsev has posted a new theme for Redmine, titled watersky. This is a nice blue theme for Redmine, using images instead of text links on the menus.
Wiki Extensions plugin
Haru Iida released another plugin which adds a few new wiki macros to Redmine, titled Wiki Extensions. If you're using the wiki in Redmine a lot, you will want to take a look at the demo page he put up to see if there's anything you could use.
If you hear about something in the Redmine community that you think is useful, please let me know about it and I'll try to spread the word.
Eric
Community Update #2
This is the second installment of what's happening the Redmine community. This installment covers from March 28th through May 18th, which ended up being somewhere around 700 changes, messages, and updates. I've tried to highlight some of the major code changes and events in the community.
Code Changes
Redmine 0.8.4 released
Redmine 0.8.4 was released this past weekend. It's a bug fix release with a security update may affect people running Phusion Passenger. The list of bugs fixed in the release can be found on the changelog. Since this fixes a potential security issue (below), all users are recommend to upgrade or audit their Redmine install.
Weak autologin token generation algorithm causes duplicate tokens
The random sequence generator used by the autologin token wasn't being checked if it was creating unique values. This generator was replaced with the one from Ruby on Rails in ActiveSupport::SecureRandom
and a database validation to improve security. Alexander Pavlov included a database query to see if you have been affected by the bug.
Add email notification on Wiki changes
Jean-Philippe Lang added an option to send email notification of wiki page creations and changes in r2749. It can be enabled in the Administration Panel under Email Notifications. The email notifications look good and include a link to view the diff of the wiki page on Redmine.
Create project for no administrator user
Jean-Philippe Lang changed how projects are created in Redmine so normal users can now be given permission to create projects. This is controlled by the "Create Project" permission so each site can turn it on or off for specific users. #1007
Users can have multiple roles
Jean-Philippe Lang committed yet another great feature to Redmine in Issue #706. Now a user will be able to have multiple Roles on a project, making it easier to control permissions and security. I'm going to start using this feature by separating out some common Roles like "Bookkeeper" and "Reports". Since this was a pretty major feature, there are going to be a few bugs to work out of the system as it's used. I'd recommend trying it out in a development environment for now and waiting a week or so for any major issues to be resolved.
script/about was failing on the production database
script/about
is a Ruby script that will print out information about the current Redmine environment including library versions, database versions, and other debugging information. It looks like there was an error on a Ruby on Rails update so the script would only load the development environment. In r2733 the missing library was added so script/about
should work for production instances again.
Community Events
Redmine Blog Plugin
Andrew Chaika just released Redmine Blog 0.0.3. This is a plugin that will give users the ability to write blog posts inside of Redmine. I think this could be very interesting on larger projects where teams want to store knowledge about the project inside of Redmine itself.
Redmine Code Review Plugin
Haru Iida released a Code Review plugin for Redmine. This will let a user add a code review on a particular piece of code in the code repository. I'm considering using this on my Open Source plugins so others can help to review and improve the code.
If you hear about something in the Redmine community that you think is useful, please let me know about it and I'll try to spread the word.
Eric
Copying a Project
Community Update #1
This is the first installment of regular updates of what's happening the Redmine community. I'm going to highlight the recent code changes and some important events by community members. This installment covers from March 20th through March 28th.
Code Changes
There was a lot of activity this past week with Jean-Philippe fixing a lot of bugs that have cropped up in trunk.
Email notifications of status changes on issues used the old status in the subject
In #3194, Chaoqun Zou noticed that if an issue's status was changed, the email notifications would use the old Status name in their subject line. This was fixed by a minor change to the emailing methods in r2673.
Deleting a parent wiki page will prompt about removing child pages.
Before r2676, when a parent wiki page was removed all of the child pages would be deleted also. This is could cause some data loss if the user isn't aware of it. Now, when a parent page is deleted, the user will be prompted with a few options for what to do with the child pages:
- Move the child pages to the root of the wiki
- Move the child pages under a different parent page
- Delete the child pages.
Issue #3202 has some more details about this change.
Missing attachment
Missing attachment files will now return a HTTP 404 not found instead of the 500 error. I've seen this come up a couple of times. r2692
Issue Grouping
Jean-Philippe Lang committed a very nice feature to the Issues list in r2696, Issue grouping. Now the Issue List can be grouped by a specific column.
Community Events
Schedules plugin release
Brad Beattie just released a new version of the Schedules plugins. This version should be compatible with both Redmine 0.8.3 and trunk. I've been using Schedules everyday since it was first released to help plan out my day.
Local avatar plugin released
Andrew Chaika has been busy developing a few plugins for Redmine. He has an Local Avatars plugin that will let administrators use local versions of user avatars instead of the Gravatar service. Like he said, this would be useful for corporate emails that can't use Gravatar.
Vote plugin released
Not to be content with only one release, Andrew Chaika also released the first version of the Issue Vote plugin. This plugin will allow users to vote on issues. This would be extremely useful for public or Open Source projects to discover user interest. I'm going to be looking at adding it to my Redmine soon.
Rate and Budget plugins released
I've also released the first version of the Redmine Rate plugin and an update to the Budget plugin. I personally think they are great plugins, but I'm little biased.
Synchronizing Two Git Repositories
Farzad FARID recently wrote up a great tutorial for synchronizing two git repositories with Redmine. In his example, he configured his Redmine git repository to sync up with a GitHub one.
If you hear about something in the Redmine community that you think is useful, please let me know about it and I'll try to spread the word.
Eric
Setup Redmine to send email using GMail
There's been quite a discussion about setting up Redmine to use GMail's SMTP server for sending emails. I've seen this being a pain point for a lot of people so I've decided to write up a set of directions on how to get your Redmine setup to use GMail's SMTP. I've tested this process with Redmine 0.8.3, 0.8-stable, and trunk (r2670) using my personal GMail account.
1. Install the action_mailer_optional_tls plugin
The action_mailer_optional_tls_plugin
adds a TLS
option to Redmine's emailing library, ActionMailer. TLS is a version of SSL which is required by GMail in order to send email.
To install this plugin, use the script/plugin
command in your Redmine directory:
ruby script/plugin install git://github.com/collectiveidea/action_mailer_optional_tls.git
2. Configure your email.yml
Redmine uses email.yml
to store all the configuration for the email servers. This is used instead of config/environment.rb
to setup a connection to a SMTP server. Each Redmine environment (development, test, production) can have it's own configuration section. If you are configuring Redmine to be used on a production server, I'd recommend just configuring the production mode like below:
# File: config/email.yml
production:
delivery_method: :smtp
smtp_settings:
tls: true
address: "smtp.gmail.com"
port: '587'
domain: "smtp.gmail.com"
authentication: :plain
user_name: "your_email@gmail.com"
password: "your_password"
A complete file that uses GMail for development and production would look like:
# File: config/email.yml
production:
delivery_method: :smtp
smtp_settings:
tls: true
address: "smtp.gmail.com"
port: '587'
domain: "smtp.gmail.com"
authentication: :plain
user_name: "your_email@gmail.com"
password: "your_password"
development:
delivery_method: :smtp
smtp_settings:
tls: true
address: "smtp.gmail.com"
port: '587'
domain: "smtp.gmail.com"
authentication: :plain
user_name: "your_email@gmail.com"
password: "your_password"
test:
delivery_method: :test
One important thing to watch, is that this file only uses spaces. If there are tabs anywhere it in, Redmine will not be able to read the file correctly and you will not be able to connect to GMail.
3. Start up Redmine and test your Email
Next it's time to start up Redmine and to send a test email. Make sure that you start Redmine in the same mode as you configured above (e.g. production). To send a test email:
- Login as an administrator
- Go to the Administration panel
- Go into the Settings and select the "Email notifications" tab
- In the bottom right, click the link to "Send a test email"
This should cause Redmine to send a email using GMail's SMTP. Below you can see a log of the connection from my log/production.log:
Processing SettingsController#index (for 127.0.0.1 at 2009-04-13 16:24:50) [GET] Parameters: {"action"=>"index", "controller"=>"settings"} Rendering template within layouts/base Rendering settings/edit Completed in 1029ms (View: 840, DB: 9) | 200 OK [http://localhost/settings] -> "220 mx.google.com ESMTP 28sm495064wfd.5\r\n" <- "EHLO smtp.gmail.com\r\n" -> "250-mx.google.com at your service, [0.0.0.0]\r\n" -> "250-SIZE 35651584\r\n" -> "250-8BITMIME\r\n" -> "250-STARTTLS\r\n" -> "250-ENHANCEDSTATUSCODES\r\n" -> "250 PIPELINING\r\n" <- "STARTTLS\r\n" -> "220 2.0.0 Ready to start TLS\r\n" <- "EHLO smtp.gmail.com\r\n" -> "250-mx.google.com at your service, [0.0.0.0]\r\n" -> "250-SIZE 35651584\r\n" -> "250-8BITMIME\r\n" -> "250-AUTH LOGIN PLAIN\r\n" -> "250-ENHANCEDSTATUSCODES\r\n" -> "250 PIPELINING\r\n" <- "AUTH PLAIN ---------------\r\n" -> "235 2.7.0 Accepted\r\n" <- "MAIL FROM:\r\n" -> "250 2.1.0 OK 28sm495064wfd.5\r\n" <- "RCPT TO: \r\n" Processing AdminController#test_email (for 127.0.0.1 at 2009-04-13 16:25:11) [GET] Parameters: {"action"=>"test_email", "controller"=>"admin"} Sent mail to -> "250 2.1.5 OK 28sm495064wfd.5\r\n" <- "DATA\r\n" -> "354 Go ahead 28sm495064wfd.5\r\n" writing message from String wrote 2605 bytes -> "250 2.0.0 OK 1239665113 28sm495064wfd.5\r\n" <- "QUIT\r\n" -> "221 2.0.0 closing connection 28sm495064wfd.5\r\n" Redirected to controllersettingstabnotificationsactionedit Completed in 2293ms (DB: 4) | 302 Found [http://localhost/admin/test_email]
If you're curious about what the connection is saying, any ->
is GMail talking to Redmine and any <-
is Redmine talking to Gmail. The important thing to see is where GMail responds with a 250 status code near the end of the connection. This means that the connection was successful and that the email will be delivered. About a minute later, I saw the test email in my inbox from GMail.
Conclusion
If you follow this set of directions, you can easily setup GMail with Redmine. If this was helpful, please let me know in the comments or suggest a new article.