HopSaaS
Jetzt vergleichen
Zero-Downtime-Migrations-Blueprint

Migrationsleitfaden: Jira Software zu Linear

Praktisches Handbuch zur fehlerfreien Daten- und Team-Migration ohne Datenverlust.

Quelle: Jira Software
→
Ziel: Linear
•
Reibungsscore: 34/100
3-Sekunden Migrationstriage

Migrationspfad: Jira Software → Linear

Verifizierte Migrationstriage
34 / 100
Geringe Komplexität

Reibungsindex

Geschätzte Cutover-Zeit
8-16 Std.

Geschätzte Stunden für Datenmigration, Verifizierung und Cutover.

Datenverlustrisiko
Niedrig

Risiko des Verlusts von Feldern, Historie oder Workflows.

Natives Tooling
Verfügbar

Offizielle Linear Jira-Importer API

💡
Empfohlene Engineering-Strategie

Führen Sie einen Pilot-Sprint mit einem Team (5-8 Entwickler) durch, bevor Sie die gesamte Organisation am Wochenende umstellen.

Ausführungsprotokoll

Detaillierte Checkliste & Runbook

Befolgen Sie jede Phase strikt, um einen reibungslosen Ablauf zu gewährleisten.

Migrations-Runbook-Fortschritt0 / 5 Schritte abgeschlossen (0%)
0%

Audit & Cleanse Jira Projects

Ca. 2-4 hours

Archive resolved tickets older than 180 days and merge duplicate statuses into 4 core states (Todo, In Progress, In Review, Done).

⚠️
Achtung: Do not import 10 years of zombie Jira tickets; it pollutes Linear search index.

Authorize Linear Jira Importer

Ca. 15 minutes

Go to Linear Settings > Import/Export > Jira. Authenticate with an Atlassian admin API token.

jira-to-linear-migrator.py (Automated Ticket Cleaner & Importer)
#!/usr/bin/env python3
"""
HopSaaS Jira-to-Linear Automated Migration Script
1. Reads Jira Cloud export JSON (or Jira REST API).
2. Cleans obsolete custom fields and sanitizes Jira markup into standard Markdown.
3. Automatically posts mapped issues to Linear's official GraphQL API.
"""
import os
import json
import requests

LINEAR_API_KEY = os.getenv("LINEAR_API_KEY", "lin_api_...")
LINEAR_TEAM_ID = os.getenv("LINEAR_TEAM_ID", "team_uuid_here")
JIRA_EXPORT_FILE = "jira_export.json"

LINEAR_GRAPHQL_ENDPOINT = "https://api.linear.app/graphql"
HEADERS = {
    "Authorization": LINEAR_API_KEY,
    "Content-Type": "application/json"
}

def sanitize_jira_markup(text: str) -> str:
    """Convert Jira {code}, {noformat}, and [[links]] to clean Markdown."""
    if not text:
        return ""
    text = text.replace("{code:java}", "```java").replace("{code}", "```")
    text = text.replace("{noformat}", "```")
    return text.strip()

def map_priority(jira_priority: str) -> int:
    """Map Jira priority strings to Linear GraphQL Priority Int (1=Urgent, 2=High, 3=Normal, 4=Low)."""
    mapping = {"Highest": 1, "High": 2, "Medium": 3, "Low": 4, "Lowest": 4}
    return mapping.get(jira_priority, 3)

