

Вход
Регистрация | Забыли пароль?
Поиск
Рубрики
Рейтинг
Облако тэгов
windows, raspberry pi 3, raspbian, умный дом, gpio, ubuntu, osmc, windows 10, linux, игры, python, установка ос, raspberry pi 2, raspberry pi zero, raspberry pi zero w, слежение, самолёт, http, diy, 1c-битрикс, нейросеть, сеть, кластер, бесперебойник, акустикаБоковое меню
Ставим опыты. Raspberry PI и непрерывная cross compilation
Если в один прекрасный момент появится необходимость в непрерывной интеграции, кросс-компилирующей сборку CMake проекта, написанного на С++ с OpenGL на одноплатнике Raspberry PI, попробуйте поэкспериментировать. Более или менее подходящий вариант всегда найдется. Конкретно меня, на поиски подвигло не только это, но еще и желание проверить не обнаружатся ли новые добротные серверы автосборки без Python и потребления внушительного количества ресурсов RAM в состоянии простоя.
Для того, кто не осилит дочитать статью до конца: обнаружил drone, который разрешает без проблем добавлять простые файлы в корень хранилища на github/bitbucket, при этом спокойно получать автоматические Build-Deploy-Test. Похоже на Travis, только с использованием self-hosted.
Что удалось найти?
Теперь подробнее. Как выяснилось почти сразу, подходящих build серверов, соответствующих необходимым требованиям немного: concourse.ci и drone.io. Выбор скромный. Расскажу о последнем. Сравнивать не буду, было бы некорректно, потому что принял решение исключительно опираясь на описание.
У drone.io есть две версии 4.0 и 5.0. Вторая, на мой взгляд, принципиальных отличий не имеет, но зато в ней исправлена одна ошибка, благодаря которой можно было запросто убрать флажок администратора по чистой случайности.
Вся онлайн-документация доступна по ссылкам:
http://readme.drone.io/
http://readme.drone.io/0.5/
По ходу выяснился еще момент. Drone всегда работает с одними поставщиками хранилищ gogs, github или bitbucket. Вдобавок конкретный экземпляр работает в дуете с одним источником. Справится с этой проблемой несложно, достаточно запустить параллельно несколько нейтральных drone, к счастью они не забирают много ресурсов. Например, пусть первый drone смотрит в gogs, а другой на этом же сервере в bitbucket.
Запустить все это можно при помощи docker образа:
-e REMOTE_DRIVER=bitbucket \
-e "REMOTE_CONFIG=https://bitbucket.org?client_id=***&client_secret=***" \
-e DRONE_DATABASE_DRIVER=sqlite3 \
-e DRONE_DATABASE_CONFIG=/var/lib/drone/drone.sqlite \
-v /var/lib/drone_bitbucket:/var/lib/drone \
-v /var/run/docker.sock:/var/run/docker.sock \
-p 81:8000 \
--restart=always \
--name=drone_bitbucket \
drone/drone:0.4
Готово. Все элементарно.
Что делаем дальше?
В дальнейшем drone пойдет в битбакет за разрешениями, если все в порядке – продемонстрирует доступные репозитории. Еще нюанс. Сначала в "Active" не будет ничего. Потому что для репозиториев используется по умолчанию "Available". Придется активировать, просто давим на соответствующую кнопку и все.
Теперь о самом главном. Здесь нет ничего сложного. В корневой папке активного хранилища предполагается нахождение файла drone.yml, с описанием того, как следует билдить и развертывать содержимое. Еще задается tag докер образа, где собственно осуществляется сборка, а также команды билда. С поправкой на нашу реальность drone.yml будет выглядеть следующим образом:
image: notfl3/cross_raspberry_pi
commands:
- cmake -D CMAKE_BUILD_TYPE=Debug -D CMAKE_TOOLCHAIN_FILE=/Toolchain-RaspberryPi.cmake .
- make
publish:
sftp:
host:
port: 22
username: ...
password: ...
destination_path: ...
files:
- ...
В чем нюансы?
Самым проблемным этапом стало создание docker образа, способного на кросс-компеляцию для Raspberry. В интернете навалом готовых, но если вы не ищите легких путей и простое любопытство побеждает над разумом, то можно создать свой. Будет он выглядеть примерно так:
RUN apt-get update
RUN apt-get install -y git
RUN apt-get install -y cmake
ENV CROSS_TRIPLE arm-linux-gnueabihf
RUN mkdir -p /rpi/tools && cd /rpi/tools && git init && git remote add -f origin https://github.com/raspberrypi/tools && \
git config core.sparseCheckout true && echo "arm-bcm2708/gcc-linaro-${CROSS_TRIPLE}-raspbian-x64" >>. git/info/sparse-checkout && \
git pull --depth=1 origin master
RUN mkdir -p /rpi/rootfs/opt
COPY lib/ /rpi/rootfs/lib/
COPY usr/ /rpi/rootfs/usr/
COPY opt/vc/ /rpi/rootfs/opt/vc/
COPY Toolchain-RaspberryPi.cmake /Toolchain-RaspberryPi.cmake
RUN mkdir -p /build
WORKDIR /build
Это моя заготовка докерфайла. Для создания полноценного образа, который можно применять для билда, необходимо будет отправить его в папку к /usr, /lib, /opt, прихваченных с Raspbian и файлом Toolchain-RaspberryPi.cmake следом за командой docker build. -t notfl3/cross_raspberry_pi. Тогда drone будет в состоянии его использовать и делать сборки. Кросс-компиляция будет проходить в соответствии с правилами CMake. Вот еще на что хотелось бы обратить внимание – прописка собственного файла Toolchain.cmake из raspberry-tools для GCC.
В итоге получилось вот что:
SET(CMAKE_SYSTEM_VERSION 1)
# Where is the target environment
SET(CMAKE_FIND_ROOT_PATH /rpi/rootfs)
# Specify the cross compiler
SET(CMAKE_C_COMPILER /rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc "--sysroot=${CMAKE_FIND_ROOT_PATH}")
SET(CMAKE_CXX_COMPILER /rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-g++ "--sysroot=${CMAKE_FIND_ROOT_PATH}")
# Search for programs only in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# Search for libraries and headers only in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
INCLUDE_DIRECTORIES(${CMAKE_FIND_ROOT_PATH}/usr/include/arm-linux-gnueabihf)
INCLUDE_DIRECTORIES(${CMAKE_FIND_ROOT_PATH}/usr/include/)
Манипуляции получились нехитрые, а на выходе имеем отлично работающий билд для Raspberry с glfw окном и быстрой сборкой на выделенном внешнем сервере. На удивление все получилось и без особых проблем!
Источник