apk-builder/apk-build
2025-04-26 02:06:52 +03:00

193 lines
8.5 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/sh
# Функция для вывода справки
usage() {
echo "Использование: $0 -p <путь_к_APKBUILD> [-s <NFS_сервер> -n <NFS_путь>] [-r <приватный_ключ> -u <публичный_ключ>] [-d <путь_к_репозиторию>]"
echo "Параметры:"
echo " -p <путь_к_APKBUILD> Путь к директории с APKBUILD (обязательный)"
echo " -s <NFS_сервер> IP или имя NFS-сервера (опционально)"
echo " -n <NFS_путь> Путь к 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