Module M1 — Administration (Jour 1 — 7h)¶
Public : gestionnaire(s) de l’instance
Objectif : installer, configurer et administrer une instance Redmine 5.1.12 prête à l’emploi
Exercice 1 - Installation Docker Desktop + Redmine¶
Solution to Exercise 1 #
Vérifier que les deux conteneurs sont en cours d’exécution :
docker psRésultat attendu :
CONTAINER ID IMAGE STATUS PORTS
xxxxxxxxxxxx redmine:5.1.12 Up X minutes 0.0.0.0:3000->3000/tcp
xxxxxxxxxxxx postgres:15 Up X minutesEn cas d’erreur, consulter les logs :
docker compose logs redmine
docker compose logs dbErreurs fréquentes :
Port 3000 déjà utilisé → modifier
"3000:3000"en"3001:3000"dans ledocker-compose.ymlWSL2 non activé → Panneau de configuration → Activer les fonctionnalités Windows → Sous-système Windows pour Linux
Exercice 2 - Paramétrage général de l’instance¶
Solution to Exercise 2 #
Onglet Général
| Champ | Valeur |
|---|---|
| Titre de l’application | Redmine - Dupont (exemple) |
| Formatage du texte | CommonMark Markdown (GitHub Flavored) |
| Nom d’hôte et chemin | localhost:3000 |
| Protocole | HTTP |
Onglet Affichage
| Champ | Valeur |
|---|---|
| Langue par défaut | Français |
| Forcer la langue pour les utilisateurs identifiés | coché |
| Format de date | Basé sur la langue de l’utilisateur |
| Format d’heure | Basé sur la langue de l’utilisateur |
| Format des temps en heures | 0:45 h |
Onglet Authentification
| Champ | Valeur |
|---|---|
| Authentification obligatoire | Non, autoriser l’accès anonyme aux projets publics |
| Inscription des nouveaux utilisateurs | activation manuelle du compte |
| Longueur minimum des mots de passe | 8 |
| Double authentification | optionnel |
Onglet API
| Champ | Valeur |
|---|---|
| Activer l’API REST | coché |
| Activer le support JSONP | non coché |
Vérification fonctionnelle : une fois la clé API générée (Mon compte → Clé d’accès API → Réinitialiser), tester depuis PowerShell :
curl -H "X-Redmine-API-Key: VOTRE_CLE_API" http://localhost:3000/projects.jsonRésultats attendus :
{"projects":[...]}→ API active et clé valide{"errors":["Accès non autorisé"]}→ API active, clé incorrectePage HTML (formulaire de login) → API non activée
Onglet Projets
| Champ | Valeur |
|---|---|
| Définir les nouveaux projets comme publics par défaut | décoché |
| Modules activés par défaut | Suivi des demandes, Suivi du temps passé, Wiki, Publication de documents, Publication de fichiers |
| Trackers par défaut | à configurer après l’exercice 4 |
| Rôle donné à un utilisateur non-administrateur qui crée un projet | Chef de projet |
Onglet Utilisateurs
Laisser les valeurs par défaut :
Option de notification par défaut : Seulement pour ce que je surveille
Fuseau horaire : aucun (basé sur le navigateur)
Onglet Suivi des demandes
| Champ | Valeur |
|---|---|
| Autoriser les relations entre demandes de différents projets | coché |
| Fermer les doublons automatiquement | coché |
| Jours non travaillés | samedi, dimanche |
| Attributs des tâches parentes | Calculé à partir des sous-tâches (début, échéance, priorité, % réalisé) |
Onglet Suivi du temps
| Champ | Valeur |
|---|---|
| Champs obligatoires pour les temps passés | Demande cochée |
| Maximum d’heures par jour | 999 (laisser par défaut) |
Onglet Fichiers
Laisser les valeurs par défaut (5120 ko max par fichier, 102400 ko en upload groupé).
Cliquer Sauvegarder après chaque onglet — recharger la page pour vérifier le titre et la langue.
Exercice 3 - Définition des statuts et workflow¶
Solution to Exercise 3 #
Statuts : Administration → Statuts des demandes
Redmine 5.1 pré-installe “Nouvelle demande” et “Nouveau”. Contrôler la liste existante, puis créer les statuts manquants :
En cours
En attente client
Commentaire
Résolu
Fermé (cocher Statut fermé)
Rejeté (cocher Statut fermé)
Workflow : Administration → Workflow → sélectionner Tracker = Anomalie, Rôle = Développeur → Modifier
Matrice à reproduire :
| Nouveau | En cours | En attente client | Résolu | Commentaire | Fermé | Rejeté | |
|---|---|---|---|---|---|---|---|
| Nouvelle demande | |||||||
| Nouveau | — | ✅ | ✅ | ✅ | ✅ | ||
| En cours | — | ✅ | ✅ | ✅ | ✅ | ||
| En attente client | ✅ | — | ✅ | ✅ | |||
| Résolu | ✅ | — | ✅ | ✅ | |||
| Commentaire | ✅ | ✅ | ✅ | — | ✅ | ||
| Fermé | — | ||||||
| Rejeté | — |
Le statut “Rejeté” n’est accessible à aucun rôle depuis la vue Développeur — seul le Chef de projet pourra l’utiliser (configuré en exercice 8).
Sauvegarder, puis vérifier en se connectant avec dev.martin et en changeant le statut d’une demande.
Exercice 4 - Création des trackers¶
Durée : 15 min
Menu : Administration → Trackers
Créer les 4 trackers dans cet ordre :
| # | Nom | Champs à activer |
|---|---|---|
| 1 | Anomalie | Assigné à, Version cible, Temps estimé |
| 2 | Évolution | Assigné à, Version cible, Temps estimé |
| 3 | Demande de service | Assigné à, Version cible, Temps estimé |
| 4 | Tâche interne | Assigné à, Version cible, Temps estimé |
Critère de réussite : 4 trackers visibles et ordonnés dans la liste
Solution to Exercise 4 #
Menu : Administration → Trackers → Nouveau tracker

