From 72901d7978e971a105b0e76f1e6a8d569b29b6bf Mon Sep 17 00:00:00 2001 From: Alexander Zhirov Date: Sat, 26 Apr 2025 02:06:52 +0300 Subject: [PATCH] init --- README.md | 3 + apk-build | 193 ++++++++++++++++++++++++++++++++++++++++++++++ v.3.21/Dockerfile | 42 ++++++++++ v3.16/Dockerfile | 43 +++++++++++ 4 files changed, 281 insertions(+) create mode 100644 README.md create mode 100644 apk-build create mode 100644 v.3.21/Dockerfile create mode 100644 v3.16/Dockerfile diff --git a/README.md b/README.md new file mode 100644 index 0000000..6616e37 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# apk-builder + +Образ сборщика APK-файлов для Alpine Linux. diff --git a/apk-build b/apk-build new file mode 100644 index 0000000..673a17e --- /dev/null +++ b/apk-build @@ -0,0 +1,193 @@ +#!/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 diff --git a/v.3.21/Dockerfile b/v.3.21/Dockerfile new file mode 100644 index 0000000..2aee809 --- /dev/null +++ b/v.3.21/Dockerfile @@ -0,0 +1,42 @@ +FROM alpine:3.16.9 + +# Метаданные для CI/CD +LABEL maintainer="Alexander Zhirov " +LABEL version="0.1.0" +LABEL description="Адаптированный для Docker >=27.3.1 образ сборщика APK-файлов для Alpine Linux 3.16.9" + +# Задаем стандартные значения через переменные окружения +ENV USER=builder \ + PACKAGE_DIR=/package \ + NFS_SERVER= \ + NFS_PATH= \ + PRIVATE_KEY= \ + PUBLIC_KEY= \ + REPODEST_DIR= + +# Копируем скрипт запуска в контейнер +COPY --chmod=0755 ../apk-build /usr/bin/apk-build + +# Устанавливаем необходимые пакеты для сборки APK и NFS +RUN < /etc/apk/repositories + echo "http://mirror.yandex.ru/mirrors/alpine/v3.16/community" >> /etc/apk/repositories + apk update + apk upgrade --no-cache + apk add --no-cache alpine-sdk abuild sudo git nfs-utils + adduser -D builder + addgroup builder abuild + echo "builder ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/builder +EOF + +# Переключаемся на пользователя builder +USER builder + +# Создаем рабочую директорию +WORKDIR /home/builder/package + +# Указываем точку входа для CI/CD +ENTRYPOINT ["/usr/bin/apk-build"] + +# Указываем команду по умолчанию с переменными окружения +CMD ["-p", "/package"] diff --git a/v3.16/Dockerfile b/v3.16/Dockerfile new file mode 100644 index 0000000..c5a46b9 --- /dev/null +++ b/v3.16/Dockerfile @@ -0,0 +1,43 @@ +FROM alpine:3.16.9 + +# Метаданные для CI/CD +LABEL maintainer="Alexander Zhirov " +LABEL version="0.1.0" +LABEL description="Адаптированный для Docker <=20.10.20 образ сборщика APK-файлов для Alpine Linux 3.16.9" + +# Задаем стандартные значения через переменные окружения +ENV USER=builder \ + PACKAGE_DIR=/package \ + NFS_SERVER= \ + NFS_PATH= \ + PRIVATE_KEY= \ + PUBLIC_KEY= \ + REPODEST_DIR= + +# Копируем скрипт запуска в контейнер +COPY ../apk-build /usr/bin/apk-build + +# Устанавливаем необходимые пакеты для сборки APK и NFS +RUN echo "http://mirror.yandex.ru/mirrors/alpine/v3.16/main" > /etc/apk/repositories && \ + echo "http://mirror.yandex.ru/mirrors/alpine/v3.16/community" >> /etc/apk/repositories && \ + apk update && \ + apk upgrade --no-cache && \ + apk add --no-cache build-base alpine-sdk abuild sudo git nfs-utils && \ + adduser -D builder && \ + addgroup builder abuild && \ + echo "builder ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/builder && \ + chmod 0755 /usr/bin/apk-build && \ + mkdir /home/builder/package && \ + chown builder:builder /home/builder/package + +# Переключаемся на пользователя builder +USER builder + +# Создаем рабочую директорию +WORKDIR /home/builder/package + +# Указываем точку входа для CI/CD +ENTRYPOINT ["/usr/bin/apk-build"] + +# Указываем команду по умолчанию с переменными окружения +CMD ["-p", "/package"]