Безперервна крос компіляція на Raspberry PI

Мені хотілося розгорнути систему безперервної інтеграції, крос компилирующую CMake проект написаний на c++ з OpenGL на Raspberry PI. Заодно я хотів подивитися, чи не з'явилися зручні сервери автоматичного складання, не містять в собі пітона і не споживають сотні мегабайт ram в просте. Одна з цілей написання статті — дізнатися, чи не пройшов я повз більше хорошого або простого рішення :)
TLDR: drone класний, дозволяє додати простенький файл в корінь репозиторію на github/bitbucket — і отримати автоматичні білди/тести/деплой. Прямо як в Travis, але self-hosted.

Відправившись в гугл я дізнався, що білд серверів задовольняють моїм нехитрим вимогам усього два:
  • drone.io
  • concourse.ci
Я зупинився на drone.io. Вибирав за описом, об'єктивно порівнювати не можу.
У drone є дві версії, та 0.4 0.5. 0.5 — це бета, виглядає трохи симпатичніше, але принципово нових фичей я для себе не знайшов. Єдиний баг в 0.4 виправлений 0.5 на який я натрапив — можна випадково через UI позбавити себе прапорця Administrator.
Документація по посиланню http://readme.drone.io/ — по версії 0.4. Для 0.5 — http://readme.drone.io/0.5/.
З неочевидних нюансів — drone працює з одним із постачальників репозиторіїв, таких як github, bitbucket, gogs. Причому один інстанси drone може працювати тільки з одним джерелом. Це виправляється запуском декількох незалежних серверів drone, благо в просте вони не витрачають зайві ресурси.
У моєму випадку — один drone дивиться в bitbucket, один — в gogs запущений на тому ж сервері.
Я запускав drone через docker образ, виглядає це так:
Запуск:
docker run -d \
-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 після встановлення на сервер:
Login
Після натискання на кнопці drone відправитися за дозволами в bitbucket, і при успіху покаже всі репозиторії доступні облікового запису:
repos
Спочатку у вкладці Active буде порожньо, всі репозиторії будуть в Available.
Ось така кнопка включення є для кожного битбакет репозиторію:
activate
Тепер найцікавіше, сам процес складання :)
Процес складання в drone настраиваеться вкрай просто.
Докорінно активного сховища повинен бути файл .drone.yml, що описує як же саме збирати і деплоить вміст репозиторію.
Задається тег докер образу, в якому відбуватиметься складання і команди для збірки.
Весь .drone.yml для raspberry виглядає так:
build:
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:
- ...

найскладнішим для мене було місцем створення докер-образу, здатного в кросскомпиляцию для Raspberry.
В інтернеті є багато готових, я ж зробив свій (в основному що б подивитися, що це за докер взагалі такий).
Виглядає він приблизно так:
FROM debian:sid

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

Це зміст мого Dockerfile, для того що б створити повноцінний образ, використовуваний для збирання — потрібно покласти його в одну директорію до /usr /lib, /opt взятих з цього Raspbian'a і файлом Toolchain-RaspberryPi.cmake.
після команди
docker build . -t notfl3/cross_raspberry_pi
drone запущений на тому ж сервері зможе скористатися цим образом і збирати наші білди.
Сама кросскомпиляция відбувається згідно правилам CMake'а, єдиний нюанс — я прописав свій Toolchain.cmake файл для gcc з raspberry-tools, виглядає він так:
SET(CMAKE_SYSTEM_NAME Linux)
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/)

З допомогою цих нехитрих маніпуляцій я зміг отримати працюючих білд з glfw вікном для raspberry, швидко збирається на зовнішньому виділеним сервері.
Збирається, дивно!
Res
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.