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