Рассмотрим настройку Jenkins для сборки и запуска автоматических тестов, которые написаны на C#. Будем использовать сервер на базе Windows. Если вы используете автотесты написанные с помощью C# + Selenium WebDriver + NUnit, то также сможете использовать данную статью для настройки запуска автоматических тестов.

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

Перед тем как приступить к настройке Jenkins нам предварительно требуется установить/развернуть на сервере:
— Jenkins
— Git
— NET Framework 4.6.2 (для NuGet, актуально на момент написания статьи)
— NuGet

УСТАНОВКА JENKINS

Установочный пакет Jenkins можно скачать с официального сайта jenkins.io. Установку Jenkins описывать не буду, так как она элементарна и не требует отдельных объяснений. Хочу только заметить, что я установил Jenkins в каталог «C:\jenkins», поэтому в статье я буду ссылаться именно на него.

Для всех пакетов, которые мы будем использовать в связке с Jenkins, мы создадим отдельный каталог «C:\jenkins\CI_package», в который и будем помещать все необходимые нам пакеты и программы.

В Jenkins интерфейс отображает на том языке, который выбран по умолчанию в браузере. Если хотите поменять язык интерфейса, то вам придётся поменять язык в браузере (Chrome) или установить в Jenkins плагин «Locale».

УСТАНОВКА GIT

Установочный дистрибутив Git можно скачать с сайта git-scm.com. Установка не будет описываться, так как там всё интуитивно понятно. Если не знаете, что делать, то при установке везде жмите «Далее».

УСТАНОВКА И НАСТРОЙКА NUGET

Чтобы у нас корректно работал NuGet (у меня версия 4.7.1) нам необходимо предварительно установить .NET Framework 4.6.2, который доступен для скачивания с официального сайта MIcrosoft по ссылке www.microsoft.com/ru-RU/download/details.aspx?id=53344

Скачиваем консольную утилиту «nuget.exe» с официального сайта nuget.org/downloads. Файл «nuget.exe» помещаем в каталог «C:\jenkins\CI_package».

Создаём в каталоге «C:\jenkins\CI_package» файл «nuget.config» и заполняем его следующим содержимым:

<!--?xml version="1.0" encoding="utf-8"?-->
<configuration>
  <packagesources>
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolversion="3">
    <add key="Custom_Folder" value="C:\Jenkins\CI_package\nuget_package">
    <add key="Microsoft Visual Studio Offline Packages" value="C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\">
  </add></add></add></packagesources>
  <packagerestore>
    <add key="enabled" value="True">
    <add key="automatic" value="True">
  </add></add></packagerestore>
  <bindingredirects>
    <add key="skip" value="False">
  </add></bindingredirects>
  <packagemanagement>
    <add key="format" value="0">
    <add key="disabled" value="False">
  </add></add></packagemanagement>
  <disabledpackagesources>
    <add key="nuget.org" value="true">
    <add key="Microsoft Visual Studio Offline Packages" value="true">
  </add></add></disabledpackagesources>
</configuration>

У меня в секции «packageSources» указано два источника, откуда могут браться пакеты:
1. Официальный источник NuGet-пакетов.
2. Каталог на компьютере, в который я могу поместить пакеты *.nupkg.

В секции «disabledPackageSources» указываете только те источники, которые отключены. У меня отключены все кроме каталога «Custom_Folder».

Содержимое указанных секций можете менять на своё усмотрение (аккуратно). Другие секции не трогаем и оставляем как есть.

НАСТРОЙКА JENKINS

Установка плагинов

Установим в Jenkins следующие плагины:
— Git
— MSBuild
— NUnit

Для установки переходим в раздел настроек «Настроить Jenkins» — «Управление плагинами» — «Доступные»:

Настройка Jenkins для запуска автоматических тестов
Настройка Jenkins для запуска автоматических тестов

Ищем плагины именно называющиеся, так как я и написал выше, особенно это касается плагина «Git», иначе можете установить не то что нужно.

Настройка Jenkins для запуска автоматических тестов

После установки плагинов перезагружаем Jenkins.

Настройка MSBuild

