2
votes

Cloner la définition de build VSTS en C #

J'utilise .GetDefinitionAsync et .CreateDefinitionAsync de BuildHttpClient pour cloner une définition de build VSTS. Cela fonctionne bien, mais j'aimerais créer les définitions de construction dans un dossier différent, autre que le dossier racine du projet. Je peux ajouter un dossier via le lien Web "Gérer les dossiers", mais comment puis-je le faire par programme?

J'ai essayé ce qui suit:

private static async Task CloneBuildDefAsync(int buildDefId, string newBuildDefName, string buildNumFormat, string sourceControlPath, string URLpath)
{
    var buildClient = createClient();
    var buildDef = (await buildClient.GetDefinitionAsync(project, buildDefId)) as BuildDefinition;

    buildDef.Project = null;

    var json = JsonConvert.SerializeObject(buildDef);
    json = json.Replace(sourceControlMainline, sourceControlPath);
    buildDef = JsonConvert.DeserializeObject<BuildDefinition>(json);

    buildDef.BuildNumberFormat = buildNumFormat;
    buildDef.Name = newBuildDefName;
    buildDef.Path = URLpath;

    await buildClient.CreateDefinitionAsync(buildDef, project);
}

Où la collection est disponible est le chemin: CollectionReleaseURL = @ " http: //my.tfs.server8080/tfs/DefaultCollection/ Project / Product / Release ";

mais quand j'exécute le programme, il met simplement la nouvelle build def dans le dossier suivant: @ " http: //my.tfs.server8080/tfs/DefaultCollection/Project "

Comment puis-je cloner la définition de construction dans le dossier ../Product/Release?

MISE À JOUR: J'utilise ce qui suit pour cloner la définition de construction mais c'est PAS copier les étapes de construction! Quelqu'un sait pourquoi?

    buildDef = JsonConvert.DeserializeObject<BuildDefinition>(json);
    buildDef.BuildNumberFormat = buildNumFormat;
    buildDef.Name = newBuildDefName;

    Uri tfsURI = new Uri(CollectionReleaseURL);
    buildDef.Url = tfsURI.ToString();
    await buildClient.CreateDefinitionAsync(buildDef, project);

Semble tout copier sauf l'étape de construction, tout le reste est cloné et mis à jour parfaitement: entrez la description de l'image ici


0 commentaires

3 Réponses :


4
votes

Vous souhaitez définir Propriété de chemin vers le dossier souhaité.

Un exemple de clone dans PowerShell:

$uri = 'https://dev.azure.com/{organization}/{project}/_apis/build/definitions/{definitionId}'

$result = Invoke-RestMethod -Method Get -Uri $uri -UseDefaultCredentials
$result.path = '\NewFolder\Location'
$result.name = "Testing"

$body = $result | ConvertTo-Json -Depth 7

Invoke-RestMethod -Method POST -uri 'https://dev.azure.com/{organization}/{project}/_apis/build/definitions?api-version=4.0' -UseDefaultCredentials -Body $body -ContentType 'application/json'

Crée une structure de dossier de construction comme celle-ci: p>

 entrez la description de l'image ici


1 commentaires

Merci Matt - J'ai fini par utiliser votre solution. J'utilise ceci pour automatiser la création d'une branche dans le contrôle de code source et cloner les définitions de build Mainlines vers la branche, je vais également créer une définition de build "Create Release" qui appellera ce script PowerShell. Fonctionne comme un charme. Maintenant, je vais créer un script PowerShell pour créer la branche de contrôle de source puisque je l'ai également écrit en c #.



4
votes

Si vous utilisez Microsoft.TeamFoundationServer.Client, vous pouvez simplement définir le chemin:

BuildDefinition cpBuild = BuildClient.GetDefinitionAsync(teamProjectName, 8).Result;

BuildDefinition build = new BuildDefinition();
build.Path = "New Build Folder";
build.Name = "new Build";
build.BuildNumberFormat = cpBuild.BuildNumberFormat;
build.Repository = cpBuild.Repository;
build.Process = cpBuild.Process;
var newBuild = BuildClient.CreateDefinitionAsync(build, teamProjectName).Result;


5 commentaires

Quand j'essaye ceci, que j'avais essayé avant d'obtenir ce qui suit: 'BuildDefinition' ne contient pas de définition pour 'Path' et aucune extension pour 'Path' ...


J'utilise la dernière version de Microsoft.TeamFoundationServer.Client 15.131 .1


Génial, merci Shamrai. Une fois que j'ai mis à niveau le .Client de 14.89.0 à 15.131.1, j'ai pu définir le chemin ... merci.


J'ai mis à jour ma question - savez-vous pourquoi les étapes de compilation ne sont pas copiées?


Votre exemple fonctionne très bien pour moi (sauf que je n'utilise pas json replace). Mais je ne trouve pas la section build dans mon json, je vois la section Process. Microsoft.TeamFoundation.Build.WebApi.BuildDefinition ne contient pas non plus le membre de génération.



1
votes

Voici ce que j'ai utilisé pour accomplir cela en utilisant:

https: //gist.github. com / HockeyJustin / c1cb4e543806c16cab6e2c2322f5d830

$thisBuildDef.Name = $Clone_Name
$thisBuildDef.path = $BuildDefURL  # Relative to the Project name; like "Release/2019"
$thisBuildDef.buildNumberFormat = $BuildNumberFormat

# Update source control path to new branch
$defAsJson = $thisBuildDef | ConvertTo-Json -Depth 100
$defAsJson = $defAsJson.Replace($sourceControlMainline, $sourceControlBranch)

$Uri = "$(TFSCollection)/$(TFSProject)/_apis/build/definitions?api-version=2.0"

$newBuildDef = Invoke-RestMethod -Uri $Uri -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method Post -Body $defAsJson -ContentType "application/json" -ErrorAction Stop


0 commentaires