Zum Inhalt springen

Von Redmine wechseln

Einen Redmine-Importer gibt es nicht. Die Struktur legst du von Hand an, Tickets, Kommentare und Zeiten bringst du mit einem eigenen Skript über die REST-API herüber. Diese Seite zeigt, was wozu passt, was verloren geht und wie du den Umzug planst.

Was wozu passt

Redmine Lalabase
Projekt Projekt in einer Organisation. Agenturen führen meist eine Organisation pro Kunde
Unterprojekt Keine Entsprechung. Nimm getrennte Projekte oder ein Projekt mit Tags
Ticket Ticket
Tracker Ein Ticketfeld deiner Wahl, zum Beispiel ein Auswahlfeld „Typ“
Status, Priorität Ticketfelder, pro Projekt konfiguriert
Benutzerdefinierte Felder Ticketfelder: Auswahl, Mehrfachauswahl, Checkbox, Text, Datum. Felder an Projekten oder Benutzern gibt es nicht
Kategorie Auswahlfeld, das ein Skript füllen kann, oder ein Tag
Zielversion Auswahlfeld. Eigene Versions- oder Roadmap-Seiten gibt es nicht
Unteraufgaben Unteraufgaben, eine Ebene tief
Zugehörige Tickets Ticket-Beziehungen
Beobachter Follower
Rollen Rollen, pro Organisation
Wiki Wissen, mit versionierten Notizen
Dateien, Dokumente Dokumente
Zeitbuchungen Zeiterfassung, jede Buchung einzeln abrechenbar
Repositories Verbundene Repositories

Was Lalabase nicht hat

Prüf das zuerst. Hängst du an einem dieser Punkte, bleibt Redmine vielleicht die bessere Wahl.

  • Tickets per Mail anlegen. Lalabase verschickt Mail, liest aber keine.
  • Gantt-Diagramm und Kalender. Es gibt Liste und Board.
  • Foren und News.
  • Plugins. Ein Plugin-System gibt es nicht. Für eigene Werkzeuge gibt es die REST-API und MCP.
  • Zeit-Aktivitäten. Eine Buchung hat eine Beschreibung, aber keine Art wie „Design“.

Was ein Skript mitnehmen kann

Die REST-API liegt unter /api/v1 und braucht einen Zugriffstoken, der schreiben darf. Eine öffentliche Referenz gibt es noch nicht. Jeder Schreibzugriff zählt für den Besitzer des Tokens, und pro Token sind 60 Anfragen in der Minute erlaubt.

Daten Über die API Was verloren geht
Tickets POST /api/v1/projects/:project_id/tickets: Titel, Beschreibung, Eltern-Ticket, Zuständige, Felder Autor und Erstelldatum: Autor bist du, Datum ist heute. Nummern werden neu vergeben
Kommentare POST /api/v1/tickets/:ticket_id/posts, als HTML oder mit format: plain Autor und Datum, wie bei Tickets
Zeiten POST /api/v1/tickets/:ticket_id/time_sessions mit Datum und Dauer Die Person: Jede Buchung landet beim Besitzer des Tokens
Tags, Ticket-Beziehungen Nicht möglich Nimm statt Tags ein Auswahlfeld und setz Beziehungen von Hand. Bei Tags hilft die Massenbearbeitung
Anhänge Nicht möglich Von Hand hochladen oder verlinken
Wiki Nicht möglich Wichtige Seiten von Hand übernehmen
Projekte, Felder, Benutzer Nicht möglich Vorher in der Web-App anlegen
Änderungsverlauf Nicht möglich Der Verlauf der Statuswechsel bleibt zurück

Drei Dinge ersparen dir später Ärger:

  • Leg ein Textfeld „Redmine-ID“ an und füll es, damit alte Nummern auffindbar bleiben.
  • Schreib den ursprünglichen Autor und das Datum in die erste Zeile jeder Beschreibung und jedes Kommentars.
  • Wandle Textile oder Markdown in deinem Skript in HTML um. Lalabase liest beides nicht.

Sollen die Buchungen pro Person erhalten bleiben, lass den Zeitimport mit einem Token pro Person laufen. Jede Person erstellt dafür ihren eigenen Token.

Den Umzug planen

  1. An einem Projekt ausprobieren. Nimm ein kleines, abgeschlossenes und beurteile das Ergebnis mit deinem Team.
  2. Die Struktur anlegen. Lege Organisationen, Projekte, Ticketfelder und Rollen an und lade die Leute ein. Die Einladungen brauchen funktionierenden Mailversand.
  3. Entscheiden, wie viel mitkommt. Offene Tickets und die Zeiten des laufenden Abrechnungszeitraums reichen oft. Für alles andere bleibt das alte Redmine schreibgeschützt.
  4. Den Import laufen lassen, erst Tickets, dann Kommentare, dann Zeiten. Protokolliere, welche Redmine-ID zu welchem Ticket wurde, damit ein abgebrochener Lauf weitermachen kann.
  5. Prüfen und umschalten. Vergleiche pro Projekt die Zahl der Tickets und die gebuchten Stunden mit Redmine, dann schalte Redmine auf schreibgeschützt.