Monthly Archives: October 2019

Azure DevOps REST API : Identifier les features actives d’un projet

Azure DevOps propose de nombreuses fonctionnalités qui peuvent être activées ou désactivées selon les besoins au niveau de chaque projet créés au sein de votre organisation.

L’API REST mise à disposition par Microsoft permet de récupérer bon nombre des informations stockées dans les projets hébergés sur Azure DevOps. Malheureusement, selon cette documentation officielle, il n’existe pas de possibilités pour identifier les fonctionnalités activées et/ou désactivées au niveau d’un projet.

Mais un manque de documentation ne signifie pas que cela n’est pas possible, d’autant plus que le site web permet de le faire. Une petite analyse des appels réseaux (merci Charles ou Fiddler) entre le site web et l’API REST permet de voir qu’en réalité une API existe.

Pour interroger celle-ci, il suffit d’effectuer une requête avec les paramètres ci-dessous, en remplaçant {OrganizationName} et {ProjectId} par les valeurs adéquates, sans oublier de passer les en-têtes d’authentification selon le mode de sécurité que vous utilisez :

POST https://dev.azure.com/{OrganizationName}/_apis/featuremanagement/featurestatesquery?api-version=5.1-preview
{
  "featureIds": ["ms.vss-work.agile", "ms.vss-code.version-control", "ms.vss-build.pipelines", "ms.feed.feed", "ms.vss-test-web.test"],
  "scopeValues": {
    "project": "{ProjectId}"
  }
}

En soumettant cette requête, vous obtenez pour le projet souhaité, le statut de chacune des fonctionnalités pouvant être activées/désactivées pour un projet. Ci-dessous un exemple de la réponse renvoyée par l’API REST :

{
  "featureIds": [
    "ms.vss-work.agile",
    "ms.vss-code.version-control",
    "ms.vss-build.pipelines",
    "ms.feed.feed",
    "ms.vss-test-web.test"
  ],
  "featureStates": {
    "ms.vss-work.agile": {
      "featureId": "ms.vss-work.agile",
      "scope": {
        "userScoped": false,
        "settingScope": "project"
      },
      "state": "disabled"
    },
    "ms.vss-code.version-control": {
      "featureId": "ms.vss-code.version-control",
      "scope": null,
      "state": "enabled"
    },
    "ms.vss-build.pipelines": {
      "featureId": "ms.vss-build.pipelines",
      "scope": null,
      "state": "enabled"
    },
    "ms.feed.feed": {
      "featureId": "ms.feed.feed",
      "scope": {
        "userScoped": false,
        "settingScope": "project"
      },
      "state": "disabled"
    },
    "ms.vss-test-web.test": {
      "featureId": "ms.vss-test-web.test",
      "scope": null,
      "state": "disabled",
      "reason": "\"Test Plans\" is off because the \"Boards\" feature is off. In order to manage \"Test Plans\", you must turn on \"Boards\".",
      "overridden": true
    }
  },
  "scopeValues": {
    "project": "12345678-1234-1234-1234-1234567890ab"
  }
}

En espérant que cette API vous sera utile même si elle n’apparait pas sur la documentation officielle disponible sur le site de Microsoft.

Azure DevOps REST API : Renvoyer les enums sous forme de nombres

Comme dans quasiment toutes les API REST existantes, celle d’Azure DevOps utilise de nombreuses énumérations pour certaines propriétés renvoyées.

Prenons l’exemple de la réponse renvoyée lors de la récupération de la liste des projets d’une organisation :

{
  "count": 1,
  "value": [
    {
      "id": "12345678-1234-1234-1234-123456789123",
      "name": "Project Name",
      "url": "https://dev.azure.com/OrganizationName/_apis/projects/12345678-1234-1234-1234-123456789123",
      "state": "wellFormed",
      "revision": 1,
      "visibility": "private",
      "lastUpdateTime": "2019-10-01T12:00:00.000Z"
    }
  ]
}

On constate que l’objet renvoyé contient 2 propriétés nommées state et visibility qui sont en réalité des énumérations qui peuvent contenir les valeurs de type String suivantes :

Même si cela est très clair au demeurant, tous les langages de développement ne sont pas nécessairement capables de gérer les énumérations sous la forme de valeurs de type String (ex: C# où les énumérations doivent être numériques).

Si vous êtes dans ce cas et que malgré tout vous souhaitez utiliser des énumérations dans votre code, il existe la possibilité de personnaliser le fonctionnement de l’API REST en modifiant les en-têtes HTTP envoyés lors des appels à l’API.

Cela se passe en modifiant la valeur de l’en-tête Accept sous la forme ci-dessous :

Accept: application/json;enumsAsNumbers=true

En passant cette valeur d’en-tête lors de vos appels, ceux-ci renverront désormais les valeurs d’enumérations sous forme de nombres. Exemple avec notre requête précédente :

{
  "count": 1,
  "value": [
    {
      "id": "12345678-1234-1234-1234-123456789123",
      "name": "Project Name",
      "url": "https://dev.azure.com/OrganizationName/_apis/projects/12345678-1234-1234-1234-123456789123",
      "state": 1,
      "revision": 1,
      "visibility": 0,
      "lastUpdateTime": "2019-10-01T12:00:00.000Z"
    }
  ]
}

En espérant que cela pourra vous être utile si vous êtes dans le cas de figure d’un langage ne supportant pas les énumérations de type String.