Figure 1:Liste des tracker définis

Figure 2:Detail d’un tracker
L’ordre d’affichage se règle avec les flèches haut/bas dans la liste des trackers après création.
Le champ “Statut par défaut” est obligatoire — sélectionner “Nouveau” (créé à l’exercice 3) pour tous les trackers.
Étape complémentaire — retour dans Administration → Configuration → onglet Projets
Maintenant que les trackers existent, définir les trackers activés par défaut pour les nouveaux projets :
Cocher : Anomalie
Cocher : Évolution
Laisser décochés : Demande de service, Tâche interne
Sauvegarder.
Exercice 5 - Création des rôles et permissions¶
Durée : 20 min
Menu : Administration → Rôles et permissions
Chef de projet
| Champ | Valeur |
|---|---|
| Demandes assignables | coché |
| Visibilité des demandes | Toutes les demandes non privées |
| Visibilité du temps passé | Tous les temps passés |
| Visibilité des utilisateurs | Tous les utilisateurs actifs |
Permissions à cocher :
Projet : Gérer les membres, Gérer les versions, Sauvegarder les requêtes
Suivi des demandes : Voir, Créer, Ajouter des notes, Gérer les catégories de demandes
Suivi du temps passé : Voir le temps passé, Saisir le temps passé
Wiki : Voir, Modifier les pages, Voir l’historique, Supprimer les pages
Développeur
| Champ | Valeur |
|---|---|
| Demandes assignables | coché |
| Visibilité des demandes | Toutes les demandes non privées |
| Visibilité du temps passé | Tous les temps passés |
| Visibilité des utilisateurs | Tous les utilisateurs actifs |
Permissions à cocher :
Projet : Gérer les versions, Sauvegarder les requêtes
Suivi des demandes : Voir, Créer, Modifier les demandes, Gérer les relations, Gérer les sous-tâches, Ajouter des notes, Voir les notes privées, Rendre les notes privées, Gérer les catégories de demandes
Suivi du temps passé : Voir le temps passé, Saisir le temps passé
Dépôt de sources : Voir les révisions, Parcourir les sources, Droit de commit, Gérer les demandes associées
Wiki : Voir, Modifier les pages, Voir l’historique, Supprimer les pages
Fichiers : Voir les fichiers, Gérer les fichiers
Client
| Champ | Valeur |
|---|---|
| Demandes assignables | décoché |
| Visibilité des demandes | Demandes créées par cet utilisateur |
| Visibilité du temps passé | Aucun |
| Visibilité des utilisateurs | Membres du projet |
Permissions à cocher :
Suivi des demandes : Voir, Créer, Ajouter des notes uniquement
Wiki : Voir uniquement
Restriction par tracker — section en bas du formulaire, pour les 3 rôles :
| Rôle | Tracker | Voir | Créer | Modifier | Ajouter des notes |
|---|---|---|---|---|---|
| Chef de projet | Tous les trackers | ✅ | ✅ | ✅ | ✅ |
| Développeur | Tous les trackers | ✅ | ✅ | ✅ | ✅ |
| Client | Tous les trackers | ✅ | ✅ | ☐ | ✅ |
Laisser les lignes Anomalie, Évolution, Assistance décochées — elles héritent automatiquement de la ligne “Tous les trackers”.
Critère de réussite : 3 rôles distincts avec permissions différenciées
Solution to Exercise 5 #
Menu : Administration → Rôles et permissions → Nouveau rôle
Chef de projet
Configuration générale :
Demandes assignables : coché
Visibilité des demandes : Toutes les demandes non privées
Visibilité du temps passé : Tous les temps passés
Visibilité des utilisateurs : Tous les utilisateurs actifs
Permissions — décocher tout, puis cocher uniquement :
| Section | Permissions |
|---|---|
| Projet | Gérer les membres, Gérer les versions, Sauvegarder les requêtes |
| Suivi des demandes | Voir, Créer, Ajouter des notes, Gérer les catégories de demandes |
| Suivi du temps passé | Voir le temps passé, Saisir le temps passé |
| Wiki | Voir le wiki, Modifier les pages, Voir l’historique des modifications, Supprimer les pages |
| Forums | Voir les messages, Poster un message |
| Documents | Voir les documents |
| Fichiers | Voir les fichiers |
| Gantt | Voir le gantt |
| Calendrier | Voir le calendrier |
Développeur
Configuration générale :
Demandes assignables : coché
Visibilité des demandes : Toutes les demandes non privées
Visibilité du temps passé : Tous les temps passés
Visibilité des utilisateurs : Tous les utilisateurs actifs
Permissions — décocher tout, puis cocher uniquement :
| Section | Permissions |
|---|---|
| Projet | Gérer les versions, Sauvegarder les requêtes |
| Suivi des demandes | Voir, Créer, Modifier les demandes, Gérer les relations, Gérer les sous-tâches, Ajouter des notes, Voir les notes privées, Rendre les notes privées, Gérer les catégories de demandes |
| Suivi du temps passé | Voir le temps passé, Saisir le temps passé |
| Dépôt de sources | Voir les révisions, Parcourir les sources, Droit de commit, Gérer les demandes associées |
| Wiki | Voir le wiki, Modifier les pages, Voir l’historique des modifications, Supprimer les pages |
| Fichiers | Voir les fichiers, Gérer les fichiers |
| Forums | Voir les messages, Poster un message, Modifier ses propres messages |
| Documents | Voir les documents |
| Gantt | Voir le gantt |
| Calendrier | Voir le calendrier |
Client
Configuration générale :
Demandes assignables : décoché
Visibilité des demandes : Demandes créées par cet utilisateur
Visibilité du temps passé : Aucun
Visibilité des utilisateurs : Membres du projet
Permissions — décocher tout, puis cocher uniquement :
| Section | Permissions |
|---|---|
| Suivi des demandes | Voir, Créer, Ajouter des notes |
| Wiki | Voir le wiki |
| Documents | Voir les documents |
| Fichiers | Voir les fichiers |
Utiliser le lien Tout décocher en bas du formulaire avant de cocher les permissions souhaitées — évite les cases cochées par défaut non souhaitées.
Restriction par tracker — section “Suivi des demandes” en bas du formulaire
Cette section apparaît après les permissions générales. Elle affine les droits par tracker. Conserver la ligne Tous les trackers pour les 3 rôles — ne pas cocher les lignes individuelles (Anomalie, Évolution, Assistance) qui héritent automatiquement.
Chef de projet :
| Tracker | Voir | Créer | Modifier | Ajouter des notes |
|---|---|---|---|---|
| Tous les trackers | ✅ | ✅ | ✅ | ✅ |
Développeur :
| Tracker | Voir | Créer | Modifier | Ajouter des notes |
|---|---|---|---|---|
| Tous les trackers | ✅ | ✅ | ✅ | ✅ |
Client :
| Tracker | Voir | Créer | Modifier | Ajouter des notes |
|---|---|---|---|---|
| Tous les trackers | ✅ | ✅ | ☐ | ✅ |
La seule différence entre les rôles dans cette table : Client ne peut pas modifier les demandes existantes, uniquement les créer et ajouter des notes.
Exercice 6 - Création des comptes utilisateurs¶
Durée : 10 min
Menu : Administration → Utilisateurs
| Login | Rôle | Option |
|---|---|---|
cda.dupont | Chef de projet | Doit changer son mot de passe |
dev.martin | Développeur | Doit changer son mot de passe |
client.durand | Client | Doit changer son mot de passe |
Critère de réussite : 3 comptes actifs dans la liste utilisateurs
Solution to Exercise 6 #
Menu : Administration → Utilisateurs → Nouveau utilisateur
Pour chaque compte :
Renseigner Login, Prénom, Nom, Email (fictif)
Définir un mot de passe temporaire (ex :
Formation2026!)Cocher Doit changer son mot de passe à la prochaine connexion
Statut : Actif
Sauvegarder
Le rôle n’est pas attribué ici — il le sera lors de l’affectation au projet en M2 (exercice 13).
Vérifier dans Administration → Utilisateurs que les 3 comptes apparaissent avec le statut “Actif”.
Exercice 7 - Configuration des activités de suivi des temps¶
Durée : 10 min
Menu : Administration → Listes de valeurs → Activités (suivi du temps)
Créer les 5 activités suivantes :
Développement
Recette / Tests
Réunion
Documentation
Support / Assistance
Critère de réussite : activités disponibles à la saisie de temps
Solution to Exercise 7 #
Menu : Administration → Listes de valeurs → Activités (suivi du temps) → Nouvelle valeur
Pour chaque activité : saisir le nom, laisser “Actif” coché, laisser “Valeur par défaut” décoché.

