Добавить / обновить BuildDefinition.Repository.Properties.tfvcMapping с помощью BuildHttpClient - TFS 2017 U3

Этот вопрос очень похож на этот пост: Обновление сопоставлений источников, но я пытаюсь использовать BuildHttpClient вместо прямого вызова RestAPI.

Конечная цель - создать копию определения сборки / выпуска и использовать ее для другого приложения.

Объект «dr», который я просматриваю, представляет собой datarow, который содержит данные, которые я хотел бы использовать для обновления определения сборки. Вот код ClientConnection:

VssConnection connection = new VssConnection(serverUrl, new VssCredentials());
BuildHttpClient bdClient = connection.GetClient<BuildHttpClient>();

// using Wait on the task
Task<BuildDefinition> templateTask = bdClient.GetDefinitionAsync(teamProjectName, IDtoClone);
templateTask.Wait();
BuildDefinition updatedDefinition = ReplaceBuildParameters(templateTask.Result, dr);
Task<BuildDefinition> updatedTask =  bdClient.CreateDefinitionAsync(updatedDefinition, teamProjectName);
updatedTask.Wait();
return updatedTask.Result;

Обновить

Основываясь на обратной связи Энди ниже, я обновил код. Вместо того, чтобы пытаться обновить объект свойства, я его заменяю. Я думаю, что у меня это работает, у меня осталось несколько тестов для проверки. Я пытаюсь использовать JObject, чтобы получить значение и обновить его после модификации.

   private static BuildDefinition ReplaceBuildParameters(BuildDefinition resultDef, DataRow dr)
    {
        resultDef.Name = "myCreateBuildAttempt";
        resultDef.Path = "\Templates\POCSandbox";
            foreach (DataColumn column in dr.Table.Columns)
            {
                switch (column.ColumnName)
                {
                    case "ServerPath":

                    JObject tfvcObj = new JObject();
                    foreach (KeyValuePair<string, string> prop in resultDef.Repository.Properties)
                    {
                        if (prop.Key == "tfvcMapping")
                        {
                            KeyValuePair<string, string> myPath = new KeyValuePair<string, string>("serverPath", "$/MASTER/PRES");
                            tfvcObj = JObject.Parse(prop.Value);
                            var mappings = tfvcObj["mappings"];
                            JToken myToken = JToken.Parse(mappings[0].ToString());
                            myToken["serverPath"] = "$/MASTER/PRES";
                            mappings[0] = myToken;
                            //obj["mappings"]
                            tfvcObj["mappings"] = mappings;
                        }
                    }
                    resultDef.Repository.Properties["tfvcMapping"] = tfvcObj.ToString(Newtonsoft.Json.Formatting.None);

                    break; 

                    default:
                    break;
                }
            }
        return resultDef;
    }

c#,tfs,tfsbuild,tfs2017,vsts-release,

0

Ответов: 1


0

Ну, вы также можете использовать REST API api-version=3.2для обновления сопоставлений источников в TFS 2017 U3.

Вы можете использовать ниже образец PowerShell, чтобы добавить / обновить исходное сопоставление:

Param(
   [string]$collectionurl = "http://tfs2017-test:8080/tfs/DefaultCollection",
   [string]$project = "ProjectName",
   [string]$definitionid = "6",
   [string]$user = "Domainusername",
   [string]$token = "Password"
)

# Base64-encodes the Personal Access Token (PAT) appropriately
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))

#Get resonse of the build definition
$defurl = "$collectionurl/$project/_apis/build/definitions/$($definitionid)?api-version=3.2"            
$definition = Invoke-RestMethod -Uri $defurl -Method Get -UseDefaultCredential -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

#Set repository.properties, source mapping for example:
$definition.repository.properties.tfvcMapping = '{"mappings":[{"serverPath":"$/ScrumProject/Dev","mappingType":"map","localPath":"\"}]}'

$json = @($definition) | ConvertTo-Json -Depth 99

#Update build definition
$updatedef = Invoke-RestMethod  -Uri $defurl  -Method Put -Body $json -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

Вы также можете использовать TFS BuildHttpClient для обновления определения сборки, обратитесь к этому потоку за подробностями: https://serverfault.com/questions/799607/tfs-buildhttpclient-updatedefinition-c-example

C #, TFS, TFSBuild, tfs2017, VSTS-релиз,
Похожие вопросы