def import_tickets():
    if not os.path.exists(JIRA_EXPORT_FILE):
        print(f"[!] File {JIRA_EXPORT_FILE} not found. Please export your Jira issues via REST API first.")
        return

    with open(JIRA_EXPORT_FILE, "r", encoding="utf-8") as f:
        data = json.load(f)
        issues = data.get("issues", [])

    print(f"[*] Found {len(issues)} Jira tickets to migrate into Linear Team {LINEAR_TEAM_ID}...")

    mutation = """
    mutation CreateLinearIssue($input: IssueCreateInput!) {
        issueCreate(input: $input) {
            success
            issue {
                id
                identifier
                title
                url
            }
        }
    }
    """

    success_count = 0
    for issue in issues:
        fields = issue.get("fields", {})
        key = issue.get("key", "JIRA")
        raw_summary = fields.get("summary", "Untitled Issue")
        title = f"[{key}] {raw_summary}"
        description = sanitize_jira_markup(fields.get("description", ""))
        priority = map_priority(fields.get("priority", {}).get("name", "Medium"))

        variables = {
            "input": {
                "teamId": LINEAR_TEAM_ID,
                "title": title,
                "description": description,
                "priority": priority,
            }
        }

        res = requests.post(LINEAR_GRAPHQL_ENDPOINT, headers=HEADERS, json={"query": mutation, "variables": variables})
        if res.status_code == 200:
            result = res.json()
            if result.get("data", {}).get("issueCreate", {}).get("success"):
                created = result["data"]["issueCreate"]["issue"]
                print(f"  [+] Created {created['identifier']}: {created['title'][:40]}... -> {created['url']}")
                success_count += 1
            else:
                print(f"  [!] Linear API rejected issue {key}: {result.get('errors')}")
        else:
            print(f"  [!] HTTP {res.status_code} Error: {res.text}")

    print(f"\n[✓] Migration Complete: {success_count}/{len(issues)} issues migrated to Linear.")

if __name__ == "__main__":
    import_tickets()
⚡ Verified against 2026 Production REST & GraphQL APIsZero-downtime execution
⚠️
Achtung: Ensure your token has read access to all target team projects and user emails.

Map Statuses, Users, and Epics to Linear Projects

Ca. 1-2 hours

Execute mapping wizard. Assign Jira Epics to Linear Projects, Jira Components to Linear Labels, and invite teammates via SSO.

⚠️
Achtung: Unmatched user emails will fallback to a generic placeholder user.

Redirect GitHub / GitLab Integrations

Ca. 30 minutes

Disconnect Jira DVCS connector and install Linear GitHub App with automatic branch detection and auto-close magic keywords.

⚠️
Achtung: Update team PR templates from 'JIRA-1234' to 'ENG-1234'.

Set Jira to Read-Only & Celebrate

Ca. 15 minutes

Revoke write permissions in Jira to prevent split-brain ticket drift and declare Linear source of truth.

Ungefilterte Realität

Brutale Gotchas & Warum Teams zurückwechseln

Echte Schwachstellen aus r/devops, Hacker News und Incident-Berichten.

Keine Werbung
Versteckte Limits: Jira Software

⚠️ UI-Ladeverzögerung und ständige Kontextwechsel

r/devops & HN Post-Mortem Telemetry
"Jira Cloud benötigt in Spitzenzeiten 2 bis 3 Sekunden pro Ticket, was den Entwickler-Fokus ständig unterbricht."
Warum Teams zurückwechseln: Compliance- und Audit-Teams genehmigen ausschließlich Jira.
Engineering-Realität: Linears lokale In-Memory-Architektur garantiert weltweite Reaktionszeiten von unter 50 ms.
Versteckte Limits: Linear

⚠️ Eingeschränkte granulare Berechtigungen und benutzerdefinierte Felder

r/devops & HN Post-Mortem Telemetry
"Linear bietet keine tiefen Feldberechtigungen, was manche Sicherheitsprüfungen erschwert."
Warum Teams zurückwechseln: Wenn externe Dienstleister strikt von internen Tickets isoliert werden müssen.
Engineering-Realität: Nutzung von Linear-Gastkonten und separaten Teams für vertrauliche Projekte.
💎 Offizielles Enterprise-Migrationsprogramm

Planen Sie eine Umstellung mit über 100 Seats?

Prüfen Sie Ihren Anspruch auf bis zu 5.000 $ offizielle Migrationsgutschriften und fordern Sie ein vertrauliches Schema- & API-Audit an.

🛡️ Keine gesponserten Platzierungen • Zertifizierte Cloud-Architektur-Partner
🛡️ Audit-Bereit für Enterprise 2026

Benötigen Sie eine formelle Budgetgenehmigung?

Erstellen Sie ein 1-seitiges Management-PDF mit Preisberechnungen und Genehmigungsfeldern.