Comparer Maintenant
Plan de Migration Sans Interruption

Comment Migrer de Jira Software vers Linear

Le guide pragmatique pour transférer projets, données historiques et équipes sans désynchronisation ni perte de données.

Source : Jira Software
→
Cible : Linear
•
Indice de Friction : 34/100
Triage de Migration en 3 Secondes

Chemin de Migration : Jira Software → Linear

Triage de Migration Vérifié
34 / 100
Faible Complexité

Indice de Friction

Temps Estimé de Bascule
8-16 hrs

Heures d’ingénierie estimées pour la migration, la vérification et la bascule.

Risque de Perte de Données
Faible

Niveau de risque de perte de champs personnalisés, commentaires d’historique ou déclencheurs.

Outils Natifs
Disponible

API officielle Linear d’import Jira

💡
Stratégie d’Ingénierie Recommandée

Lancez un sprint pilote avec une équipe produit réduite (5 à 8 ingénieurs) avant de basculer l’ensemble de l’organisation pendant un week-end.

Protocole de Runbook

Checklist d’Exécution & Scripts Détaillés

Suivez rigoureusement chaque phase pour garantir la continuité des opérations.

Progression du runbook de migration0 / 3 étapes terminées (0%)
0%

Audit du projet Jira et nettoyage des données

Est. 2-4 hrs

Archivez les tickets fermés depuis plus de 180 jours et regroupez les statuts redondants vers les 4 statuts clés.

⚠️
Piège: N’importez pas 10 ans de tickets inactifs sous peine de polluer l’index de recherche Linear.

Autorisation de l’API d’import Linear pour Jira

Est. 15 min

Dans Paramètres Linear > Import/Export > Jira, authentifiez-vous avec un jeton API administrateur Atlassian.

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
⚠️
Piège: Vérifiez que le jeton dispose des droits de lecture sur les emails des utilisateurs du projet.

Correspondance des statuts, utilisateurs et projets

Est. 1-2 hrs

Exécutez l’assistant de mapping pour associer les Epics Jira aux Projets Linear et inviter les équipes via SSO.

Vérité Terrain Sans Filtre

Pièges Cachés & Motifs de Retour en Arrière

Limites non documentées issues de r/devops, r/sysadmin, Hacker News et post-mortems d’incidents.

Zéro Biais Sponsorisé
Limitations Masquées : Jira Software

⚠️ Temps de chargement excessifs et perte de concentration

r/devops & HN Post-Mortem Telemetry
"Jira Cloud met 2 à 3 secondes pour ouvrir chaque ticket, brisant le flux de travail des développeurs."
Pourquoi les Équipes Font Marche Arrière : Obligation de conformité interne imposée par les équipes de sécurité.
Réalité d’Ingénierie : L’architecture locale en mémoire de Linear garantit des temps de réponse sous les 50 ms partout dans le monde.
Limitations Masquées : Linear

⚠️ Permissions granulaires et champs personnalisés limités

r/devops & HN Post-Mortem Telemetry
"Linear n’offre pas de permissions fines par champ, ce qui complique les audits très stricts."
Pourquoi les Équipes Font Marche Arrière : Nécessité d’isoler strictement des sous-traitants externes sur certains projets.
Réalité d’Ingénierie : Utilisation de comptes invités et séparation en équipes dédiées.
💎 Programme Officiel de Migration Entreprise

Bascule Grande Échelle (>100 Sièges) ?

Bénéficiez de jusqu’à 5 000 $ de crédits officiels de migration éditeur et demandez un audit confidentiel de schéma et de quotas API.

🛡️ Zéro Placement Sponsorisé • Partenaires d’Architecture Cloud Vérifiés
🛡️ Prêt pour Audit Entreprise 2026

Besoin d’une validation budgétaire formelle ?

Générez un résumé PDF exécutif d’une page avec calculs de ROI et zones de signature pour la direction.