#!/bin/sh # Функция для вывода справки usage() { echo "Использование: $0 -p <путь_к_APKBUILD> [-s -n ] [-r <приватный_ключ> -u <публичный_ключ>] [-d <путь_к_репозиторию>]" echo "Параметры:" echo " -p <путь_к_APKBUILD> Путь к директории с APKBUILD (обязательный)" echo " -s IP или имя NFS-сервера (опционально)" echo " -n Путь к NFS-ресурсу (опционально, требуется с -s)" echo " -r <приватный_ключ> Содержимое файла приватного ключа (опционально)" echo " -u <публичный_ключ> Содержимое файла публичного ключа (опционально)" echo " -d <путь_к_репозиторию> Путь к директории репозитория в ~/packages (опционально)" echo "Пример: $0 -p /package -s 192.168.1.100 -n /nfs/share -r \"<содержимое_ключа.rsa>\" -u \"<содержимое_ключа.rsa.pub>\" -d /repo" echo "Флаги -s и -n включают монтирование NFS, должны использоваться вместе." echo "Флаги -r и -u содержат текст приватного и публичного ключей для abuild." echo "Флаг -d задаёт директорию для сохранения пакетов." exit 1 } # Устанавливаем стандартные значения из переменных окружения или аргументов сборки : "${PACKAGE_DIR:=/package}" : "${NFS_SERVER:=}" : "${NFS_PATH:=}" : "${PRIVATE_KEY:=}" : "${PUBLIC_KEY:=}" : "${REPODEST_DIR:=}" PACKAGES_DIR="/home/builder/packages" NFS_ENABLED=0 # Обработка флагов while [ $# -gt 0 ]; do case "$1" in -p) PACKAGE_DIR="$2"; shift 2 ;; -s) NFS_SERVER="$2"; shift 2 ;; -n) NFS_PATH="$2"; shift 2 ;; -r) PRIVATE_KEY="$2"; shift 2 ;; -u) PUBLIC_KEY="$2"; shift 2 ;; -d) REPODEST_DIR="$2"; shift 2 ;; *) echo "🚫 Ошибка: Неизвестный флаг $1"; usage ;; esac done # Проверка наличия обязательного аргумента -p if [ -z "$PACKAGE_DIR" ]; then echo "🚫 Ошибка: Не указан обязательный параметр -p" usage fi # Проверка, что если указан один из -s или -n, то указан и другой if [ -n "$NFS_SERVER" ] && [ -z "$NFS_PATH" ] || [ -z "$NFS_SERVER" ] && [ -n "$NFS_PATH" ]; then echo "🚫 Ошибка: Флаги -s и -n должны быть указаны вместе" usage fi # Устанавливаем флаг NFS_ENABLED, если указаны оба флага -s и -n if [ -n "$NFS_SERVER" ] && [ -n "$NFS_PATH" ]; then NFS_ENABLED=1 fi # Проверка существования директории с APKBUILD if [ ! -d "$PACKAGE_DIR" ]; then echo "🚫 Ошибка: Директория $PACKAGE_DIR не существует" exit 1 fi # Проверка наличия APKBUILD if [ ! -f "$PACKAGE_DIR/APKBUILD" ]; then echo "🚫 Ошибка: Файл APKBUILD не найден в $PACKAGE_DIR" exit 1 fi # Проверка и настройка ключей abuild if [ -n "$PRIVATE_KEY" ] || [ -n "$PUBLIC_KEY" ]; then echo "🔑 Настраиваю переданные ключи abuild..." # Проверяем, что переданы все три компонента if [ -z "$PRIVATE_KEY" ] || [ -z "$PUBLIC_KEY" ]; then echo "🚫 Ошибка: Для использования ключей нужны все флаги: -r, -u" exit 1 fi # Создаем директорию .abuild mkdir -p /home/builder/.abuild # Записываем abuild.conf echo 'PACKAGER_PRIVKEY="/home/builder/.abuild/packager.rsa"' > /home/builder/.abuild/abuild.conf if [ $? -ne 0 ]; then echo "🚫 Ошибка при записи abuild.conf" exit 1 fi # Записываем приватный ключ echo "$PRIVATE_KEY" > /home/builder/.abuild/packager.rsa if [ $? -ne 0 ]; then echo "🚫 Ошибка при записи приватного ключа" exit 1 fi # Записываем публичный ключ echo "$PUBLIC_KEY" > /home/builder/.abuild/packager.rsa.pub if [ $? -ne 0 ]; then echo "🚫 Ошибка при записи публичного ключа" exit 1 fi # Устанавливаем права доступа chmod 600 /home/builder/.abuild/packager.rsa chmod 644 /home/builder/.abuild/packager.rsa.pub /home/builder/.abuild/abuild.conf echo "✅ Ключи abuild успешно настроены" else # Если ключи не переданы, проверяем существующие или генерируем новые if [ ! -f "/home/builder/.abuild/abuild.conf" ]; then echo "🔑 Генерирую новые ключи для abuild..." abuild-keygen -a -i -n if [ $? -ne 0 ]; then echo "🚫 Ошибка при генерации ключей abuild" exit 1 fi echo "✅ Ключи abuild сгенерированы" else echo "✅ Использую существующие ключи abuild" fi fi cat /home/builder/.abuild/*.rsa.pub cat /home/builder/.abuild/*.rsa cat /home/builder/.abuild/abuild.conf # Копирование ключа для apk менеджера sudo cp -v /home/builder/.abuild/*.rsa.pub /etc/apk/keys/ # Монтируем NFS-ресурс, если включен if [ "$NFS_ENABLED" -eq 1 ]; then echo "🔌 Монтирую NFS-ресурс $NFS_SERVER:$NFS_PATH в $PACKAGES_DIR..." sudo mkdir -p "$PACKAGES_DIR" sudo mount -t nfs "$NFS_SERVER:$NFS_PATH" "$PACKAGES_DIR" if [ $? -ne 0 ]; then echo "🚫 Ошибка при монтировании NFS-ресурса" exit 1 fi echo "✅ NFS-ресурс успешно смонтирован" else echo "ℹ️ NFS не указан, пакеты будут сохранены локально в $PACKAGES_DIR" mkdir -p "$PACKAGES_DIR" fi # Копируем содержимое директории в рабочую директорию echo "📂 Копирую файлы проекта в рабочую директорию..." cp -r "$PACKAGE_DIR"/* /home/builder/package/ if [ $? -ne 0 ]; then echo "🚫 Ошибка при копировании файлов проекта" if [ "$NFS_ENABLED" -eq 1 ]; then sudo umount "$PACKAGES_DIR" fi exit 1 fi echo "✅ Файлы успешно скопированы" # Переходим в директорию пакета cd /home/builder/package || { echo "🚫 Ошибка: Не удалось перейти в директорию /home/builder/package" if [ "$NFS_ENABLED" -eq 1 ]; then sudo umount "$PACKAGES_DIR" fi exit 1 } echo "✅ Перешел в директорию проекта" # Проверяем зависимости и собираем пакет echo "🔨 Проверяю зависимости и собираю APK-пакет..." # Устанавливаем флаг NFS_ENABLED, если указаны оба флага -s и -n if [ -n "$REPODEST_DIR" ]; then REPODEST_DIR=$(echo "${REPODEST_DIR}" | sed 's|^./||;s|^/||') fi REPODEST="$PACKAGES_DIR/${REPODEST_DIR:=v$(cat /etc/alpine-release | awk -F. '{print $1"."$2}')}" abuild -r if [ $? -ne 0 ]; then echo "🚫 Ошибка при сборке APK-пакета" if [ "$NFS_ENABLED" -eq 1 ]; then sudo umount "$PACKAGES_DIR" fi exit 1 fi echo "✅ Сборка APK-пакета успешно завершена" # Размонтируем NFS, если использовался if [ "$NFS_ENABLED" -eq 1 ]; then sudo umount "$PACKAGES_DIR" if [ $? -ne 0 ]; then echo "🚫 Ошибка при размонтировании NFS-ресурса" exit 1 fi echo "✅ NFS-ресурс размонтирован" echo "🎉 Сборка завершена, пакеты сохранены в $NFS_SERVER:$NFS_PATH" else echo "🎉 Сборка завершена, пакеты сохранены локально в $PACKAGES_DIR" fi