Programmable Processes for Redmine

Instead of tedious clicking through the Redmine user interface and doing the same things over and over again, you can describe how it works once. Then you can execute the process from the command line. redmineBOOST will ask you for the necessary data and will take care of the rest. Boost the productivity of your daily work with Redmine using redmineBOOST on the command line.

An Example

Let's say you track issues for a project in Redmine. The example process described creates an issue and asks for a project, subject, tracker, description and note. The command line based execution of a redmineBOOST process might look like the following:

user - rboost - 80 x 10
user@host: rboost new-issue.rbo
Creating Issue
Select project:
Project#1: Project1
Project#2: Project2
Project#3: Project3
Executed Choice:
  value: Project#3: Project3
Issue subject: Issue
Executed LineInput:
  value: Issue
Select tracker:
Tracker#1: Bug
Tracker#2: Feature
Executed Choice:
  value: Tracker#2: Feature
Issue description: Example description
Executed TextInput:
  value: Example description
Issue note: Lorem ipsum …
Executed TextInput:
  value: Lorem ipsum …
Create Issue
  assignedTo: User
  project: Project3
  subject: Issue
  tracker: Tracker
  description: Example description
  notes:
    * Create Note
        text: Notes
Created Issue#2
user@host: _

Easy, right? To clarify how much you had to type, the user input is emphasised. Now let's see how this would look if you did it all in the Redmine user interface:

Redmine - Create Issue
www.redmine.org/issues/new

New Issue

Redmine - Show Issue
www.redmine.org/issues/2
✔︎ issue #42 created

Tracker #42✏️

Example Issue

Added by User just now.

Status New Start date today
Priority Normal Due Date today + 30d
Assignee User % Done 0%
Tracker Tracker

Example description

Redmine - Edit Issue
www.redmine.org/issues/2

Tracker #2

Example Issue

Added by User just now.

Status New Start date today
Priority Normal Due Date today + 30d
Assignee User % Done 0%
Tracker Tracker

Example description

Edit

Change Properties

Edit

Notes

That's a lot of user interaction. And we didn't even bother to add everything you need to do.

Benefits

With redmineBOOST even simple tasks get boosted.

Define processes and use them

Instead of documenting processes and then training users how to map it in Redmine, define it within a redmineBOOST process and reuse it. Done!

Versioned processes

redmineBOOST processes are stored in files. Each file can be versioned. Backup. Change. Introspect. Evolve.

Reduced navigation in Redmine

You don't have to navigate to a specific project and then go through the steps of your process, you just execute the redmineBOOST process. Done!

Data inputs are collected efficiently

No re-entering the same information each and every time. It's written once and used.

Use Redmine constructs as they are meant to be used

Creating projects with specific module configurations, roles and users - no problem. Nesting issues and linking them - no problem. All that is done automatically with redmineBOOST.

Process Description

And how does it work? The following figure shows the described example redmineBOOST process from above. A domain specific language is used for description.

new-issue.rbo
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// Present choice for a project
let issueProject = Choice<Project> {
    description: "Select project:"
    options: GetProjects()
}.value

// Show line editor to enter issue subject
let issueSubject = LineInput {
    description: "Issue subject:"
}.value

// Present choice for a tracker
let issueTracker = Choice<Tracker> {
    description: "Select tracker:"
    options: GetTrackers()
}.value

// Show editor to enter multiline description
let issueDescription = TextInput {
    description: "Issue description:"
}.value

// Show editor to enter multiline note
let issueNote = TextInput {
    description: "Issue note:"
}.value

// Create issue with provided data
Issue {
    assignedTo: GetCurrentUser()
    project: issueProject
    subject: issueSubject
    tracker: issueTracker
    description: issueDescription
    Note {
        text: issueNote
    }
}