Все материалы сюжета:
- Интервью с CTO и CEO Vexor Дмитрием Галинским и Олегом Балбековым
- Как организовать правильный continuous integration и не разориться
Vexor.io — облачный CI-сервис (сontinuous integration) для девелоперов, который берет плату только за фактическое время прогона твоих тестов и при этом умеет распараллеливать процессы. Как следствие, время использования тестов уменьшается в разы, а вместе с тем уменьшается и стоимость.
Eжедневно разработчики используют CI-сервисы, однако большинство из них дорогие, медленные и неэффективные. Традиционные CI-сервисы вынуждены резервировать под твой проект ограниченное количество виртуальных машин и постоянно держать их включенными, хотя реально они нужны лишь в момент прогона тестов. То есть фактически ты должен платить за CI, даже если находился в отпуске и ничего не коммитил.
Еще одна проблема с традиционными CI-системами в том, что ты лимитирован зарезервированной под тебя мощностью. Если тебе внезапно понадобилось прогнать тесты повторно или в другой конфигурации/объеме — ты будешь ждать, ждать и еще раз ждать. Ресурсы-то заранее выделены и никак не подстраиваются под твою реальную нагрузку — ни в большую, ни в меньшую сторону.
Ребята из Vexor.io не стали мириться с таким положением дел и запустили поминутную оплату за реальное использование ресурсов. На практике это означает, что ты заплатишь только за те минуты (!), которые использовались для прогона твоих тестов. Если не было коммитов в течение месяца, то счет равен нулю. Все честно. Почему другие CI-сервисы не сделали этого до сих пор — загадка.
Например, Travis CI очень дорогой для начинающих проектов, и не всем под силу платить 129 долларов в месяц, а если потребности возрастают, то 489 долларов в месяц. При таком же объеме тестов, но используя Vexor.io ты заплатишь 10–15 долларов в месяц. Средний же чек за прогон большего количества тестов у Vexor составляет 80 долларов, но при этом у сервиса нет лимита по ресурсам.
Более того, Vexor.io умеет одновременно выделять тебе столько мощности, сколько нужно. В случае, когда ты сделаешь десять коммитов подряд например, Travis CI будет выполнять их последовательно. Vexor же моментально выделит тебе десять серверов и сделает всё параллельно, а значит — быстрее. При этом, помни, платишь только за минуты, которые затрачены на прогон тестов. А сколько при этом работает параллельных воркеров — не имеет значения.
Get started
А как же Open Source?
Безусловно, существуют альтернативы в виде open source решений, но для этого нужен хороший сервер, который необходимо администрировать и тратить рабочее время разработчиков и девопсов. То есть тебе придется настроить не только свой проект, но и саму систему CI. Vexor в этом плане куда круче — как любой SaaS, он не требует никакой настройки. Все, что нужно, — настроить твой проект под CI. А если учесть, что конфиги совместимы с самой популярной CI Travis, процесс переноса превращается в тривиальную задачу.
Работает все это на удивление просто. Базовый файл конфигурации .travis.yml должен быть расположен в корневом каталоге твоего проекта (для Rails-проектов это требование не обязательно). Для поддерживаемых языков процесс конфигурации максимально прост: надо лишь прописать нужный язык в параметре language (например, language: ruby). Таким образом, подготовка окружения и прогон тестов будут проходить в автоматическом режиме согласно выбранному языку.
Если стандартная тестовая конфигурация тебя не устраивает, ее можно кастомизировать под свои нужды с помощью параметров install, script, before_install, before_script. Эти параметры содержат команды, которые будут запущены в shell на соответствующих этапах тестирования:
- env позволяет вывести список переменных окружения, которые используются в тестах;
- before_install запускается до установки и предназначен для установки необходимых библиотек и зависимостей;
- install запускает команду для установки зависимостей, библиотек и всего, что требуется для тестов. Если поле оставить пустым, то будут использованы команды по умолчанию для каждого языка (например, bundle install для Ruby или go get -v ./... для Go);
- before_script — здесь можно подготовить различные сервисы для тестов, например создать БД;
- script запускает тесты. Если параметр пуст, то используется команда для запуска тестов для выбранного языка.
Пример .travis.yml для Vexor.io:
language: ruby
before_install: sudo apt-get install libicu-dev
before_script:
- psql -U postgres -c 'create database test;'
- bundle exec rake db:migrate
script: bundle exec rake test:ci
Матрицы билдов
Кроме стандартных параметров конфигурации, ты можешь создать билд-матрицу для запуска тестов поверх разных версий софта, например поверх Ruby 2.0 и Ruby 2.1. Особенно это актуально для библиотек, так как они должны поддерживать разные версии runtime. Лист доступных параметров конфигурации для матрицы:
- env — переменная окружения;
- rvm — Ruby-версия;
- jdk — Java-версия;
- scala — Scala-версия;
- go — Go-версия;
- node_js — Node.js-версия.