

- Description
- Nef d’un atelier d’entretien ferroviaire, avec sa fosse et ses rails, ses étagères et ses rangements alignés.
- Source
- Samuel Zeller samuelzeller · page d’origine
- Licence
- CC0 Domaine public
Azure DevOps Server (ex-TFS) en profondeur
Vous saurez décrire l'organisation Serveur → collections → projets → équipes, et ce qui est partagé ou isolé à chaque niveau.
En bref
- Vous saurez décrire l'organisation Serveur → collections → projets → équipes, et ce qui est partagé ou isolé à chaque niveau.
- Vous saurez choisir et personnaliser un process template (Agile, Scrum, CMMI, Basic, processus hérité) sans vous piéger.
- Vous maîtriserez work items, états, liens, area/iteration paths, backlogs, boards, capacité, requêtes WIQL, tableaux de bord.
- Vous saurez brancher Power BI sur les work items (Analytics/OData), utiliser l'API REST, et planifier une migration.
- Fil rouge : un datamart SQL Server alimenté par une application SFA, rapports Power BI multilingues, versionné en TFVC, livré en kits d'installation. Pour le versionnement, voir TFVC en profondeur.
Contexte de notation : équipe de 5 à 15 personnes, projet data/BI on-premise ; les notes /5 sont des appréciations (voir NOTATION).
Sur cette page
- 🟢 Novice — Qu'est-ce que c'est, et quel nom porte-t-il aujourd'hui
- 🟢 Novice — Organisation : collection, projet, équipe
- 🟢 Novice — Process templates et types de work items
- 🟡 Pratique — Les liens entre work items
- 🟡 Pratique — Area paths et iteration paths
- 🟡 Pratique — Backlogs, boards, sprints, capacité
- 🟡 Pratique — Requêtes WIQL
- 🟡 Pratique — Tableaux de bord et widgets
- 🔴 Expert — Analytics, OData et Power BI sur work items
- 🔴 Expert — API REST, extensions et automatisation
- 🔴 Expert — Processus hérité et pièges de personnalisation
- 🔴 Expert — Test Plans et Pipelines, en deux mots utiles aux projets data
- 🔴 Expert — Calendrier et plan de migration
- 🔴 Expert — Bonnes pratiques de structuration
- Métriques — notation de l'outil
- 🤖 Contribution de l'IA
- Voir aussi
Niveau : 🟢→🔴
🟢 Novice — Qu'est-ce que c'est, et quel nom porte-t-il aujourd'hui#
Team Foundation Server (TFS) est l'ancien nom du serveur de collaboration de Microsoft (code, tickets, builds, tests). Il a été rebaptisé Visual Studio Team Services (VSTS) côté nuage, puis Azure DevOps Services, et Azure DevOps Server côté on-premise (à partir de la version 2019). Les noms existent en parallèle dans les têtes et les chemins : on dit encore « le TFS ».
Les fonctions sont regroupées en services :
| Service | Contenu | Équivalent « généraliste » |
|---|---|---|
| Boards | work items, backlogs, boards, sprints, requêtes | Jira |
| Repos | dépôts Git et TFVC | GitHub/GitLab (+ TFVC hérité) |
| Pipelines | build (CI) et release (CD), YAML ou designer classique | GitHub Actions, GitLab CI |
| Test Plans | plans de test manuel et exploratoire | Xray, Zephyr |
| Artifacts | flux de paquets (NuGet, npm, Maven, Python, universel) | Artifactory |
| Wiki | documentation Markdown versionnée | Confluence |
Symptôme : la documentation Microsoft « ne correspond pas » à ce qu'on voit. Cause : certaines pages décrivent Azure DevOps Services (nuage), d'autres le Server. Les fonctions arrivent d'abord dans Services. Remède : en haut de chaque page de docs, choisir le sélecteur de version « Azure DevOps Server » (ou la version précise) ; en cas de doute, vérifier dans l'interface.
🟢 Un cycle de vie moderne#
Selon les annonces Microsoft de fin 2025, Azure DevOps Server n'est plus millésimé : la dernière version (annoncée le 9 décembre 2025) est livrée sous la Modern Lifecycle Policy, sans numéro d'année ni date de fin de support fixe tant que l'on reste à jour des mises à jour et des prérequis système (état 2026-10, à revérifier sur la page de cycle de vie officielle avant toute décision de montée de version). Conséquence pratique : on ne choisit plus « 2022 vs 2025 », on s'engage à suivre les mises à jour, comme pour un service.
Le risque d'un TFS on-premise non entretenu n'est pas la panne, c'est l'obsolescence silencieuse : système d'exploitation, SQL Server, agents de build, protocole TLS. Inscrivez les mises à jour dans le planning de l'équipe, comme un sprint d'entretien annuel.
🟢 Novice — Organisation : collection, projet, équipe#
Serveur Azure DevOps Server
└─ Collection de projets (ex. DefaultCollection) ← 1 base SQL par collection
├─ Projet « MonProduit » (processus : Agile/Scrum/CMMI/Basic)
│ ├─ Équipe « Datamart » (backlog, sprints, capacité, board)
│ ├─ Équipe « Rapports »
│ └─ Équipe « Support »
└─ Projet « Outils internes »
- Le serveur héberge une ou plusieurs collections. Une collection = une unité d'administration, de sauvegarde et de montée de version = une base SQL (
Tfs_<Collection>). On peut détacher/attacher une collection (utile pour migrer, voir plus bas). - Le projet (anciennement « projet d'équipe ») regroupe work items, dépôts, pipelines, wiki. Il applique un process template. Les area paths et iteration paths y forment l'arbre d'organisation et de planning.
- L'équipe est une vue : elle choisit des area paths (ce qu'elle possède) et des iteration paths (ses sprints), a un backlog, un board, une capacité, des widgets de tableau de bord. Un projet peut avoir plusieurs équipes ; un utilisateur peut en rejoindre plusieurs.
Combien de projets créer ?#
Règle d'expert : moins de projets, plus d'équipes. Un projet = une frontière dure (droits, processus, requêtes inter-projets limitées). Un projet par application multiplie les administrations et rend le reporting transverse pénible. Créer un projet séparé seulement pour : une exigence de confidentialité, un processus incompatible, ou un cycle de vie indépendant.
| Choix | Avantages | Inconvénients |
|---|---|---|
| 1 projet, N équipes | requêtes transverses, un processus, un backlog parent partagé | droits plus fins à poser, arbres area/iteration à discipliner |
| N projets | isolation forte | pas de lien parent-enfant inter-projets natif simple (les liens existent, pas les backlogs agrégés), N configurations |
🟢 Novice — Process templates et types de work items#
Le process template décide des types de work items, de leurs états et champs.
| Processus | Hiérarchie typique | États d'un élément de contenu | Esprit |
|---|---|---|---|
| Agile | Epic → Feature → User Story → Task ; Bug, Issue | New → Active → Resolved → Closed (Removed) | équipes agiles « généralistes » |
| Scrum | Epic → Feature → Product Backlog Item → Task ; Bug, Impediment | New → Approved → Committed → Done (Removed) | vocabulaire Scrum fidèle |
| CMMI | Epic → Feature → Requirement → Task ; Bug, Change Request, Review, Risk, Issue | Proposed → Active → Resolved → Closed | processus formel, traçabilité d'exigences, audit |
| Basic | Epic → Issue → Task | To Do → Doing → Done | démarrage simple (disponible sur Services et sur Server récents ; à vérifier selon la version installée) |
Des types majeurs :
- Epic : grande initiative (plusieurs trimestres). Feature : capacité livrable (quelques sprints). Story / PBI / Requirement : valeur livrable en un sprint. Task : action technique (heures). Bug : défaut ; il peut être suivi comme une story ou comme une tâche selon la configuration du backlog de l'équipe (réglage « bugs » par équipe). Issue / Impediment : obstacle à lever. Test Case / Test Plan / Test Suite : types du service Test Plans.
🟢 États, raisons et règles#
Chaque type a ses états (champ System.State) et, pour chaque transition, des raisons (System.Reason). Des règles (champs obligatoires par état, valeurs automatiques, champs en lecture seule) accompagnent chaque transition. Exemple pour un Bug du processus Agile : passage à Resolved → champ « Resolved Reason » (Fixed, As Designed, Cannot Reproduce…) ; passage à Closed → vérification par le testeur.
Les états doivent refléter le flux réel et être peu nombreux (4 à 6). Chaque état supplémentaire est une colonne de plus à déplacer, un champ de statistiques à entretenir, une métrique de flux à interpréter.
🟡 Pratique — Les liens entre work items#
Les liens sont la vraie valeur de l'outil : ils transforment une liste en graphe traçable.
| Type de lien | Sens | Usage |
|---|---|---|
| Parent / Child | hiérarchie (strictement arborescente : un seul parent) | Epic → Feature → Story → Task ; agrège l'avancement |
| Related | association libre | dépendance faible, contexte |
| Predecessor / Successor | ordre | dépendance de planification (afficher dans les plans de livraison) |
| Duplicate / Duplicate Of | doublon | dédoublonnage |
| Tests / Tested By | cas de test ↔ story/bug | couverture de test |
| Affects / Affected By | impact | relevant de CMMI |
| Changeset / Commit / Pull Request / Build / Found in build / Integrated in build | lien vers le code et la CI | traçabilité ticket → code → livraison |
🟡 Le lien ticket ↔ changeset TFVC#
En TFVC, le check-in associe un ou plusieurs work items : dans Visual Studio (Team Explorer) en cochant l'élément dans « Related Work Items » ; en ligne de commande avec tf checkin /associate:12345,12346 (la syntaxe peut varier selon la version de tf.exe, à vérifier avec tf checkin /?). La politique d'archivage (check-in policy) « Work Items » peut rendre l'association obligatoire : à recommander pour tout dépôt qui produit des kits livrés.
# Archive en associant deux tâches et un commentaire, en environnement TFVC
tf checkin /comment:"Ajout du filtre secteur dans DIM_CLIENT" /associate:12345,12346 /noprompt
# Voir les work items associés à un changeset
tf changeset 45815
Un kit livré en 9.1.4 regroupe 38 changesets, associés à 12 stories. Une requête WIQL « stories liées à des changesets dont la date est dans la fenêtre de la livraison » produit automatiquement les notes de version : sans lien obligatoire, l'équipe reconstruit ces notes à la main à chaque livraison (quelques heures, avec erreurs).
Symptôme : un tableau de bord affiche « 0 changeset lié » alors que l'équipe archive tous les jours. Cause : association facultative, jamais posée. Remède : check-in policy obligatoire + rappel en revue de code ; rattrapage en lot possible depuis l'onglet « Links » du work item pour les changesets passés.
🟡 Pratique — Area paths et iteration paths#
Area paths : qui possède quoi#
Un arbre hiérarchique (MonProduit\Datamart\Dimensions, MonProduit\Rapports\Rapport Standard…). Il sert à : router des éléments vers l'équipe propriétaire, restreindre l'accès (droits par area path), filtrer des requêtes. Une équipe « possède » une ou plusieurs areas et, par option, leurs sous-areas.
Iteration paths : quand#
Arbre de planning (MonProduit\2026\Sprint 26-19). Chaque nœud porte une date de début et de fin. Une équipe sélectionne les itérations qu'elle utilise (sprints visibles dans son backlog). Les itérations sont partagées par le projet mais activées par équipe.
Conventions qui évitent les ennuis#
| Convention | Pourquoi |
|---|---|
Nommer les sprints avec un format trié (2026-S19 ou Sprint 2026.19) |
l'ordre alphabétique = l'ordre temporel |
| Une seule racine par thème (par année ou par release) | simplifier les requêtes UNDER |
| Ne jamais renommer ni supprimer un nœud utilisé sans le réaffecter | le nœud supprimé est remplacé par un nœud parent : la perte de précision est silencieuse |
| Itération « Backlog » (racine) pour les éléments non planifiés | évite le champ vide |
| Pas plus de 3 à 4 niveaux d'area | au-delà, la gouvernance se dilue |
Pour un projet qui livre par versions (8.0, 9.1…) et travaille par sprints, modélisez la version comme une area ou un champ (« Version cible »), pas comme une itération : les sprints restent temporels, la version est une propriété transversale du produit.
🟡 Pratique — Backlogs, boards, sprints, capacité#
Azure DevOps propose, par équipe, plusieurs niveaux de backlog configurables :
| Niveau | Contient | Vue |
|---|---|---|
| Portfolio (Epics) | initiatives | backlog + board |
| Features | capacités | backlog + board |
| Backlog produit (Stories/PBI/Requirements) | éléments de valeur | backlog, board Kanban |
| Sprint Backlog | éléments du sprint + tâches | Taskboard + capacité |
Les niveaux visibles sont réglés dans Paramètres d'équipe → Backlogs ; les bugs peuvent être traités comme des stories, comme des tâches ou ignorés dans le backlog.
Le Kanban board#
Colonnes = états, mais on peut découper une colonne en Doing / Done (« Split columns ») ; limites de WIP par colonne ; swimlanes (voies) pour les expédites ; règles de cartes (couleur selon un champ ou un tag) ; critères d'achèvement (checklist par colonne). Le board respecte l'ordre du backlog (Stack Rank).
Le taskboard, la capacité, le burndown#
Le sprint s'appuie sur trois écrans :
- Planification : glisser-déposer des éléments du backlog dans le sprint ; l'estimation totale (points/heures) apparaît.
- Capacité : par personne, jours hors poste, activité (Development/Testing/Design…) et capacité par jour (heures). Jours fériés de l'équipe renseignés une fois. Voyant de sur-engagement par personne et par activité.
- Taskboard : colonnes To Do / In Progress / Done pour les tâches ; mise à jour du Remaining Work (reste à faire) ; burndown du sprint calculé en heures restantes ou en tâches (selon réglage).
Symptôme : capacité vide ou fausse, voyants sans signification. Cause : activités non renseignées sur les tâches, ou jours fériés absents. Remède : rendre l'activité obligatoire dans le processus hérité ; paramétrer jours fériés au niveau de l'équipe ; calibrer les heures productives par jour à 4–6 h.
Les limites de l'outil en vélocité#
Le widget Velocity agrège les points par sprint mais n'historise pas les changements de périmètre en cours de sprint avec la finesse d'un outil dédié ; pour un burnup fiable, utiliser Analytics (voir plus bas) ou la fonction « tendance du sprint ». Voir métriques et reporting.
🟡 Pratique — Requêtes WIQL#
Les requêtes sauvegardées sont des filtres partageables (liste plate, arbre, ou liens directs). Elles reposent sur le langage WIQL (Work Item Query Language), proche de SQL en lecture seule : SELECT … FROM WorkItems | WorkItemLinks WHERE … ORDER BY ….
-- Tâches actives de l'équipe dans le sprint courant
SELECT [System.Id], [System.Title], [System.AssignedTo], [Microsoft.VSTS.Scheduling.RemainingWork]
FROM WorkItems
WHERE [System.TeamProject] = @project
AND [System.WorkItemType] = 'Task'
AND [System.State] <> 'Done'
AND [System.IterationPath] = @currentIteration
ORDER BY [System.AssignedTo], [System.Id]
-- Bugs anciens sans activité depuis 60 jours (santé du backlog)
SELECT [System.Id], [System.Title], [System.ChangedDate]
FROM WorkItems
WHERE [System.WorkItemType] = 'Bug'
AND [System.State] IN ('New','Active')
AND [System.ChangedDate] < @today - 60
ORDER BY [System.ChangedDate]
-- Stories sous une feature donnée, par liens hiérarchiques
SELECT [System.Id] FROM WorkItemLinks
WHERE [Source].[System.Id] = 1234
AND [System.Links.LinkType] = 'System.LinkTypes.Hierarchy-Forward'
AND [Target].[System.WorkItemType] <> ''
MODE (Recursive)
Macros utiles : @Me, @Project, @Today, @CurrentIteration, @TeamAreas, @StartOfWeek. Opérateurs : UNDER (pour les chemins), IN, CONTAINS, WAS EVER (historique d'un champ), EVER. WAS EVER est précieux pour les données de flux (« éléments qui ont été Bloqués »).
Symptôme : la requête « renvoie 20 000 éléments » puis plante ou tronque. Cause : limite de résultats par requête (de l'ordre de 20 000 dans l'interface ; à vérifier selon version) et coût de l'ORDER BY sur grosses collections. Remède : borner par area/itération/date ; pour l'analyse de masse, passer par Analytics/OData plutôt que par WIQL.
🟡 Pratique — Tableaux de bord et widgets#
Un tableau de bord d'équipe regroupe des widgets : Sprint Burndown, Velocity, Cumulative Flow, Cycle Time, Lead Time, Query Results, Chart for Work Items (camemberts, barres par état/assigné), Test Results, Build History, Markdown. Deux profondeurs :
- widgets de requête (un graphe sur une requête sauvegardée) : simples, instantanés, limités aux photos de l'état courant ;
- widgets Analytics (Velocity, Cycle Time, Lead Time, CFD, Burndown) : historiques, calculés sur la table des instantanés.
Un tableau de bord par audience : (1) équipe (sprint, WIP, blocages), (2) PO (vélocité, burnup de release, bugs ouverts), (3) direction (3 à 5 indicateurs de tendance). Un tableau de bord universel ne sert personne.
🔴 Expert — Analytics, OData et Power BI sur work items#
Analytics est le service de reporting de la plateforme : un modèle en lecture seule alimenté à partir des work items, avec historique (instantanés quotidiens et révisions). Intégré à Azure DevOps Services ; sur Azure DevOps Server il est installé et activé par collection (intégré à partir de la version 2020 ; sur 2019, extension à installer — à vérifier selon votre version). Il utilise l'index de recherche et un schéma dédié de la base de collection.
Les trois façons de consommer#
| Voie | Quand | Notes |
|---|---|---|
| Vues Analytics (paramétrées dans l'interface) | analyses simples depuis Power BI Desktop via le connecteur « Azure DevOps Server (Boards only) » (« Azure DevOps (Boards only) » pour Services) | rapide à mettre en place, pas de requêtage libre |
Flux OData (_odata/v4.0-preview/… ou version récente) |
tout le pouvoir : tables WorkItems, WorkItemSnapshot, WorkItemRevisions, Iterations, Areas, Users, Dates… |
URL côté serveur : https://<serveur>/<collection>/<projet>/_odata/<version>/WorkItems?… |
Modèle de requête agrégée $apply |
calculs côté serveur (agrégations) avant import | évite de rapatrier des millions de lignes |
Exemple OData : nombre de bugs actifs par itération (agrégation côté serveur).
https://<serveur>/<collection>/<projet>/_odata/v4.0-preview/WorkItems?
$apply=filter(WorkItemType eq 'Bug' and State ne 'Closed')/
groupby((Iteration/IterationPath), aggregate($count as Total))
Exemple M (Power Query) minimal pour un flux OData, authentification Windows :
let
Source = OData.Feed(
"https://<serveur>/<collection>/<projet>/_odata/v4.0-preview/WorkItemSnapshot?" &
"$filter=DateValue ge 2026-01-01Z and WorkItemType eq 'User Story'" &
"&$select=WorkItemId,Title,State,StoryPoints,DateValue,AreaSK,IterationSK" &
"&$expand=Iteration($select=IterationPath,StartDate,EndDate)",
null,
[Implementation = "2.0"]
)
in
Source
Modèle de données conseillé pour un rapport projet#
Tables : WorkItemSnapshot (grain = élément × jour : fait de flux), WorkItem (dimension courante), Iteration, Area, User, Date (calendrier). Relations en étoile ; mesures DAX de flux :
Éléments terminés =
CALCULATE ( DISTINCTCOUNT ( WorkItemSnapshot[WorkItemId] ),
WorkItemSnapshot[State] = "Done" )
Cycle time moyen (jours) =
AVERAGEX ( VALUES ( WorkItem[WorkItemId] ), CALCULATE ( MAX ( WorkItem[CycleTimeDays] ) ) )
WIP =
CALCULATE ( DISTINCTCOUNT ( WorkItemSnapshot[WorkItemId] ),
WorkItemSnapshot[State] IN { "Active", "Committed" } )
Les champs CycleTimeDays et LeadTimeDays sont fournis par Analytics. Pour les formules et l'interprétation, voir 10 — Métriques et reporting ; pour la conception du modèle Power BI, voir bonnes pratiques Power BI transverses.
Symptôme : un rapport Power BI sur les work items est lent et dépasse les quotas. Cause : import de WorkItemRevisions complet (des millions de lignes) sans filtre. Remède : filtrer par date et type, agréger côté serveur avec $apply, ne conserver que les colonnes utiles ; utiliser WorkItemSnapshot pour les tendances, WorkItemRevisions seulement pour l'audit.
Symptôme : l'actualisation planifiée échoue après passage à un serveur à jour. Cause : identité de la passerelle (gateway) sans droit de lecture Analytics, certificat changé, ou version OData retirée. Remède : compte de service dédié avec permission « View analytics », test via le navigateur sur l'URL OData, et documentation de la version du flux utilisée.
Quand préférer l'accès SQL direct#
Il est tentant de lire la base de collection (Tfs_<Collection>, vues tbl_WorkItem*) en SQL. C'est non supporté par Microsoft (schéma interne, modifié à chaque version). N'utiliser que l'entrepôt Analytics et les vues documentées, et jamais d'écriture.
🔴 Expert — API REST, extensions et automatisation#
API REST#
Racine : https://<serveur>/<collection>/<projet>/_apis/…?api-version=<n>. Les versions d'API sont liées à la version du serveur ; choisir la plus haute supportée par le serveur cible. Quelques points d'entrée :
| Besoin | Point d'entrée |
|---|---|
| Lire un work item | GET _apis/wit/workitems/{id}?$expand=relations |
| Requête WIQL | POST _apis/wit/wiql (corps { "query": "…" }) |
| Créer / modifier | POST/PATCH _apis/wit/workitems/${type} (JSON Patch, application/json-patch+json) |
| Changesets TFVC | GET _apis/tfvc/changesets/{id}/workItems |
| Itérations d'équipe | GET {équipe}/_apis/work/teamsettings/iterations |
| Capacité | GET {équipe}/_apis/work/teamsettings/iterations/{id}/capacities |
# Lecture d'un work item (auth intégrée Windows, serveur on-premise)
$uri = "https://tfs.exemple.local/tfs/DefaultCollection/MonProduit/_apis/wit/workitems/12345?`$expand=relations&api-version=7.0"
Invoke-RestMethod -Uri $uri -UseDefaultCredentials -Method Get
Symptôme : Invoke-RestMethod -Method Patch renvoie 415 ou une erreur obscure. Cause : l'en-tête Content-Type doit être application/json-patch+json et PowerShell 5.1 se débat parfois avec les corps JSON Patch. Remède : spécifier -ContentType 'application/json-patch+json' et sérialiser le corps avec ConvertTo-Json -Depth 5 ; en dernier recours, utiliser System.Net.Http.HttpClient. (La réalité du terrain sur 5.1 est capricieuse.)
Quelques réflexes : ne jamais écrire directement en base ; utiliser l'API ou l'outil officiel ; limiter le débit (limites de taux sur Services ; sur Server la limite est celle de l'infrastructure) ; paginer avec $top et continuationToken.
Extensions#
Les extensions ajoutent widgets, onglets, actions de menu, tâches de pipeline, contributions de work item. Elles s'installent par collection (version Server) ou par organisation (Services). Écrire une extension demande : un manifeste vss-extension.json, du JavaScript/TypeScript ou une page web, un packaging tfx extension create. Pour un besoin simple, préférer l'API REST depuis un script planifié (alerte, synchronisation) à une extension.
Règles, crochets et notifications#
- Règles de processus (sans code) : champs obligatoires, valeurs conditionnelles.
- Service hooks : déclencher un webhook/Teams/Slack sur création ou changement d'état.
- Notifications par abonnement : à rationaliser, l'excès de courrier tue le signal.
🔴 Expert — Processus hérité et pièges de personnalisation#
Sur Azure DevOps Server récent on trouve deux modèles de personnalisation :
| Modèle | Principe | Usage |
|---|---|---|
| Processus hérité (inherited) | on hérite d'Agile/Scrum/CMMI/Basic et on ajoute champs, états, règles, pages ; interface web | recommandé : supporté, migrations simples |
| XML (on-premises XML) | on exporte le template en XML, on le modifie, on le réimporte avec witadmin |
puissance maximale, réservé au besoin avancé (champs calculés complexes, transitions fines) ; non disponible sur Services |
# Exporter le type « Bug » du projet (XML)
witadmin exportwitd /collection:https://tfs.exemple.local/tfs/DefaultCollection /p:MonProduit /n:Bug /f:Bug.xml
# Réimporter après modification
witadmin importwitd /collection:https://tfs.exemple.local/tfs/DefaultCollection /p:MonProduit /f:Bug.xml
Pièges de personnalisation#
La prolifération de champs. Symptôme : formulaires de 40 champs, personne ne remplit rien. Cause : chaque demande d'une partie prenante a produit un champ. Remède : un comité de gouvernance du modèle (2 à 3 personnes), règle « un champ doit nourrir une décision ou un rapport », revue annuelle et suppression des champs jamais renseignés.
Changer un état après coup. Symptôme : rapports historiques faux, burndown cassé. Cause : renommer ou fusionner des états alors que des milliers d'éléments sont dans l'ancien état. Remède : ajouter le nouvel état, migrer les éléments par script (API) puis retirer l'ancien ; recalculer Analytics ; prévenir les consommateurs de rapports.
Divergence entre projets. Symptôme : trois projets, trois variantes de « Bug » ; les tableaux de bord transverses ne marchent plus. Cause : copies de processus modifiées indépendamment. Remède : un processus parent partagé par plusieurs projets (processus hérité) ; changements en un seul endroit.
Champs à valeurs libres. Symptôme : « Version cible » contient 9.1, 9.1.0, V9.1. Cause : champ texte. Remède : liste de valeurs (picklist) ou champ identifiant, alimentée par script à chaque nouvelle version.
Avant de modifier un processus, clonez-le en environnement de test (collection de test, ou projet temporaire), appliquez la modification, rejouez 10 scénarios réels, puis appliquez en production à un moment calme. Une personnalisation XML ratée est lente à défaire.
🔴 Expert — Test Plans et Pipelines, en deux mots utiles aux projets data#
Test Plans#
Un plan contient des suites (statiques, par requête, par exigence) de cas de test (étapes, résultats attendus, paramètres). L'exécution produit des runs avec captures, journaux, bugs liés. Pour un projet BI, les cas de test paramétrés servent à la recette de chiffres : « pour le client X et le mois M, le total des ventes du rapport = valeur de référence ± tolérance ». Le résultat de chaque exécution est tracé (qui, quand, quelle version du kit). Voir recette et validation métier.
40 cas de test paramétrés (4 mesures × 10 clients) exécutés avant chaque kit. Chaque écart > 0,5 % crée un bug lié au cas de test, au work item de la story et à la version du kit. Le tableau de bord « taux de cas réussis par kit » alimente la décision de livraison.
Pipelines#
Pipelines YAML (versionnés avec le code, recommandés) ou classiques (designer, héritage). Pour les projets data : étapes de compilation du projet de base (SSDT/sqlpackage), construction du kit d'installation, exécution de scripts de test, publication d'artefacts, déploiement vers un environnement de recette. Voir CI/CD et CI/CD pour la data.
Symptôme : une étape de pré-génération (scripts de documentation) disparaît du dépôt, le build casse (« A path to a .ps1 file is required »). Cause : des fichiers générés mais lus par le pipeline ont été exclus du contrôle de source. Remède : si le pipeline ne rejoue pas la génération, les fichiers qu'il lit doivent être versionnés ; vérifier ce que lit chaque étape avant d'ignorer un fichier.
🔴 Expert — Calendrier et plan de migration#
Trois chemins, selon la contrainte :
| Chemin | Quand | Effort | Risques |
|---|---|---|---|
| Mise à niveau sur place / nouveau serveur (restauration de la collection puis montée de version) | rester on-premise | faible à moyen | prérequis SQL Server/OS, agents de build, extensions incompatibles |
| Vers Azure DevOps Services (outil de migration de données, import de base) | abandon de l'infrastructure | moyen à élevé | fenêtres de gel, identités (Entra ID), extensions, différences de fonctions |
| Vers un autre outil (Jira, GitHub/GitLab…) | stratégie d'entreprise | élevé | perte d'historique des liens, TFVC → Git à planifier à part |
Plan type de montée de version on-premise (à adapter)#
| Semaine | Action |
|---|---|
| S−6 | Inventaire : version serveur, SQL, OS, extensions, agents, processus XML personnalisés |
| S−5 | Lire les notes de version et les prérequis de la cible ; vérifier la compatibilité des agents et des extensions |
| S−4 | Sauvegarde complète (bases + clé de chiffrement) ; restauration sur serveur de test |
| S−3 | Montée de version sur le serveur de test ; rejeu des pipelines, requêtes et widgets critiques |
| S−2 | Communication aux équipes ; fenêtre de gel (heures creuses) |
| S0 | Montée de version de production ; vérification : droits, builds, requêtes, rapports Power BI/Analytics |
| S+1 | Revue post-opération, mise à jour des agents, rétrospective |
Toujours tester la restauration de la sauvegarde. Une sauvegarde jamais restaurée n'est qu'une hypothèse. Sauvegarder aussi la clé de chiffrement des bases, sans laquelle les données chiffrées de la collection ne se relisent pas.
Le TFVC (hérité) n'est plus la voie recommandée par Microsoft pour les nouveaux projets : le dépôt Git est la cible stratégique. Conserver TFVC est possible (la fonction reste présente dans Azure DevOps Server, état 2026-10), mais planifier la migration TFVC → Git comme un chantier à part (historique à conserver ou à abandonner, branches à convertir, outillage de build à adapter). Voir Git vs TFVC et stratégies de branches.
🔴 Expert — Bonnes pratiques de structuration#
- Une hiérarchie courte : Epic → Feature → Story → Task. Au-delà, personne ne s'y retrouve.
- Définitions de prêt et de fini écrites dans le wiki du projet, liées au backlog.
- Un champ, une décision : pas de champ sans consommateur.
- Des équipes par flux de valeur, pas par couche technique (éviter « l'équipe base » et « l'équipe rapport » qui se passent des tickets).
- Nommage uniforme des titres : verbe d'action + objet (« Calculer le linéaire par secteur »).
- Lier systématiquement tâches ↔ changesets, bugs ↔ stories, stories ↔ features ; vérifier par requête (« stories sans parent », « bugs sans lien code »).
- Hygiène de backlog : revue trimestrielle ; tout élément sans mouvement depuis 6 mois est soit fermé, soit raffiné (voir métriques — santé du backlog).
- Documenter le modèle : une page wiki « Comment on utilise l'outil » (types, états, champs, liens, conventions), relue à l'arrivée de chaque nouveau.
- Séparer incidents de données et bugs logiciels : types dédiés, SLA propres.
- Mesurer le flux (lead time, cycle time) plutôt que de compter les heures saisies.
Métriques — notation de l'outil#
| Critère | Note | Justification (équipe 5–15, data/BI on-prem) |
|---|---|---|
| Flexibilité du modèle | 4/5 | processus hérité et XML couvrent presque tout ; limites sur les hiérarchies à plus de trois niveaux custom |
| Reporting | 4/5 | Analytics + OData + Power BI solides ; widgets natifs plus limités que des outils dédiés |
| Intégration code/CI | 5/5 | natif TFVC/Git, builds, tests, releases : traçabilité ticket → changeset |
| Coût | 4/5 | souvent couvert par les abonnements Visual Studio ; admin on-prem à prévoir |
| Adoption | 3/5 | ergonomie datée, moins connu des métiers |
| Gouvernance | 4/5 | permissions fines par area/itération, audit |
| Passage à l'échelle | 4/5 | collections multiples ; vue portefeuille correcte mais pas SAFe natif |
| Personnalisation du processus | 4/5 | héritage maîtrisé ; XML puissant mais risqué |
| Extensibilité / API | 4/5 | REST complète, extensions, hooks ; marketplace plus mince que Jira |
Voir la comparaison dans 12 — Comparatif.
🤖 Contribution de l'IA#
| Cas d'usage | Gain /5 | Risque /5 | Maturité /5 | Prérequis | Garde-fous |
|---|---|---|---|---|---|
| Rédiger des critères d'acceptation depuis une story | 4 | 3 | 4 | story claire, contexte métier | relecture PO ; ne pas inventer de règles métier |
| Générer des requêtes WIQL/OData depuis le français | 3 | 2 | 3 | schéma de champs connu | exécuter sur échantillon, vérifier les comptes |
| Résumer un historique de work item | 4 | 2 | 4 | commentaires exploitables | résumé non contractuel |
| Envoyer un work item à un agent de codage (Copilot) | 3 | 4 | 2 | dépôts GitHub connectés ; fonction d'Azure Boards (Services), disponibilité générale annoncée en décembre 2025 après un aperçu en 2025 ; à vérifier pour une installation on-premise | revue de code humaine obligatoire, pas de données sensibles |
| Détecter des doublons | 3 | 2 | 3 | historique propre | confirmation humaine |
Prompt utile : « Voici une story et les règles du domaine. Propose 5 critères d'acceptation chiffrés et testables. Indique les hypothèses que tu fais ». Détails dans 11 — IA et outils.
Voir aussi#
- Panorama des outils · Jira et alternatives · Métriques et reporting · Comparatif
- TFVC en profondeur · Git en profondeur · GDS et données SQL/BI
- Scrum en pratique · Planification et estimation (matrice) · Glossaire
✻ Rédigé par Claude Sonnet 5.5