Тонкая настройка правил рабочих элементов в TFS


Очень часто в организациях и командах использующих Team Foundation Server требуется специфичная функциональность. Действительно,  шаблоны процессов входящие в комплект поставки TFS достаточно универсальны и обеспечивают базовый уровень автоматизации, который может не  учитывать уникальной  специфики свойственной подходу который принят в какой-то конкретной организации или группе разработчиков.


 К счастью, шаблоны процессов и функциональность TFS обеспечивает очень тонкую настройку процесса , состояний, наборов полей и их поведения. Эти возможности могут решить очень большой  спектр задач, требуемый в таких случаях.


Модификации процесса и состояний рабочих элементов могут быть осуществлены как на уровне конкретного процесса, так и на уровне глобального шаблона. Основным инструментарием, который помогает это делать, являются утилиты командной строки WitImport и Witexport. Дополнительно, существуют возможности модификации процессов с помощью расширения Visual Studio Power Tools. Это расширение можно скачать с сайта http://Codeplex.com .


Ниже приведены некоторые типовые примеры, которые помогут решить очень большой спектр задач тонкой настройки состояний рабочих элементов, их поведения и зависимостей.


Требование по установке поля «Оставшаяся работа» в 0 при переводе задачи в статус «Закрыто».


В некоторых случаях требуется, чтобы полю «Оставшаяся работа» было присвоено значение 0 при переводе задачи в статус «Закрыто». Организуется это следующим образом:


1)      В определении задачи следует создать новое поле «Проверка поля Оставшаяся работа»


      <FIELD type="String" name="Проверка поля Оставшаяся работа"


             refname="Demo.RemainingWorkValidation">


        <ALLOWEDVALUES>


          <LISTITEM value="Ошибок Нет" />


        </ALLOWEDVALUES>


        <WHEN field="Microsoft.VSTS.Scheduling.RemainingWork"


              value="0">


          <COPY from="value" value="Ошибок нет" />


        </WHEN>


      </FIELD>


2)      Добавить новую вкладку, и вывести это поле на эту вкладку:


          <Tab Label="Валидация">


            <Group>


              <Column PercentWidth="100">


                <Control Type="FieldControl"


                         FieldName="Demo.RemainingWorkValidation"


                         Label="Проверка обуления поля Оставшаяся работа"


                         LabelPosition="Left"/>               


              </Column>


            </Group>


          </Tab>


3)      Добавить в определение перехода между статусами из «Активно» в «Закрыто» следующий код:


        <TRANSITION from="Активные" to="Закрыто">


          <REASONS>


            <DEFAULTREASON


value="Завершено и не требует просмотра или тестирования"/>


            <REASON value="Отложено"/>


            <REASON value="Вырезать"/>


            <REASON value="Обгоняется событиями"/>


            <REASON value="Отменено"/>


          </REASONS>


          <FIELDS>


            <FIELD refname="Demo.RemainingWorkValidation">


              <WHENNOT field="Microsoft.VSTS.Scheduling.RemainingWork"


                       value="0">


                <COPY from="value"


                      value="Оставшаяся работа должна быть в значении 0"


                      ReadOnly="True"


    />


              </WHENNOT>


            </FIELD>


4)      Добавить в состояние «Активные» следующий код:


        <STATE value="Активные">


          <FIELDS>


            <FIELD refname="Demo.RemainingWorkValidation">


              <COPY from="value" value="Ошибок нет" />


            </FIELD>


5)      Добавить в состояние «Закрыто» следующий код:


        <STATE value="Закрыто">


          <FIELDS>


            <FIELD refname="Demo.RemainingWorkValidation">


              <WHENNOT field="Microsoft.VSTS.Scheduling.RemainingWork"


                       value="0">


                <COPY from="value"


                      value=" Оставшаяся работа должна быть в значении 0" />


              </WHENNOT>


            </FIELD>


 


В результате получим следующее сообщение, если поле «Оставшаяся работа не будет содержать 0 при переводе статуса:



Требование, обеспечивающее возможность перевода рабочего элемента «Ошибка» в статус «Закрыто» только тем пользователем, который его создал.


Иногда требуется ввести ограничение обеспечивающее возможность перевода рабочего элемента «Ошибка» в статус «Закрыто» только тем пользователем, который его создал или администраторами проекта.  Для этого следует ввести следующие модификации в определение стандартного элемента «Ошибка»:


1)      Создать поле «ClosedByValidation»


      <FIELD name="Closed By Validation"


             refname="Demo.ClosedByValidation"


             type="String">


        <COPY from="currentuser" />


        <FROZEN not="[project]\Администраторы проекта"/>


      </FIELD>


2)      Добавить следующее правило в состояние «Закрыто»


        <STATE value="Закрыто">


          <FIELDS>


            <FIELD refname="Demo.ClosedByValidation">


              <COPY from="currentuser" />


            </FIELD>


3)      Добавить новую вкладку «Валидация» и вывести на нее следующие поля:


          <Tab Label="Валидация">


            <Group>


              <Column PercentWidth="100">


                <Control Type="FieldControl"


                         FieldName="System.CreatedBy"


                         Label="Кем создано"


                         LabelPosition="Left"


                         ReadOnly="True" />


 


                <Control Type="FieldControl"


                         FieldName="Demo.ClosedByValidation"


 Label="Кем закрыто (должно соответствовать кем                                                                             создано)"


                         LabelPosition="Left"


                         ReadOnly="True" />


              </Column>


            </Group>


          </Tab>


 


В поле Demo.ClosedByValidation будет записан пользователь – создатель рабочего элемента. И в случае если это значение будет отличаться от текущего пользователя при переводе рабочего элемента «Ошибки» в статус «Закрыто» будет выведено сообщение об ошибке:




