пятница, 28 августа 2015 г.

Небольшой обзор travis-ci

Наверняка многих, в своё время, не обошла стороной шумиха вокруг travis-ci. Это сервис для сборки и тестирования проектов на GitHub, относительно простой, но в принципе покрывающий большинство use case. По сравнению с тем же Jenkins, он выглядит малофункциональным, но тут преимущество в том, что за вас уже развёрнута инфраструктура, причём совершенно бесплатно.


Как же он работает? На каждый push в репозиторий, ваш проект ставится в очередь на сборку, до того момента, пока не появятся свободные ресурсы. Затем основываясь на конфигурационном файле travis-ci поднимает чистую виртуальную машину с предустановленными пакетами для указанного языка. Например для rust это будет компилятор rust и менеджер пакетов cargo. Заострю внимание на том, что состояние машины между сборками не сохраняется, она всегда будет "новой". Если нужны какие-то дополнительные пакеты, особые переменные окружения или другие настройки - это нужно указать в специальных секциях конфига. Дальше собственно выполняется сборка и прогон тестов для приложения. Если на этих этапах какая-либо команда завершилась с ошибкой, весь build помечается как "failing". В общем все стандартно.

Дополнительно после каждой сборки сохраняются подробные логи, для "разбора полётов", есть возможность выгружать артефакты в стороннее хранилище, есть интеграции с несколькими внешними сервисами. В общем ничего экстраординарного, только необходимый минимум. Единственное чего не хватает, это сборок на windows, это тем более странно, что osx они поддержали.

Наверное проще это объяснить на примере. В качестве оного возьму мой последний проект rust-software-render, который я описывал в предыдущей статье. Для начала необходимо в корень проекта добавить конфиг для travis-ci - .travis.yml:
language: rust
sudo: required
rust:
  - beta
  - nightly
  - stable
os:
  - linux
install:
  - sudo add-apt-repository ppa:team-xbmc/ppa -y
  - sudo apt-get update -q
  - sudo apt-get install libsdl2-dev
before_script:
  - rustc -V
  - cargo -V
script:
  - cargo build --release -v
  - cargo test -v
notifications:
  email:
    recipients:
      - name@mail.com
    on_success: never
    on_failure: always
  • Секция "language" - указывает на то, что я хочу использовать виртуальную машину с предустановленным окружением для rust. Существует поддержка ещё около 30 языков.
  • Секция "sudo" - в данном случае я говорю, что в скрипте развёртывания я использую команды с sudo, если от них отказаться то travis-ci будет использовать инфраструктуру на основе docker, что, как они утверждают, будет быстрее, но там есть несколько досадных ограничений.
  • Секция "rust" - задаёт массив версий rust на которых нужно прогонять сборку. Фактически на каждый push тест сборка будет запущена 3 раза.
  • Секция "os" - задаёт массив операционных систем для сборки, можно было бы дополнительно указать osx, но меня больше интересует windows, который не поддерживается.
  • Секция "install" - настройка окружения для вашего приложения, мне достаточно установки библиотеки "sdl2"
  • Секция "before_script" - что делает, понятно из названия, я в ней вывожу версии rust и cargo, что бы потом по логам было проще понять причину сбоя.
  • Секция "script" - собственно сборка и запуск тестов.
  • Секция "notifications" - тут настроена нотификация о результатах сборки на email, вообще существует довольно много и других видов нотификаций.
Просто после добавления конфигурационного файла, сборки не начнутся, нужно зайти на сайт и добавить нужный репозиторий. После этого достаточно сделать любое изменение в этом репозитории, в любой из веток, что бы сборка пошла. Вот как выглядит лог успешной сборки.

И в качестве финального шага, можно на страницу вашего readme добавить иконку с текущим статусом сборки.

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

5 комментариев:

  1. Пока rust не дополз до 1.0 без тревиса было вообще нереально сколько-нибудь большой проект писать, каждый день чего-то отваливалось и было полезно об этом знать до обновления локального компилятора :) .

    "sudo: false" и правда сильно сокращает время сборки. Для своих экспериментов на ржавчине успешно пользуюсь - ttps://github.com/ozkriff/zoc/blob/457ac36/.travis.yml

    ОтветитьУдалить
    Ответы
    1. Блин, вот оно http://docs.travis-ci.com/user/apt/ спасибо за наводку! А я пока копался в документации нашел только способ из серии качайте исходники нужных пакетов и компилируйте.

      Удалить
  2. >> Единственное чего не хватает, это сборок на windows

    Видел, как для этого дела appveyor.com пользуются - https://github.com/tomaka/glutin/blob/master/appveyor.yml

    ОтветитьУдалить
    Ответы
    1. И еще раз спасибо. Не зря пост написал, узнал и сам что-то новое.

      Удалить
  3. Я еще пробовал circle-ci, там круто было, что можно зайти по ssh на сборочную машину и делать что угодно. Пару раз очень помогало разобраться, когда на локальной машине все собиралось, а на сервере сборки - почему-то нет. У тревиса я того не знаю.

    ОтветитьУдалить