Démarrer un build Azure par l’API

logo azure

Saviez-vous qu’il est possible de démarrer un build Azure par l’API? Ce n’est pas quelque chose qu’on a besoin à tous les jours, mais de savoir que ça existe, et qu’on a beaucoup de possibilités avec les APIs d’Azure, peut nous faciliter la vie le moment venu.

Mise en contexte

Histoire de donner un exemple concret pour en voir l’utilité, voici ce que j’ai eu à faire récemment. À partir d’une application web .NET Core, je devais pouvoir construire une image Docker, selon certains paramètres. Comme l’application est hébergée sur Azure, je ne pouvais pas simplement installer Docker sur mon serveur et déclancher un processus pour le faire. Je me suis donc tourné vers Azure pour y préparer un pipeline de build. Une fois le build prêt, je devais pouvoir le démarrer à la demande.

Prérequis

Pour être en mesure de déclancher un build, nous avons besoin d’un Personal Access Tokens au niveau d’Azure. Lors de la création de celui-ci, il est important d’avoir la permission Read & Execute de sélectionnée, comme on voit ici:

Client Http

Pour la création du client http, l’important est de lui ajouter le personal access token dans les headers pour l’autorisation et de spécifier le accept header pour application/json. Voici la méthode qui s’occupait de construire mon client (à noter que le token est ici en constante, mais il devrait normalement provenir des appsettings):

private static HttpClient BuildClient()
{
    const string personalaccesstoken = "<INSERT PERSONAL ACCESS TOKEN HERE>";

    var client = new HttpClient();
    client.DefaultRequestHeaders.Accept.Add(
        new MediaTypeWithQualityHeaderValue("application/json"));

    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
        Convert.ToBase64String(Encoding.ASCII.GetBytes($":{personalaccesstoken}")));

    return client;
}

Déclancher le build

Par la suite, tout ce qu’il nous reste à faire est d’appeler l’API pour déclancher le build. Ici, nous avons besoin de 3 paramètres, qui encore une fois devraient nous provenir des appsettings. Il s’agit du nom de l’organisation, du projet ainsi que du ID de définition du build, qu’on peut retrouver dans l’URL lorsqu’on consulte notre build.

URL d'un build avec indication de l'organisation, du projet et du ID

Une fois que nous avons ces informations, il suffit d’appeler l’URL avec un POST avec les informations nécessaires. Dans mon exemple, j’avais besoin d’envoyer un paramètre au build, d’où l’inclusion du dictionnaire pour les TemplateParameters:

private static async Task StartBuild()
{
    const string organizationName = "<your organization>";
    const string projectName = "<your project>";
    const int buildDefinitionId = 6;

    var client = BuildClient();

    await client.PostAsJsonAsync($"https://dev.azure.com/{organizationName}/{projectName}/_apis/build/builds?api-version=6.0", new PipelineBody
    {
        Definition = new DefinitionReference
        {
            Id = buildDefinitionId
        },
        TemplateParameters = new Dictionary<string, string>
        {
            { "testParam", "test.json"}
        }
    });
}

Les classes PipelineBody et DefinitionReference sont des classes que j’ai créé explicitement pour ces appels et ne contiennent que les propriétés que vous voyez dans la méthode.

Conclusion

J’espère que ce petit truc vous sera utile si jamais vous avez besoin de passer par les APIs pour démarrer un build Azure. À noter aussi qu’il existe plusieurs autres APIs qui peuvent être utilisés dans un contexte similaire. Voici le lien sur la documentation de l’API de Build, mais n’hésitez pas à consulter les différents APIs disponible dans le menu de gauche sur cette page.

Bruno

Auteur : Bruno

De jour, je suis développeur, chef d'équipe et le co-animateur du Bracket Show. De soir, je suis un mari et le père de deux magnifiques enfants. Le temps qu'il me reste après tout cela, je le passe à tenter de bouger, à jouer et écrire des critiques de jeux vidéos, ainsi qu'à préparer du matériel pour les enregistrements du Bracket Show et pour ce blog. Au travers tout cela, je suis aussi passionné de musique et de microbrasseries.