Я расскажу о том, как настроить автоматический запуск модульных тестов в сервисе Travis CI для .NET Core проекта, в котором используется PostgreSQL.
Можно использовать эту статью как пример для быстрого старта.
У меня есть хобби-проект — инструмент для версионной миграции БД на .NET Core. Он умеет работать с несколькими СУБД, в том числе, с PostgreSQL. В проекте есть некоторое количество тестов (xUnit), которым для работы тоже нужен PostgreSQL.
Я много слышал про Travis CI и давно хотел настроить в нем автоматический запуск тестов, но меня останавливало две вещи:
- было неясно, как скрестить Travis CI и .NET Core;
- непонятно, как настроить PostgreSQL для тестов.
Потратив пол дня на изучение документации и эксперименты, я настроил тесты и хочу рассказать вам об этом.
Что такое Travis CI
Travis CI — это continuous integration сервис для проектов на Github. Когда вы коммитите что-то в репозиторий, Travis CI может автоматически выполнять разные полезные действия. Например, он может запускать модульные тесты и линтеры кода. Я буду называть эти полезные действия словом "сборка" ("build").
Чтобы настроить Travis CI для своего репозитория, нужно указать адрес репозитория в веб-интерфейсе Travis CI и положить в корень проекта файл .travis.yml
с настройками сборки.
Настройка Travis CI
Первое, что нужно сделать — залогиниться на сайте https://travis-ci.org, используя свой GitHub аккаунт. После этого вы увидите список всех своих репозиториев. Нажмите на переключатель напротив репозитория, для которого нужно включить интеграцию с Travis:
Далее перейдите в настройки выбранного репозитория. Здесь вы можете настроить, в каких случаях нужно запускать сборку. Я указал, что сборку нужно запускать при каждой операции Push в репозиторий, а также при создании или изменении Pull request. Кроме того, я указал, что сборку нужно запускать только если в корне репозитория есть конфигурационный файл .travis.yml
.
Пример .travis.yml для .NET Core
Следующий шаг — добавление в репозиторий файла .travis.yml
с настройками сборки. Для сборки проекта на .NET Core файл .travis.yml
будет выглядеть примерно так:
language: csharp
sudo: required
dist: trusty
mono: none
dotnet: 2.0.0-preview2-006497
before_script:
- dotnet restore
script:
- dotnet test ./ThinkingHome.Migrator.Tests -c Release -f netcoreapp2.0
Давайте разберемся, что здесь написано:
mono: none
— этот параметр задает версию Mono, которую нужно использовать для сборки. Т.к. мы собираем проект для .NET Core, выключаем Mono, чтобы не тратить время на инициализацию.dotnet: 2.0.0-preview2-006497
— здесь мы задаем нужную нам версию .NET Core. Обратите внимание, нужно указывать версию SDK, а не версию Runtime.before_script:
— команды, которые нужно выполнить до начала сборки. У нас здесь пока только одна командаdotnet restore
(установить необходимые пакеты из NuGet). Здесь можно написать несколько команд, каждую на отдельной строке.script:
— основные команды сборки. В нашем случае, это запуск тестов, которые находятся в проектеThinkingHome.Migrator.Tests
. При запуске будет использована конфигурацияRelease
и целевой фреймфоркnetcoreapp2.0
. Опять же, если нужно выполнить несколько команд, пишем каждую на отдельной строке.
Перед тем, как коммитить файл с настройками в репозиторий, убедимся, что команды в разделах script
и before_script
локально выполняются без ошибок. После этого коммитим файл .travis.yml
и пушим изменения на удаленный сервер.
git add .travis.yml
git commit -m "Add travis config file"
git push
Через несколько секунд видим, что Travis увидел наши изменения и запустил сборку. Вы можете посмотреть подробную информацию о выполнении сборки, в том числе всё, что было выведено в консоль. Видим, что был установлен .NET Core и запущены тесты.
Также видим, что тесты упали, т.к. они обращаются к БД, которая им недоступна.
Подключение PostgreSQL
Давайте подключим PostgreSQL в нашу сборку. Для этого добавим в .travis.yml
раздел services
с записью postgresql
, а также добавим в раздел before_script
команды для создания БД для тестов с помощью утилиты psql
.
services:
- postgresql
before_script:
- psql -c "CREATE DATABASE migrations;" -U postgres
...
По умолчанию доступна БД postgres
, к которой можно подключиться от имени пользователя postgres
без пароля. Чтобы не зависеть от этих настроек по умолчанию, создадим для тестов отдельного пользователя и БД. Если нужно что-то сделать с новой БД, не забываем указывать её название в параметре -d
.
Полный текст файла .travis.yml
приведен ниже:
language: csharp
sudo: required
mono: none
dotnet: 2.0.0-preview2-006497
dist: trusty
services:
- postgresql
before_script:
- psql -c "CREATE DATABASE migrations;" -U postgres
- psql -c "CREATE USER migrator WITH PASSWORD '123';" -U postgres
- psql -c 'CREATE SCHEMA "Moo" AUTHORIZATION migrator;' -U postgres -d migrations
- dotnet restore
script:
- dotnet test ./ThinkingHome.Migrator.Tests -c Release -f netcoreapp2.0
Коммитим измененный файл и пушим на удаленный сервер. Тада!!! На этот раз тесты прошли успешно!
Заключение
Отлично! Мы разобрались, как настроить Travis CI для нашего проекта на .NET Core, использующего PostgreSQL. Теперь можем добавить в readme нашего проекта бирку, показывающую результат последнего билда с помощью сервиса Shields.io.
[![Travis](https://img.shields.io/travis/thinking-home/migrator.svg)](https://travis-ci.org/thinking-home/migrator)
Спасибо за внимание!
Комментарии (7)
Diaskhan
01.08.2017 13:47+1Я вот все хотел спросить EF core миграции хорошо работают ли с Постгре ???
dima117
01.08.2017 14:16Да, хорошо работают.
Я использовал свой мигратор потому, что в моем проекте система плагинов и у каждого плагина собственная структура БД, для которой отдельно ведется учет версий. EF migrations в рамках одной БД такого не умеют :(
Hixon10
01.08.2017 23:26+1Для тестов для postgresql можно использовать embedded postgresql:
https://habrahabr.ru/company/hh/blog/333616/
dekkee
А есть ссылка на гитхаб? Интересен проект noolite.
dima117
Вот, пожалуйста: https://github.com/thinking-home/noolite
Там .NET API для MRTF1164, но оно ещё не готово.