Чтобы можно было производить в дальнейшем компиляцию проекта нам необходимо произвести настройку Jenkins, чтобы он знал, где находится MSBuild. Для этого нам необходимо:
1. Определить путь до «MSBuild.exe».
2. Указать определённый путь в Jenkins.

Идём в каталог «C:\Windows\Microsoft.NET\Framework». Здесь я вижу следующее:

Настройка Jenkins для запуска автоматических тестов

У меня в проекте используется .NET Framework 4.5.2, поэтому я буду использовать «MSBuild.exe», который находится в каталоге «C:\Windows\Microsoft.NET\Framework\v4.0.30319». Полный путь до «MSBuild.exe» будет следующий «C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe». Запомнили.

Идём в Jenkins в раздел «Настроить Jenkins» — «Конфигурация глобальных инструментов»:

Настройка Jenkins для запуска автоматических тестов

И в разделе «MSBuild» прописываем настройки. У меня они будут выглядеть следующим образом:

Настройка Jenkins для запуска автоматических тестов

Сохраняем изменения. Вы можете установить «MSBuild» отдельно и использовать его, а не тот, что устанавливается с .NET Framework. Скажу только, что оба варианта работают.

Создание проекта

На главной странице в левом меню выбираем пункт «Создать Item»:

Настройка Jenkins для запуска автоматических тестов

В открывшемся окне вписываем имя проекта и выбираем тип проекта:

Настройка Jenkins для запуска автоматических тестов

Нажимаем «ОК». Откроется страница настройки проекта. Если страница не открылась, то откройте её (на главной странице нажмите по названию проекта и далее в левом меню сайта «Настройки»).

Заполнение блока «Управление исходным кодом»

Выбираем «Git». В форме указываем:
— Repository URL – указывается ссылка на репозиторий Git;
— Credentials – нажимаем «Add» — «Jenkins», чтобы добавить учётную запись для авторизации в Git (я выбрал авторизацию по логину/паролю):

Настройка Jenkins для запуска автоматических тестов

— Branches to build – с какой ветки брать код (у меня «master»);
— Просмотрщик репозитория – значение «Автоматически»;
— Additional Behaviours – дополнительные действия, здесь я указал, чтобы перед сборкой очищался рабочий каталог от старых данных. Рабочий каталог, по умолчанию, находится по пути {каталог установки Jenkins}\workspace\{имя проекта}.

Получилось следующее:

Настройка Jenkins для запуска автоматических тестов

Теперь Jenkins знает, откуда требуется качать исходники.

Заполнение блока «Триггеры сборки»

Данный блок заполняйте на своё усмотрение. Если хотите, чтобы Jenkins опрашивал репозиторий каждые 30 минут и при наличии изменений запускал сборку, то указываем следующее:

Настройка Jenkins для запуска автоматических тестов

Заполнение блока «Сборка»

Теперь нам надо указать, что Jenkins должен делать, после того как скачает исходный код:
1. Скачать NuGet пакеты, которые подключены к проекту.
2. Скомпилировать проект.
3. Запустить выполнение (запуск автотестов).

Добавляем первый шаг «Выполнить команду Windows» в блоке «Сборка»:

Настройка Jenkins для запуска автоматических тестов

В появившемся поле указываем, что нам надо запустить «nuget.exe» для восстановления NuGet-пакетов, ведь мы их в репозиторий не загружаем. Команда:

"C:\jenkins\CI_package\nuget.exe" restore "%WORKSPACE%\test.sln" -ConfigFile "C:\jenkins\CI_package\nuget.config"
Настройка Jenkins для запуска автоматических тестов

Можно использовать различные команды (примеры):

"C:\jenkins\CI_package\nuget.exe" restore "%WORKSPACE%\test.sln" -ConfigFile "C:\jenkins\CI_package\nuget.config""C:\jenkins\CI_package\nuget.exe" restore "%WORKSPACE%\test.sln" -source "C:\nuget_package""C:\jenkins\CI_package\nuget.exe" restore "%WORKSPACE%\test.sln" -source "https://nuget.victorz.ru/v3/index.json"

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

