Comparar ahora
Guía de Migración Sin Interrupciones

Guía de migración: Jira Software a Linear

Manual práctico de ingeniería para transferir proyectos y datos sin pérdida de información.

Origen: Jira Software
→
Destino: Linear
•
Puntuación de Fricción: 34/100
Triaje de Migración en 3 Segundos

Ruta de Migración: Jira Software → Linear

Triaje de Migración Verificado
34 / 100
Baja Complejidad

Índice de Fricción

Tiempo Estimado de Transición
8-16 hrs

Horas de ingeniería estimadas para migración de datos, verificación y transición.

Riesgo de Pérdida de Datos
Bajo

Riesgo de perder campos personalizados, historial o flujos de trabajo.

Herramientas Nativas
Disponible

API oficial de importación de Jira de Linear

💡
Estrategia de Ingeniería Recomendada

Ejecute un sprint piloto con un equipo reducido (5-8 desarrolladores) antes de realizar la migración total durante el fin de semana.

Protocolo de Ejecución

Lista de Verificación Detallada y Guía

Siga cada fase estrictamente para garantizar la continuidad operativa.

Progreso del runbook de migración0 / 5 Pasos completados (0%)
0%

Audit & Cleanse Jira Projects

Est. 2-4 hours

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

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

Authorize Linear Jira Importer

Est. 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
⚠️
Atención: Ensure your token has read access to all target team projects and user emails.

Map Statuses, Users, and Epics to Linear Projects

Est. 1-2 hours

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

⚠️
Atención: Unmatched user emails will fallback to a generic placeholder user.

Redirect GitHub / GitLab Integrations

Est. 30 minutes

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

⚠️
Atención: Update team PR templates from 'JIRA-1234' to 'ENG-1234'.

Set Jira to Read-Only & Celebrate

Est. 15 minutes

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

Realidad Sin Filtro

Problemas Críticos y Por Qué Regresan

Limitaciones reales extraídas de r/devops, Hacker News e informes de incidentes.

Cero Publicidad
Límites Ocultos: Jira Software

⚠️ Latencia severa en la interfaz y pérdida de concentración

r/devops & HN Post-Mortem Telemetry
"Jira Cloud tarda de 2 a 3 segundos en abrir cada ticket, rompiendo el flujo de trabajo de los desarrolladores."
Por Qué los Equipos Regresan: Equipos de seguridad que solo autorizan Jira por cumplimiento normativo.
Realidad de Ingeniería: La arquitectura en memoria de Linear garantiza respuestas en menos de 50 ms en todo el mundo.
Límites Ocultos: Linear

⚠️ Permisos granulares y campos personalizados limitados

r/devops & HN Post-Mortem Telemetry
"Linear no permite permisos detallados por campo, lo que puede complicar auditorías estrictas."
Por Qué los Equipos Regresan: Empresas con múltiples proveedores externos que requieren estricto aislamiento de datos.
Realidad de Ingeniería: Uso de cuentas de invitado y equipos dedicados para aislar proyectos sensibles.
💎 Programa Oficial de Migración Empresarial

¿Planea una migración de más de 100 puestos?

Compruebe su idoneidad para obtener hasta $5,000 en créditos oficiales de migración y solicite una auditoría confidencial de esquemas y límites de API.

🛡️ Cero publicidad patrocinada • Socios certificados de arquitectura en la nube
🛡️ Listo para Auditoría Empresarial 2026

¿Necesita autorización presupuestaria formal?

Genere un resumen ejecutivo en PDF de 1 página con cálculos y bloques de aprobación.