Статьи

Непрерывная статистика проекта с StatSVN и TeamCity

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

Что приятно в StatSVN, так это то, что он бесплатный и не требует много времени для его использования. Вместо того, чтобы анализировать вашу кодовую базу, как NDepend, StatSVN анализирует ваш репозиторий Subversion и сообщает о том, как ваше приложение изменилось с течением времени. В некотором смысле, это своего рода жевательная резинка для мозга (множество интересных показателей без большого количества вещества), но есть некоторая ценность в понимании того, как структурирован ваш проект. И эй, это бесплатно!

Как все установить

Есть несколько маленьких кусочков, необходимых для работы StatSVN. Каждый из них должен быть установлен на сервере сборки:

Для начала вам понадобится StatSVN. Мы пойдем, возьмем последнюю версию и распакуем zip в каталог программных файлов. Там нет установщика, и все это состоит из файла readme, и, поскольку все написано на Java, вы также получаете файл .jar.

Чтобы мы могли сделать что-то полезное с файлом .jar, нам также нужно установить Java .

Наконец, нам нужно выполнить запрос командной строки к Subversion, поэтому нам потребуется доступ к svn.exe. Поскольку у меня есть VisualSVN Server на моем демонстрационном сервере TeamCity, я просто добавлю путь к «C: \ Program Files \ VisualSVN Server \ bin» в переменных среды машины, но в противном случае вы всегда можете пойти и взять последний бинарный файл. установщик SVN .

Запуск StatSVN

Чтобы выполнить StatSVN, нам нужно выполнить три отдельных задания:

  1. Проверьте хранилище в рабочий каталог
  2. Запустите «svn log», чтобы экспортировать историю репозитория в файл журнала.
  3. Запустите инструмент StatSVN для файла журнала, чтобы сгенерировать отчет

Мы собираемся автоматизировать все это в новой сборке против проекта, который я создал в своей серии из пяти статей «Вы неправильно внедрили» . Начнем с новой сборки:

Создание новой сборки для StatSVN

Единственная заметная достопримечательность здесь — путь артефакта. Как и вчера с NDepend , нам нужно сообщить TeamCity, где найти результаты этой конкретной сборки. Мы скоро вернемся на этот путь.

Переходя к настройкам VCS:

Настройки VCS для сборки

Корень VCS будет таким же, как и во всех других сборках (еще раз, не забудьте правило извлечения, если у вас есть транк), но режим извлечения будет немного другим. В каждой другой сборке, которую я создал до сих пор, использовалась опция «Автоматически на сервере» по умолчанию. Причина, по которой мы собираемся использовать «Автоматически на агенте», заключается в том, что это будет эффективно выполнять проверку svn, которая хранит файлы, связанные с хранилищем, а не экспорт svn, который извлекает их и нарушает связь. Как вы увидите из шага 1, StatSVN требует этого, прежде чем идти дальше.

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

Давайте начнем с svn log :

svn log
  --xml
  --non-interactive
  -v
  > StatSvnLog.xml

Цель этой команды — сбросить каждую транзакцию VCS в файл XML. Ради интереса, они выглядят примерно так.

<logentry revision="9">
  <author>troy</author>
  <date>2010-11-19T10:07:53.824726Z</date>
  <paths>
    <path kind="file" action="M">/trunk/Web/Default.aspx</path>
  </paths>
  <msg>Updated text on the homepage.</msg>
</logentry>

Часто в этих журналах будет много записей пути, но это дает вам представление. Что говорят переключатели в заявлении:

  1. —xml: сохранить журнал в формате XML
  2. —non-interactive: отключает все интерактивные приглашения (подробнее об этом позже)
  3. -v: подробный режим включает информацию о путях, которые были изменены в каждой ревизии
  4. > StatSvnLog.xml: имя файла для сохранения журнала

Далее следует команда StatSVN, которая будет выглядеть следующим образом:

"C:\Program Files\Java\jre6\bin\java.exe" -jar "C:\Program Files\statsvn-
  0.7.0\statsvn.jar"
  StatSvnLog.xml
  %1
  -output-dir StatSvnOutput
  -disable-twitter-button

Вот что он делает:

  1. java.exe: выполняет исполняемый файл Java и передает файл .jar для StatSVN.
  2. StatSvnLog.xml: ссылается на файл журнала, который мы создали ранее
  3. % 1: мы собираемся передать это из TeamCity — это путь к рабочему каталогу
  4. -output-dir: где мы хотим разместить отчет (ранее на него ссылались как на артефакт)
  5. -disable-twitter-button: потому что я не хочу, чтобы люди автоматически писали в Твиттере о моей внутренней базе кода!

Я собираюсь поместить обе эти команды в файл с именем «RunStatSvn.bat» и поместить его в папку, в которую я установил StatSVN, в данном случае это «C: \ Program Files \ statsvn-0.7.0». Теперь мы можем вызвать его из сборщика:

Настройка сборщика

Все это говорит само за себя: каталог извлечения, передаваемый через параметры команды, является нашим рабочим каталогом, который будет передан в StatSVN, чтобы он знал, где найти кодовую базу.

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

Последнее, что мы хотим сделать, — это создать приятную вкладку на странице сборки, чтобы отобразить отчет, поэтому мы вернемся к вкладкам Администрирование -> Конфигурация сервера -> Отчеты и создадим новую запись следующим образом:

Создание вкладки отчетов для StatSVN

Давайте начнем и посмотрим, как это выглядит:

Успешная сборка

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

Резюме (и драмы)

Ранее я упоминал, что вернусь к тому, почему команда svn log работает в неинтерактивном режиме. Если честно, у меня была куча драм, заставляющих это работать. Проблема была связана с тем, под какой командой выполнялась команда, и с тем, было ли доверено подключение к Subversion. Я отчаянно искал ответы на вопрос , почему именно тому , что я настроил выше, всегда было отказано в доступе, и одна из вещей, которая немного упростила поиск, заключалась в том, чтобы убедиться, что бегущий по команде не просто сидел в ожидании имени пользователя и пароля, следовательно, неинтерактивный режим, который в моем случае просто говорит вам, что вы облажались немедленно.

В конечном итоге, после многих дней разочарований и множества изменений в конфигурации, вышеприведенные настройки только начали работать. Это было на выделенной машине для сборки, и когда я отправился писать этот блог и заново настраивать все это в своем тестовом VPC, то же самое случилось снова! Я не знаю, почему это было проблемой, и я не знаю, что исправило это, кроме явного упрямства от моего имени. Что я знаю, так это то, что конфигурация выглядит хорошо, и она определенно работает. На двух разных машинах!

В любом случае, конечный результат довольно опрятен, и теперь есть хорошая статистика с показателями качества кода из NDepend, а также со встроенным FxCop и средством поиска дубликатов в TeamCity. Это действительно хороший набор метрик, который дает вам прекрасное представление о том, что происходит в вашем коде. Тот факт, что он делает это без каких-либо подсказок, каждый день и сидит там, ожидая вас каждое утро, — это именно то, что вы хотите от автоматизированных показателей кода. Не может быть проще, чем это!