Сервер сборки F-Droid изолирует сборки для каждого пакета в чистой, изолированной и безопасной среде виртуальной машины. Сборка тысяч приложений, особенно с использованием автоматизированных и/или необслуживаемых процессов, может считаться опасным занятием с точки зрения безопасности. Это тем более актуально, когда продукты сборки также распространяются широко и полуавтоматически (“у вас есть доступные обновления”).
Предположим, что репозиторий исходных кодов восходящего потока скомпрометирован. Небольшая подборка действий, которые может предпринять злоумышленник в такой ситуации:
- Используйте пользовательские шаги сборки для выполнения практически любых действий в роли пользователя, выполняющего сборку.
- Получите доступ к хранилищу ключей.
- Изменяйте собранные файлы APK или исходные tarball’ы для других приложений в репозитории.
- Изменяйте метаданные (которые включают сценарии сборки, что, опять же, также включает возможность выполнения чего угодно) для других приложений в репозитории.
Благодаря полной изоляции последствия, по крайней мере, ограничены данным приложением. Среда сборки не только является свежей для каждой сборки и выбрасывается после нее, но и полностью изолирована от среды подписания.
Помимо вопросов безопасности, есть некоторые приложения, которые имеют странные требования, например, старые версии NDK. Было бы непрактично (или, по крайней мере, очень грязно) начинать модифицировать и восстанавливать SDK в многоцелевой системе, но в пределах одноразовой виртуальной машины все возможно.
Все это в дополнение к очевидному преимуществу наличия стандартизированной и полностью воспроизводимой среды, в которой производятся сборки. Кроме того, это позволяет создавать специализированные пользовательские среды сборки для конкретных приложений.
Обзор установки
Здесь описано, как установить рабочий сервер сборки, начиная с полностью
чистой минимальной установки Debian/stable. Этот HOWTO предполагает, что вы
уже установили
fdroidserver. Запуск
инструментов fdroidserver непосредственно из
git (например,
~/fdroidserver/fdroid build org.adaway), вероятно, будет самым простым на
данный момент, поскольку скрипты настройки сервера сборки еще не готовы для
правильной упаковки. Также, скорее всего, он будет работать только на
Debian, Ubuntu и других производных Debian, поскольку F-Droid использует
только Debian в своей инфраструктуре (мы приветствуем вклад в перенос!).
Базовым сервером должен быть как минимум Debian/trixie, иначе потребуется серьезная доработка. Если вы используете Ubuntu или производный дистрибутив, вы можете получить все пакеты, отсутствующие в вашей версии, например, vagrant-cachier, из этого PPA: https://launchpad.net/~fdroid/+archive/ubuntu/buildserver/
Сначала установите необходимые пакеты и создайте нового пользователя для запуска всего процесса здесь, например fdroid. Это только те пакеты, которые требуются для всех сборок, для сборки приложений вам может понадобиться установить дополнительные пакеты, например, mercurial или subversion. После установки пакетов и создания пользователя fdroid больше ничего в этом процессе не должно запускаться с правами root или sudo.
root:~# apt-get install vagrant git python3-certifi \
python3-libvirt python3-requestbuilder python3-yaml \
python3-progress python3-vagrant python3-paramiko python3-pyasn1 \
python3-pyasn1-modules python3-requests python3-git
vagrant-mutate vagrant-libvirt ebtables dnsmasq-base \
libvirt-clients libvirt-daemon-system qemu-kvm qemu-utils
root:~# adduser --disabled-password fdroid
root:~# su fdroid
Клонируйте исходный код, запущенный под пользователем fdroid:
fdroid:~$ cd ~
fdroid:~$ git clone https://gitlab.com/fdroid/fdroidserver.git
Вы также должны убедиться, что ваша переменная окружения ANDROID_HOME
правильно
настроена.
Для удобства вы можете добавить исполняемый файл fdroid в свой путь:
fdroid:~$ echo "PATH=\$PATH:$HOME/fdroidserver" >> ~/.bashrc
Получите все метаданные сборки приложения из репозитория fdroiddata…
fdroid:~/fdroidserver$ cd ~
fdroid:~$ git clone https://gitlab.com/fdroid/fdroiddata.git
fdroid:~$ cp fdroidserver/examples/config.yml fdroiddata/
fdroid:~$ sed -i "s@^[# ]*build_server_always.*@build_server_always: true@" fdroiddata/config.yml
Настройка сервера сборки
В дополнение к базовой установке, описанной ранее, мы поставляем совместимый с Vagrant базовый блок Debian/bullseye под названием ‘fdroid/bullseye64’.
Мы загружаем коробки Debian Vagrant для нашего сервера сборки с нуля. Получение и проверка наших предварительно собранных Vagrant-боксов полностью автоматизированы. (Если вам интересен этот процесс или вы хотите самостоятельно установить эти коробки, вам стоит посмотреть на: F-Droid Base Box)
Создание блока сервера сборки F-Droid
Создайте файл конфигурации для Vagrant в формате
~/fdroidserver/buildserver/Vagrantfile.yaml, который содержит:
vm_provider: libvirt
Затем базовый образ buildserver… (загрузка basebox и всех sdk-платформ может занять много времени).
fdroid:~$ cd fdroidserver
fdroid:~/fdroidserver$ ./makebuildserver --verbose
Это займет много времени, потребует много пропускной способности и дискового пространства - большая часть его будет потрачена на установку необходимых частей Android SDK для всех различных платформ. К счастью, вам придется делать это лишь время от времени. Как только у вас будет рабочий образ сервера сборки, если рецепты изменятся (например, когда нужно будет добавить пакеты), вы можете просто запустить этот скрипт снова, и существующий будет обновлен на месте.
После его завершения у вас появится новый базовый блок под названием
‘buildserver’, который будет использоваться для сборки приложений. Теперь вы
можете собирать пакеты, как и раньше, но при запуске fdroid build --verbose
--server ... запуски сборки приложений будут изолированы внутри виртуальной
машины.
Хотя созданный образ имеет ограниченное количество процессорных ядер и
памяти, вы можете отредактировать ~/fdroiddata/builder/Vagrantfile, чтобы
динамически изменять их во время выполнения, например, libvirt.cpus = 6 и
libvirt.memory = 12288, но следите за тем, чтобы не превышать лимиты
хост-машин, иначе ВМ может быть убита.
При первой сборке создается новая виртуальная машина с использованием блока
‘buildserver’ в качестве основы. Снимок состояния этой чистой машины
сохраняется для использования в будущих сборках, чтобы повысить
производительность. Вы можете принудительно отбросить этот снимок и собрать
все с нуля с помощью переключателя: fdroid build --resetserver ....
настройки кэширования makebuildserver (необязательно)
Основные загрузки SDK/NDK будут автоматически кэшироваться, чтобы ускорить
работу в следующий раз, но нет простого способа сделать это для более
длинных разделов, которые используют инструмент SDK android для установки
платформ, дополнений и инструментов. Однако вместо того, чтобы разрешить
автоматическое кэширование, вы можете предоставить предварительно
заполненный каталог кэша, который включает не только эти загрузки, но и
файлы .tar.gz для всех соответствующих дополнений. Если сценарии
инициализации обнаружат их, они будут использоваться вместо запуска
инструментов Android. Например, если у вас есть
buildserver/addons/cache/platforms/android-19.tar.gz, он будет
использоваться при установке платформы android-19, вместо того чтобы
повторно загружать ее с помощью android update sdk --no-ui -t
android-19. Можно создать кэш-файлы этого дополнения из локальной установки
SDK, включая эти:
cd /путь/к/android-sdk/platforms
tar czf android-19.tar.gz android-19
mv android-19.tar.gz /путь/к/buildserver/addons/cache/platforms/
Если вы уже создали сервер сборки, можно также получить эти файлы непосредственно с сервера сборки:
vagrant ssh -- -C 'tar -C ~/android-sdk/platforms czf android-19.tar.gz android-19'
vagrant ssh -- -C 'cat ~/android-sdk/platforms/android-19.tar.gz' > /путь/к/fdroidserver/buildserver/cache/platforms/android19.tar.gz
Выполнение сборки
При использовании buildserver запуск fdroid непосредственно из git
checkout fdroidserver будет самым простым. Если у вас еще не установлены
и не настроены инструменты fdroidserver, вам нужно сделать это следующим
образом: Установка сервера и инструментов
репо. Это обеспечивает все
зависимости, необходимые для запуска fdroidserver из git.
Теперь вы готовы к запуску сборок. Протестируйте сборку последней версии fdroid:
fdroid:~/fdroidserver$ cd ~/fdroiddata
fdroid:~/fdroiddata$ ~/fdroidserver/fdroid build org.fdroid.fdroid -l --server
Настройка QEMU/KVM/libvirt
Хотя в прошлом использовался VirtualBox, гостевые виртуальные машины
QEMU/KVM через libvirt по-прежнему рекомендуются, поскольку именно они
используются на f-droid.org. Чтобы файлы образов libvirt могли напрямую
читаться vagrant package, QEMU libvirt должен быть настроен так, чтобы
всегда устанавливать право собственности на libvirt.libvirt.
root:~# cat << EOF >> /etc/libvirt/qemu.conf
user = "libvirt"
group = "libvirt"
dynamic_ownership = 1
EOF
root:~# service libvirtd restart
Debian/bullseye и Ubuntu/xenial
root:~# adduser fdroid libvirt
root:~# adduser fdroid libvirt-qemu
старые версии Debian и Ubuntu
root:~# adduser fdroid libvirtd
root:~# adduser fdroid kvm
Расширенная настройка KVM:
Этот раздел не относится к использованию F-Droid в обычной установке. Если
вы хотите запустить fdroid build --server флаг внутри KVM, этот шаблон
поможет вам начать работу.
Рассмотрим следующую базовую схему установки:
настоящая железная хост-система (l0)
\- виртуальная машина F-Droid (l1)
\- виртуальная машина сборки F-Droid (l2)
Вышеописанные шаги описывают настройку (l1), а makebuildserver - настройку (l2).
Прежде всего, вам нужно проверить, поддерживает ли ваш процессор набор инструкций vmx (или svm на amd). Вы можете использовать эту команду для получения подробной информации о вашем процессоре:
root:~# cat /proc/cpuinfo
На (l0) вы должны проверить, что вложенность включена:
root:~# cat /sys/module/kvm_intel/parameters/nested
Если он не включен, вы можете включить его, выполнив команду:
echo "options kvm-intel nested=Y" > /etc/modprobe.d/kvm-intel.conf
Чтобы это вступило в силу, необходимо перезагрузиться.
Далее вам нужно убедиться, что ваша конфигурация (l1) виртуальной машины направляет функции cpu, необходимые для вложенности. Поэтому откройте конфигурацию виртуальной машины /etc/libvirt/qemu/my-vm.xml и вставьте блок cpu в тег домена. (virt-manager также предоставляет пользовательский интерфейс для этой операции)
<cpu mode='custom' match='exact'>
<model fallback='allow'>SandyBridge</model>
<vendor>Intel</vendor>
<feature policy='require' name='vmx'/>
</cpu>
Фактически требуемая конфигурация здесь зависит от вашего процессора. Подробности можно найти в libvirts manual. Важной частью является то, что вы пересылаете vmx (или svm на amd) в гостевую систему.