Figure 3:Création d’une activité
Définir “Développement” comme activité par défaut : cocher Valeur par défaut uniquement sur cette entrée.
Vérifier en allant sur un projet → Suivi du temps → Nouvelle entrée : la liste déroulante “Activité” doit afficher les 5 entrées.
Exercices avancés¶
Exercice 8 - Workflow multi-rôles et multi-trackers¶
Durée : 45 min
Menu : Administration → Workflow
L’exercice 3 n’a configuré le workflow que pour le tracker Anomalie et le rôle Développeur. L’objectif est ici d’étendre la matrice à l’ensemble des trackers et des rôles, en raisonnant sur les droits métier de chaque acteur.
Matrice à compléter — transitions par Tracker / Rôle (statuts réels) :
| Tracker | Rôle | Depuis | Vers |
|---|---|---|---|
| Évolution | Chef de projet | Nouveau | En cours, En attente client, Rejeté |
| Évolution | Chef de projet | En cours | En attente client, Résolu, Fermé |
| Évolution | Chef de projet | En attente client | En cours, Résolu, Fermé, Rejeté |
| Évolution | Chef de projet | Résolu | Fermé, Rejeté |
| Évolution | Développeur | Nouveau | En cours |
| Évolution | Développeur | En cours | En attente client, Résolu |
| Évolution | Développeur | En attente client | En cours |
| Évolution | Client | Résolu | Fermé |
| Demande de service | Chef de projet | Toutes transitions | (idem Évolution / Chef de projet) |
| Demande de service | Développeur | Nouveau | En cours |
| Demande de service | Développeur | En cours | En attente client, Résolu |
| Demande de service | Client | Résolu | Fermé |
| Tâche interne | Chef de projet | Toutes transitions | (idem Évolution / Chef de projet) |
| Tâche interne | Développeur | Nouveau | En cours |
| Tâche interne | Développeur | En cours | Résolu |
| Tâche interne | Client | — | Aucune transition |
Contraintes à respecter :
Client : jamais accès à “Rejeté” ni possibilité de réouvrir un ticket fermé
Seul Chef de projet peut passer en “Rejeté” sur tous les trackers
Tâche interne / Client : matrice vide (lecture seule)
Vérification : se connecter avec chaque compte et contrôler que les transitions disponibles correspondent exactement à la matrice.
Critère de réussite : aucune transition non autorisée accessible depuis l’interface, quel que soit le compte connecté
Solution to Exercise 8 #
Répéter l’opération pour chaque combinaison Tracker / Rôle : Administration → Workflow → sélectionner le tracker et le rôle → Modifier
Évolution / Client — une seule case à cocher :
| Fermé | |
|---|---|
| Résolu | ✅ |
Demande de service / Client — même matrice qu’Évolution / Client :
| Fermé | |
|---|---|
| Résolu | ✅ |
Tâche interne / Client — aucune case cochée (matrice vide).
Astuce : utiliser le bouton Copier du workflow pour dupliquer la configuration d’un rôle vers un autre et n’ajuster que les différences. Par exemple, copier Anomalie / Chef de projet vers Évolution / Chef de projet, puis Demande de service / Chef de projet, puis Tâche interne / Chef de projet.
Vérification rapide sans changer de session : Administration → Workflow → sélectionner le tracker et le rôle → Consulter (mode lecture seule).
Exercice 9 - API REST : interrogation et manipulation via curl¶
Durée : 45 min
Installation de curl sur Windows
curl est inclus nativement dans Windows 10/11. Vérifier depuis PowerShell :
curl --versionSi absent (versions antérieures), télécharger depuis curl.se/windows et ajouter le dossier bin\ au PATH système.
Obtention de la clé API
Se connecter à Redmine avec le compte
adminMenu : Mon compte (en haut à droite) → onglet Clé d’accès API
Cliquer sur Réinitialiser pour générer la clé
Copier la clé — elle sera utilisée dans toutes les requêtes via l’en-tête
X-Redmine-API-Key
La clé API est équivalente à un mot de passe. Ne pas la versionner ni la transmettre en clair.
Activer l’accès API
Menu : Administration → Configuration → onglet API
Cocher Activer l’API REST
Sauvegarder
Exemple complet — cycle de vie d’une demande par API
Remplacer VOTRE_CLE_API par la clé obtenue ci-dessus.
Les exemples ci-dessous utilisent la syntaxe PowerShell (Windows). Sous macOS / Linux (zsh/bash), remplacer le backtick ` de continuation par \ et utiliser des guillemets simples '...' pour le corps JSON.
0. Créer le projet fil rouge via API
curl -X POST -H "X-Redmine-API-Key: VOTRE_CLE_API"
-H “Content-Type: application/json” -d "{\"project\": {\"name\": \"Formation Redmine\", \"identifier\": \"mon-projet\", \"description\": \"Projet fil rouge de formation\", \"is_public\": false}}"
http://
curl -X POST
-H “X-Redmine-API-Key: VOTRE_CLE_API”
-H “Content-Type: application/json”
-d ‘{“project”: {“name”: “Formation Redmine”, “identifier”: “mon-projet”, “description”: “Projet fil rouge de formation”, “is_public”: false}}’
http://
Réponse attendue : code HTTP 201 Created avec le détail du projet créé, dont son id.
Si le projet mon-projet existe déjà (créé manuellement), Redmine retourne 422 Unprocessable Entity avec le message Identifiant a déjà été pris. Passer directement à l’étape 1.
1. Lister les projets disponibles
curl -H "X-Redmine-API-Key: VOTRE_CLE_API" `
-H "Content-Type: application/json" `
http://localhost:3000/projects.json2. Créer une demande dans le projet mon-projet
curl -X POST `
-H "X-Redmine-API-Key: VOTRE_CLE_API" `
-H "Content-Type: application/json" `
-d "{\"issue\": {\"project_id\": \"mon-projet\", \"tracker_id\": 1, \"subject\": \"Anomalie creee via API\", \"priority_id\": 2}}" `
http://localhost:3000/issues.jsonNoter l’id de la demande créée dans la réponse JSON (ex : "id": 42).
3. Consulter la demande créée
curl -H "X-Redmine-API-Key: VOTRE_CLE_API" `
http://localhost:3000/issues/42.json4. Modifier le statut (passage en “En cours” — status_id: 2)
curl -X PUT `
-H "X-Redmine-API-Key: VOTRE_CLE_API" `
-H "Content-Type: application/json" `
-d "{\"issue\": {\"status_id\": 2, \"notes\": \"Prise en charge via API\"}}" `
http://localhost:3000/issues/42.json5. Lister les demandes ouvertes du projet
curl -H "X-Redmine-API-Key: VOTRE_CLE_API" `
"http://localhost:3000/issues.json?project_id=mon-projet&status_id=open"6. Créer un utilisateur
curl -X POST `
-H "X-Redmine-API-Key: VOTRE_CLE_API" `
-H "Content-Type: application/json" `
-d "{\"user\": {\"login\": \"dev.duval\", \"firstname\": \"Sophie\", \"lastname\": \"Duval\", \"mail\": \"s.duval@example.com\", \"password\": \"Redmine2026!\"}}" `
http://localhost:3000/users.jsonCorrespondance status_id / priority_id
Les status_id dépendent de l’ordre de création des statuts dans votre instance. Vérifier les valeurs réelles avant tout appel PUT :
curl -H "X-Redmine-API-Key: VOTRE_CLE_API" http://localhost:3000/issue_statuses.jsonOrdre probable avec la configuration EX-03 :
| status_id | Statut |
|---|---|
| 1 | Nouvelle demande |
| 2 | Nouveau |
| 3 | En cours |
| 4 | En attente client |
| 5 | Commentaire |
| 6 | Résolu |
| 7 | Fermé |
| 8 | Rejeté |
| priority_id | Priorité |
|---|---|
| 1 | Basse |
| 2 | Normale |
| 3 | Haute |
| 4 | Urgente |
Critère de réussite : demande créée, statut modifié et visible dans l’interface web, utilisateur dev.duval actif dans Administration → Utilisateurs
Solution to Exercise 9 #
Réponse attendue à l’étape 2 (création de demande) :
{
"issue": {
"id": 42,
"project": {"id": 1, "name": "Formation Redmine"},
"tracker": {"id": 1, "name": "Anomalie"},
"status": {"id": 1, "name": "Nouveau"},
"priority": {"id": 2, "name": "Normale"},
"subject": "Anomalie creee via API"
}
}Réponse attendue à l’étape 4 : code HTTP 200 OK — corps vide. Vérifier dans l’interface que le statut est bien “En cours” et que la note apparaît dans l’historique.
Erreurs fréquentes :
401 Unauthorized→ clé API incorrecte ou API REST non activée422 Unprocessable Entity→ champ obligatoire manquant (vérifiertracker_id,subject)404 Not Found→project_idouissue idincorrect
Récupérer les tracker_id de votre instance :
curl -H "X-Redmine-API-Key: VOTRE_CLE_API" `
http://localhost:3000/trackers.jsonExercice 10 - Import CSV d’utilisateurs en masse¶
Durée : 20 min
Menu : Administration → Utilisateurs → Import
Préparer le fichier CSV
Créer un fichier utilisateurs-import.csv :
login,firstname,lastname,mail,password
dev.bernard,Marc,Bernard,m.bernard@example.com,Redmine2026!
dev.chevalier,Lucie,Chevalier,l.chevalier@example.com,Redmine2026!
dev.fontaine,Paul,Fontaine,p.fontaine@example.com,Redmine2026!
cda.garcia,Ana,Garcia,a.garcia@example.com,Redmine2026!
cda.henry,Jean,Henry,j.henry@example.com,Redmine2026!
client.imbert,Claire,Imbert,c.imbert@example.com,Redmine2026!
client.joubert,Luc,Joubert,l.joubert@example.com,Redmine2026!
client.klein,Emma,Klein,e.klein@example.com,Redmine2026!
dev.lambert,Pierre,Lambert,p.lambert@example.com,Redmine2026!
cda.moreau,Julie,Moreau,j.moreau@example.com,Redmine2026!Procédure d’import
Menu : Administration → Utilisateurs → bouton Import
Sélectionner le fichier
utilisateurs-import.csvParamètres : séparateur
,— encodageUTF-8Mapper les colonnes aux champs Redmine
Lancer l’import — noter le rapport (succès / erreurs)
Erreurs à provoquer volontairement
Dupliquer la ligne
dev.bernard→ observer l’erreur login existantSupprimer le champ
maild’une ligne → observer la validationCorriger le CSV et ré-importer
Critère de réussite : 10 comptes importés sans erreur, convention de nommage {role}.{nom} respectée
Solution to Exercise 10 #
Correspondance colonnes CSV → champs Redmine :
| Colonne CSV | Champ Redmine |
|---|---|
| login | Identifiant |
| firstname | Prénom |
| lastname | Nom |
| password | Mot de passe |
Rapport d’import attendu : 10 utilisateurs importés, 0 erreur
Erreur login dupliqué : Redmine affiche Identifiant déjà pris sur la ligne en doublon — les autres lignes sont importées normalement.
Erreur mail manquant : Redmine affiche Email n'est pas valide — la ligne est ignorée.
Après correction du CSV, ré-importer uniquement la ligne corrigée pour éviter les doublons.
Vérifier via Administration → Utilisateurs : filtrer par date de création pour isoler les comptes importés.
Exercice 11 - Champs personnalisés (Custom Fields)¶
Durée : 25 min
Menu : Administration → Champs personnalisés
Créer les 3 champs suivants :
| Champ | Type | Trackers | Valeurs / Options |
|---|---|---|---|
| Environnement | Liste | Anomalie, Demande de service | Développement, Recette, Pré-production, Production |
| Référence client | Texte | Anomalie, Évolution, Demande de service | Longueur max : 20 caractères |
| Criticité métier | Booléen | Anomalie | Coché = impact métier confirmé |
Configuration détaillée
Environnement
Requis : oui
Valeur par défaut : Développement
Visible par : tous les rôles
Référence client
Requis : non
Expression régulière de validation :
^[A-Z]{2}-[0-9]{4,6}$(format attendu :TK-001234)Visible par : Chef de projet, Client uniquement
Criticité métier
Requis : non
Visible par : tous les rôles
Utilisé comme filtre : oui
Vérification
Créer une demande de type Anomalie → vérifier la présence des 3 champs
Créer une demande de type Tâche interne → vérifier l’absence des champs non applicables
Saisir
ABCdans Référence client → observer le message d’erreur de validationFiltrer la liste des demandes par
Criticité métier = oui
Critère de réussite : 3 champs actifs, validation regex fonctionnelle, filtre opérationnel sur Criticité métier
Solution to Exercise 11 #
Menu : Administration → Champs personnalisés → Nouveau champ → sélectionner “Demandes”
Environnement
Format : Liste
Valeurs possibles : saisir chaque valeur sur une ligne séparée
Cocher les trackers : Anomalie, Demande de service
Requis : oui — Valeur par défaut : Développement
Référence client
Format : Texte
Longueur max : 20
Expression régulière :
^[A-Z]{2}-[0-9]{4,6}$Cocher les trackers : Anomalie, Évolution, Demande de service
Visibilité : restreindre aux rôles Chef de projet et Client
Criticité métier
Format : Booléen
Cocher le tracker : Anomalie uniquement
Cocher Utilisé comme filtre
Message d’erreur attendu pour ABC dans Référence client :
Référence client n'est pas valide
Utilisation du filtre : dans la liste des demandes → Ajouter un filtre → Criticité métier → Oui
Exercice 12 - Export Redmine vers Excel via n8n¶
Durée : 30 min
Prérequis : EX-09 terminé, API REST active, clé API disponible
Ajout de n8n dans le docker-compose
Ajouter le service suivant dans docker-compose.yml, en montant le dossier de travail de l’hôte :
n8n:
image: n8nio/n8n
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=admin
volumes:
- n8n_data:/home/node/.n8n
- C:\redmine-formation:/data
volumes:
n8n_data:Sous macOS/Linux, remplacer C:\redmine-formation par le chemin absolu du dossier, ex : /Users/thierry/redmine-formation.
Créer manuellement le fichier C:\redmine-formation\redmine-export.xlsx avec deux feuilles vides nommées Projets et Trackers avant de lancer le workflow.
Relancer l’environnement :
docker compose up -dn8n accessible sur http://localhost:5678 (login : admin / admin).
Workflow à construire
Créer un workflow avec les 5 nœuds suivants dans l’ordre :
| # | Nœud | Type | Rôle |
|---|---|---|---|
| 1 | Déclencheur | Manual Trigger | Exécution à la demande |
| 2 | GET Projets | HTTP Request | GET /projects.json |
| 3 | GET Trackers | HTTP Request | GET /trackers.json |
| 4 | Construire tableau | Code | Fusionner et formater les deux listes |
| 5 | Lire fichier | Read/Write Files from Disk | Lire /data/redmine-export.xlsx |
| 6 | Mettre à jour Excel | Spreadsheet File | Écraser les feuilles Projets et Trackers |
| 7 | Écrire fichier | Read/Write Files from Disk | Réécrire /data/redmine-export.xlsx |
Configuration des nœuds HTTP Request (nœuds 2 et 3)
Méthode : GET
URL :
http://redmine:3000/projects.json(ouhttp://localhost:3000/...selon la configuration réseau Docker)En-tête :
X-Redmine-API-Key=VOTRE_CLE_API
Colonnes attendues dans le fichier Excel
| Feuille | Colonnes |
|---|---|
| Projets | id, identifier, name, description, created_on |
| Trackers | id, name |
Critère de réussite : clic sur Execute → le fichier C:\redmine-formation\redmine-export.xlsx est mis à jour sur le disque, les feuilles Projets et Trackers reflètent l’état courant de l’instance Redmine
Solution to Exercise 12 #
Nœud 2 — GET Projets
Type : HTTP Request
URL :
http://redmine:3000/projects.jsonAuthentication : Header Auth
Header name :
X-Redmine-API-KeyHeader value : clé API admin
Réponse : JSON →
$.projectscontient le tableau
Nœud 3 — GET Trackers
Identique, URL :
http://redmine:3000/trackers.jsonRéponse : JSON →
$.trackers
Nœud 4 — Code (JavaScript)
const projects = $('GET Projets').all().map(i => i.json.projects).flat();
const trackers = $('GET Trackers').all().map(i => i.json.trackers).flat();
const projectRows = projects.map(p => ({
id: p.id,
identifier: p.identifier,
name: p.name,
description: p.description || '',
created_on: p.created_on
}));
const trackerRows = trackers.map(t => ({
id: t.id,
name: t.name
}));
return [{ json: { projects: projectRows, trackers: trackerRows } }];Nœud 5 — Lire fichier (Read/Write Files from Disk)
Opération : Read File(s) From Disk
Chemin :
/data/redmine-export.xlsxLe fichier est transmis en binaire au nœud suivant
Nœud 6 — Mettre à jour Excel (Spreadsheet File)
Opération : Update
File format : XLSX
Sheet name :
Projets(premier passage), puis dupliquer le nœud pourTrackersInput data : relier la sortie du nœud Code
Nœud 7 — Écrire fichier (Read/Write Files from Disk)
Opération : Write File to Disk
Chemin :
/data/redmine-export.xlsxLe fichier écrasé est immédiatement visible sur le disque hôte dans
C:\redmine-formation\
URL de téléchargement : après exécution, vérifier directement le fichier sur le disque hôte — inutile de télécharger depuis n8n.
Livrable M1 — Vérification croisée¶
Durée : 20 min
Chaque stagiaire joue le rôle d’un auditeur et vérifie l’instance d’un autre à l’aide de la check-list :
Workflow Anomalie / Développeur fonctionnel
Workflow étendu aux 3 rôles et 4 trackers (exercice 8)
4 trackers présents et bien nommés
3 rôles avec permissions distinctes
3 comptes actifs + 10 comptes importés via CSV (exercice 10)
5 activités de temps configurées
3 champs personnalisés actifs (exercice 11)
Workflow n8n export Redmine → Excel fonctionnel (exercice 12)
Résultat attendu : check-list complète à vert — instance prête pour M2 et M3
⚠️ Exercice 1 non compressible — prévoir 45 min de buffer si WSL2 nécessite un redémarrage Windows ou une mise à jour du kernel Linux.