Continuous integration для C++ разработчика

Павел Филонов

Разработчик-исследователь в Лаборатории Касперского. Занимается вопросами применения методов машинного обучения в задачах обеспечения безопасности кибер-физических систем.
На прошлых местах работы занимался задачами по компьютерному зрению, робототехнике и систем высокоскоростной обработки событий.

Ведёт преподавательскую деятельность по таким дисциплинам как: архитектура ЭВМ, компьютерная графика и объектно-ориентированное программирование.


А мы построим свой CI с conan и travis

Вводная

В головах разработчиков бытует мнение, что их работа заканчивается после того, как они закомитили код, а весь остальной процесс их вовсе не касается. В ответ на этот тезис хорошо подходит цитата Роберта Хайнлайна:

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

Специализация — это удел насекомых.

И взамен упомянутого выше устаревшего мнения мы выдвинем свой тезис - тот факт, что код сбирается на машине разработчика не интересует никого! Наша цель - сделать следующий шаг навстречу непрерывной интеграции (CI, англ. Continuous integration) и автоматизировать разрешение зависимостей, сборку и модульное тестирование под все целевые платформы.

Непрерывная интеграция

Непрерывной интеграцией называют практику, по которой разработчики периодически (читай ежедневно) вливают результаты своей работы в основную ветку кода. Впервые данная практика была предложена в методе Буча. Позднее в методологии экстремального программирования она обросла автоматическим прогоном модульных тестов. Свой дальнейшее развитие данная практика получила в виде непрерывной доставки (CD, англ. Continuous delivery) - процесс, в ходе которого после прохождения приёмочных тестов автоматически собирается дистрибутив, готовый к отгрузке заказчику. И уже в самом конце можно говорить об непрерывном развертывании (CD, англ. Continuous deployment) в ходе которого, все изменения прошедшие тестирование, автоматически отправляются в продакшн. Если Вы уже запутались, то можете представить себе следующую последовательность:

  1. Continuous integration
  2. Continuous delivery
  3. Continuous deployment

В рамках данного мастер-класса мы будет говорить об CI применительно к разработке на C++.

Предварительные требования

От Вас нужно:

  • умение программировать на C++ (спасибо, Кэп!)
  • laptop c любой ОС
  • один из компиляторов:
    • Visual Studio >= 2015
    • g++ >= 5.4
    • clang++ >= 3.9
    • Xcode >= 8.0
  • cmake >= 3.6 (нужно понимать синтаксис CMakeLists.txt)
  • git >= 2.10
  • python >= 3.5
  • pip3 >= 9.0
  • учетная запись на github.com
  • учетная запись на travis-ci.org (привязанная к github)
  • учетная запись на appveyor.com (привязанная к github)
  • учетная запись на conan.io
  • учетная запись на digitalocean.com

Часть первая - github

В первой части будем предполагать, что вы пишете домашний проект, работаете над Open Source или можете хранить исходные коды на стороннем ресурсе и готовы за это заплатить.

Какие задачи Вы научитесь решать:

  • как автоматизировать сборку под Linux и Mac OS с помощью travis-ci
  • как автоматизировать сборку под Windows с помощью appveyor
  • как управлять зависимостями с помощью conan
  • как автоматизировать запуск модульных тестов под все платформы
  • как автоматически собирать с разными конфигурациями и версиями компиляторов
  • как создавать собственные пакеты для conan (первый шаг к CD)

Часть вторая - self hosted gitlab

Во второй части мы рассмотрим ситуацию, когда у Вас рабочий проект с закрытым исходным кодом и вы не хотите сильно зависеть от неподконтрольной инфраструктуры (vendor lock).

Какие задачи Вы научитесь решать:

  • как быстро развернуть gitlab на digitalocean (DO)
  • как настроить gitlab CI для вашего проекта

Заключение

Gold спонсоры

Silver спонсоры

Community спонсоры