Я расскажу о том, как настроить автоматический запуск модульных тестов в сервисе 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)


  1. dekkee
    01.08.2017 10:24
    +1

    А есть ссылка на гитхаб? Интересен проект noolite.


    1. dima117
      01.08.2017 10:29

      Вот, пожалуйста: https://github.com/thinking-home/noolite

      Там .NET API для MRTF1164, но оно ещё не готово.


  1. Diaskhan
    01.08.2017 13:47
    +1

    Я вот все хотел спросить EF core миграции хорошо работают ли с Постгре ???


    1. denismaster
      01.08.2017 13:57
      +1

      да, никаких проблем)


    1. dima117
      01.08.2017 14:16

      Да, хорошо работают.

      Я использовал свой мигратор потому, что в моем проекте система плагинов и у каждого плагина собственная структура БД, для которой отдельно ведется учет версий. EF migrations в рамках одной БД такого не умеют :(


  1. Hixon10
    01.08.2017 23:26
    +1

    Для тестов для postgresql можно использовать embedded postgresql:
    https://habrahabr.ru/company/hh/blog/333616/


    1. dima117
      02.08.2017 11:10

      Ага, хороший вариант!

      Еще можно развернуть postgresql в Docker контейнере.