Требование, обеспечивающее возможность создания рабочих элементов только теми пользователями, которые входят в некоторую группу.


Иногда требуется чтобы рабочие элементы типа «Ошибка» могли создаваться только пользователями тестерами входящими в группу [project]\Тестировщики. Для этого следует ввести в стандартное определение рабочего элемента «Ошибка» следующие модификации:


1)      В переход между состояниям по умолчанию добавить следующий код:


        <TRANSITION from="" to="Предложено">


          <REASONS>


            <DEFAULTREASON value="Создать"/>


            <REASON value="Не удалось выполнить построение"/>


          </REASONS>


          <FIELDS>


            <FIELD refname="System.AssignedTo">


              <DEFAULT from="currentuser"/>


            </FIELD>


            <FIELD refname="System.State">


              <READONLY not="[project]\Тестировщики" />


            </FIELD>


          </FIELDS>


   </TRANSITION>


 


Теперь при попытке сохранить такой рабочий элемент пользователем который не входит в рабочую группу «Тестировщики» будет выведено сообщение об ошибке:



 


Эту же задачу можно решить иным способом, используя механизмы обеспечения безопасности между переходами, добавив следующий модификатор:


        <TRANSITION from=""


to="Предложено"


for="[project]\Тестеры"


not="[project]\Аналитики">


     


Но сообщение об ошибке которое будет выводиться системой будет несколько неочевидрным, и предложенный выше способ выглядит более удачным.


Обеспечение некоторого поля значениями по умолчанию.


Для того что бы в некотором поле была возможность выбора из выпадающего списка некоторых заранее заданных значений, и задания значения по умолчанию, достаточно внести в определение рабочего элемента следующих модификаций:


        <FIELD name="Категория"


               refname="MyCompany.MyProcess.Category"


               type="String"


               reportable="dimension">


          <ALLOWEDVALUES>


            <LISTITEM value="Управление процессом" />


            <LISTITEM value="Планирование" />


            <LISTITEM value="Исполнение" />


            <LISTITEM value="Ревью" />


          </ALLOWEDVALUES>


          <DEFAULT from="value" value="Исполнение" />


        </FIELD>


Следует учитывать, что значения по умолчанию срабатывают только в том случае если поле было пустым.


Обеспечение зависимости поля списка от значений другого поля


 Иногда требуется, чтобы поле-список предлагало некоторые значения, зависящие от значения другого поля. Для того чтобы обеспечить такую возможность достаточно внести следующие модификации в определение рабочего элемента:


        <FIELD name="Категория"


               refname="MyCompany.MyProcess.Category"


               type="String"


               reportable="dimension">


          <WHEN field="Microsoft.VSTS.Common.Discipline"


                value="Требования">


            <ALLOWEDVALUES>


              <LISTITEM value="Планирование" />


              <LISTITEM value="Ревью" />


            </ALLOWEDVALUES>


          </WHEN>


          <WHENNOT field="Microsoft.VSTS.Common.Discipline"


                   value="Требования">


            <ALLOWEDVALUES>


              <LISTITEM value="Управление процессом" />


              <LISTITEM value="Планирование" />


              <LISTITEM value="Исполнение" />


              <LISTITEM value="Ревью" />


            </ALLOWEDVALUES>


          </WHENNOT>


          <DEFAULT from="value" value="Исполнение" />


        </FIELD>


 


Как уже стало понятно из примера, требуемая возможность обеспечивается модификаторами WHEN и WHENNOT.


Обеспечение значения поля шаблону.


Иногда необходимо чтобы значение поля соответствовало некоторому шаблону, примерно так же как это может обеспечивать механизм RegExp. Для обеспечения такой возможности достаточно внести в определение рабочего элемента следующие изменения:


          <FIELD name="Версия"


                 refname="MyCompany.MyProcess.Version"


                 type="String">


            <MATCH pattern="vNN.NN.AX"/>


          </FIELD>


После внесения такой модификации, значение поля будет требовать соответствия шаблону  vNN.NN.AX. Более подробно о формате шаблонов можно узнать в документации к Team Foundation Server.


Обеспечение значения поля «Назначено» некоторому набору пользователей входящих в группу.


Иногда требуется, чтобы поле рабочего элемента «Назначено» соответствовало только заранее заданному перечню пользователей входящих в группу. Для обеспечения такой возможности достаточно внести следующие изменения в рабочий элемент:


        <FIELD name="Назначено"


               refname="System.AssignedTo"


               type="String"


               reportable="dimension">


          <ALLOWEDVALUES expanditems="true">


            <LISTITEM value="[Project]\Участники" />


          </ALLOWEDVALUES>


        </FIELD>


Обеспечение значения поля некоторому заданному перечню, хранящемуся в глобальном файле.


Иногда множество значений, которое может быть присвоено полю удобно хранить на уровне всех проектов зарегистрированных в системе. Для обеспечения такой возможности достаточно создать XML файл с следующим содержанием:


        <?xml version="1.0" encoding="utf-8"?>


        <gl:GLOBALLISTS xmlns:gl="http://schemas.microsoft.com/VisualStudio/2008/workitemtracking/globallists">


          <GLOBALLIST name="Дисциплина">


            <LISTITEM value="Архитектура" />


            <LISTITEM value="Требования" />


            <LISTITEM value="Разработка" />


            <LISTITEM value="Управление релизами" />


            <LISTITEM value="Управление проектом" />


            <LISTITEM value="Тестирование" />


          </GLOBALLIST>


        </gl:GLOBALLISTS>


 


После чего необходимо проделать операцию импорта этого файла следующей командой:


glimport /f «Путь к файлу»\<имя файла.xml>" /t "имя сервера"


 


Skip to main content