Добавим второй шаг «Build a Visual Studio project or solution using MSBuild» в блоке «Сборка»:

Настройка Jenkins для запуска автоматических тестов

Заполняем необходимые поля. В моём случае получим:

Настройка Jenkins для запуска автоматических тестов

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

Добавляем третий шаг «Выполнить команду Windows» в блоке «Сборка»:

Настройка Jenkins для запуска автоматических тестов

В открывшемся окне прописываем команду запуска NUnit с параметрами, в которых передаём путь к нашей библиотеке с тестами:

"%WORKSPACE%\packages\NUnit.ConsoleRunner.3.8.0\tools\nunit3-console.exe" "%WORKSPACE%\test\bin\Release\test.dll" --result=nunit-result.xml

Внимательно прописывайте путь к NUnit и путь к библиотеке. «nunit-result.xml» — это отчёт, который сгенерирует NUnit, он будет всегда размещаться в корне рабочего каталога.

У меня получилось следующее:

Настройка Jenkins для запуска автоматических тестов

Если вам необходимо запускать тесты определённой категории, то дописываем это следующим образом (обратите внимание на окончание команды):

"%WORKSPACE%\packages\NUnit.ConsoleRunner.3.8.0\tools\nunit3-console.exe" "%WORKSPACE%\test\bin\Release\test.dll" --result=nunit-result.xml --where "cat == REST"

«REST» — это название моей категории тестов. Вы указываете свою категорию запускаемых тестов.

Заполнение блока «Послесборочные операции»

Чтобы Jenkins у себя в интерфейсе выводил результаты тестов надо в блоке «Послесборочные операции» добавить шаг «Publish NUnit test result report»:

Настройка Jenkins для запуска автоматических тестов

В появившейся строке указать имя отчёта, который у нас будет генерировать NUnit:

Настройка Jenkins для запуска автоматических тестов

Теперь нажимаем «Сохранить». Проект, который собирает наши тесты и запускает их, настроен.

Запуск тестов

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

Настройка Jenkins для запуска автоматических тестов

Просмотр результатов

Для просмотра результатов достаточно перейти в проект и выбрать последний номер сборки в блоке «История сборок»:

Настройка Jenkins для запуска автоматических тестов
Настройка Jenkins для запуска автоматических тестов
Настройка Jenkins для запуска автоматических тестов

Вот и завершена настройка Jenkins для запуска автоматических тестов, написанных на C#.

ВСТРЕЧАЮЩИЕСЯ ОШИБКИ

Ошибка 1

Необработанное исключение: System.MissingMethodException: Метод не найден: "!!0[
] System.Array.Empty()".
   в NuGet.Common.CommandLineResponseFile.ParseArgsResponseFiles(String[] args,
Int32 parseArgsResponseFileRecursionDepth)
   в NuGet.CommandLine.Program.Main(String[] args)

Данная ошибка появляется при запуске «nuget.exe». На момент написания статьи у меня «nuget.exe» версии 4.7.1 и когда я установил «.NET Framework 4.6.2» у меня ошибка пропала.

Ошибка 2

...Справочная сборка для инфраструктуры ".NETFramework,Version=v4.5.2" не найдена. Чтобы исправить эту ошибку, установите SDK или пакет адресации для этой версии инфраструктуры, или измените целевую инфраструктуру приложения на версию, для которой установлен SDK или пакет адресации. Учтите, что сборки будут разрешены из глобального кэша сборок (GAC) и будут использоваться вместо справочных сборок. Поэтому они могут неправильно использовать выбранную инфраструктуру в качестве целевой. [C:\jenkins\workspace\Test\*.csproj]

Проект создан с использованием «.NET Framework 4.5.2», а его нет на компьютере. Если стоит старшая версия .NET Framework, то предыдущую, скорее всего, не удастся установить. Я установил «пакет разработчика Microsoft .NET Framework 4.5.2», который доступен по ссылке https://www.microsoft.com/ru-RU/download/details.aspx?id=42637

Если у вас программа создана с использованием другой версии .NET Framework и появляется аналогичная ошибка, с указанием вашей версии, то ищите пакет разработчика для вашей версии.