init
This commit is contained in:
		
						commit
						72901d7978
					
				
					 4 changed files with 281 additions and 0 deletions
				
			
		
							
								
								
									
										3
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					# apk-builder
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Образ сборщика APK-файлов для Alpine Linux.
 | 
				
			||||||
							
								
								
									
										193
									
								
								apk-build
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								apk-build
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,193 @@
 | 
				
			||||||
 | 
					#!/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
 | 
				
			||||||
							
								
								
									
										42
									
								
								v.3.21/Dockerfile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								v.3.21/Dockerfile
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,42 @@
 | 
				
			||||||
 | 
					FROM alpine:3.16.9
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Метаданные для CI/CD
 | 
				
			||||||
 | 
					LABEL maintainer="Alexander Zhirov <alexander@zhirov.kz>"
 | 
				
			||||||
 | 
					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 <<EOF
 | 
				
			||||||
 | 
					    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 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"]
 | 
				
			||||||
							
								
								
									
										43
									
								
								v3.16/Dockerfile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								v3.16/Dockerfile
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,43 @@
 | 
				
			||||||
 | 
					FROM alpine:3.16.9
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Метаданные для CI/CD
 | 
				
			||||||
 | 
					LABEL maintainer="Alexander Zhirov <alexander@zhirov.kz>"
 | 
				
			||||||
 | 
					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"]
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue