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

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

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

Модификации процесса и состояний рабочих элементов могут быть осуществлены как на уровне конкретного процесса, так и на уровне глобального шаблона. Основным инструментарием, который помогает это делать, являются утилиты командной строки WitImport и Witexport. Дополнительно, существуют возможности модификации процессов с помощью расширения Visual Studio Power Tools. Это расширение можно скачать с сайта https://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>

   < FIELDrefname = "System.State">

              < READONLYnot = "[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="https://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 " имя сервера "