Заметки консультанта

Шамрай Александр Владимирович

Archive for 14.12.2018

Azure DevOps Services Rest Api. 6. Загрузка и получение вложений для рабочих элементов

Posted by Shamrai Alexander на 14 декабря, 2018

<< Перейти в радел «Azure DevOps Services (TFS/VSTS) Rest Api»

При автоматизации некоторых процессов полезно использовать вложения рабочих элементов, которые могут включать в себя журнал работы приложения, скриншот и т.д. Для управления вложениями используются методы CreateAttachmentAsync и GetAttachmentContentAsync для загрузки и получения.

Пример для загрузки вложения включает шаги:

  1. Создание потока для чтения содержимого файла.
  2. Создание вложения на сервисе через метод CreateAttachmentAsync, который включает параметры поток и наименование вложения. Можно использовать создание вложения без файлового потока, а только с наименованием файла. Но этот подход нужно использовать, если файл для вложения находится в локальном каталоге. Иначе имя файла во вложении будет содержать путь к файлу, а не просто его наименование.
  3. Обновление рабочего элемента. Формируется JsonPatchDocument, который добавляет новую связь для рабочего элемента с типом AttachedFile. Также передается URL вложения, который будет получен на шаге 2.

AttachmentReference att;

using (FileStream attStream = new FileStream(FilePath, FileMode.Open, FileAccess.Read))

att = WitClient.CreateAttachmentAsync(attStream, filePathSplit[filePathSplit.Length — 1]).Result; // upload the file

JsonPatchDocument patchDocument = new JsonPatchDocument();

patchDocument.Add(new JsonPatchOperation()

{

Operation = Operation.Add,

Path = «/relations/-«,

Value = new

{

rel = «AttachedFile»,

url = att.Url,

attributes = new { comment = «Comments for the file « + filePathSplit[filePathSplit.Length — 1] }

}

});

WitClient.UpdateWorkItemAsync(patchDocument, WIId).Result;

Для получения вложения необходимо выполнить следующие шаги:

  1. Получить рабочий элемент и его ссылки. Что получить ссылки, в метод GetWorkItemAsync передается параметр expand: WorkItemExpand.Relations.
  2. Ссылки, которые имеют вложения, имеют тип AttachedFile в свойстве Rel класса WorkItemRelation. Если нам нужен конкретный файл, то его наименование можно найти через атрибут name.
  3. Для того, чтобы получить вложение, нам необходимо получить его идентификатор. Идентификатор можно выделить из URL вложения.
  4. Далее выполняется получение потока через метод GetAttachmentContentAsync и сохранение его в необходимом файле.

WorkItem workItem = WitClient.GetWorkItemAsync(WIId, expand: WorkItemExpand.Relations).Result;

foreach(var rf in workItem.Relations)

{


if (rf.Rel == «AttachedFile»)

{


string[] urlSplit = rf.Url.ToString().Split(new
char[] { ‘/’ }, StringSplitOptions.RemoveEmptyEntries);


using (Stream attStream = WitClient.GetAttachmentContentAsync(new Guid(urlSplit[urlSplit.Length — 1])).Result) // get an attachment stream


using (FileStream destFile = new FileStream(DestFolder + «\\» + rf.Attributes[«name»], FileMode.Create, FileAccess.Write)) // create new file

attStream.CopyTo(destFile); //copy content to the file

}

}

Пример тестового приложения можно посмотреть здесь:

https://github.com/ashamrai/TFRestApi/tree/master/06.TFRestApiAppWorkItemAttachments

English version

Posted in Microsoft, Team Foundation Server, Team Foundation Server FAQ, Visual Studio, visual studio team services | Отмечено: , , , , | Leave a Comment »

 
%d такие блоггеры, как: