apk-builder/build.sh
2025-04-29 04:01:20 +03:00

188 lines
6.6 KiB
Bash
Executable file
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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() {
local exit_code="$1"
echo "✏️ Использование: $0 -n <имя> -v <версия> -b <версия_базового_образа> [-o] [-R <репозитории>] [-r <адрес_registry>] [-p <порт>] [-h]"
echo "🔧 Опции:"
echo " -n, --name Имя собираемого образа (обязательно)"
echo " -v, --version Версия собираемого образа в формате X.Y.Z (обязательно)"
echo " -b, --base-image-version Версия базового образа Alpine Linux (обязательно)"
echo " -o, --old Использовать метод сборки для устаревшей версии Docker"
echo " -R, --repositories Список репозиториев для сборки (через точку с запятой)"
echo " -r, --push-to-registry Адрес registry для отправки образов"
echo " -p, --port Порт registry"
echo " -h, --help Показать эту справку"
exit "$exit_code"
}
validate_version() {
echo "$1" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$' || {
echo "❌ Ошибка: Версия должна быть в формате X.Y.Z (например, 2.5.7)"
usage 1
}
}
validate_address() {
if [ -z "$1" ]; then
echo "❌ Ошибка: Адрес registry не может быть пустым"
usage 1
fi
}
validate_port() {
if [ -n "$1" ]; then
echo "$1" | grep -Eq '^[0-9]+$' || {
echo "❌ Ошибка: Порт должен быть числом"
usage 1
}
fi
}
check_dockerfile() {
if [ ! -f "$1" ]; then
echo "❌ Ошибка: Файл $1 не найден в директории docker"
usage 1
fi
}
push_to_registry=false
name=""
version=""
base_image_version=""
registry_address=""
port=""
use_old=false
dockerfile="Dockerfile.27.3.1"
repositories=""
if ! command -v getopt >/dev/null 2>&1; then
echo "❌ Ошибка: утилита getopt не найдена"
usage 1
fi
opts=$(getopt -o n:v:b:oR:r:p:h -l name:,version:,base-image-version:,old,repositories:,push-to-registry:,port:,help -n "$0" -- "$@")
if [ $? -ne 0 ]; then
echo "❌ Ошибка парсинга аргументов"
usage 1
fi
eval set -- "$opts"
while true; do
case "$1" in
-n|--name) name="$2"; shift 2 ;;
-v|--version) version="$2"; shift 2 ;;
-b|--base-image-version) base_image_version="$2"; shift 2 ;;
-r|--push-to-registry) push_to_registry=true; registry_address="$2"; shift 2 ;;
-p|--port) port="$2"; shift 2 ;;
-o|--old) use_old=true; shift ;;
-R|--repositories) repositories="$2"; shift 2 ;;
-h|--help) usage 0 ;;
--) shift; break ;;
*) echo "❌ Неверный аргумент $1" >&2; usage 1 ;;
esac
done
if [ -z "$name" ] || [ -z "$version" ] || [ -z "$base_image_version" ]; then
echo "❌ Ошибка: Не указаны обязательные аргументы (-n, -v и -b)"
usage 1
fi
validate_version "$version"
if [ "$push_to_registry" = true ]; then
if [ -z "$registry_address" ]; then
echo "❌ Ошибка: Для отправки в registry необходимо указать адрес с -r"
usage 1
fi
validate_address "$registry_address"
validate_port "$port"
fi
echo "📂 Переход в директорию docker..."
cd docker || {
echo "❌ Ошибка: Не удалось перейти в директорию docker"
exit 1
}
if [ "$use_old" = true ]; then
dockerfile="Dockerfile.20.10.20"
fi
echo "🔍 Проверка наличия Dockerfile..."
check_dockerfile "$dockerfile"
echo "🐳 Сборка образа $name:$version с использованием $dockerfile и базового образа версии $base_image_version..."
if [ -n "$repositories" ]; then
echo "📦 Используемые репозитории:"
echo "$repositories" | tr ';' '\n' | while read -r repo; do
echo -e " 🌐 $repo"
done
docker build . -f "$dockerfile" -t "${name}:${version}" --build-arg BASE_IMAGE_VERSION="$base_image_version" --build-arg REPOSITORIES="$repositories" || {
echo "❌ Ошибка при сборке образа"
exit 1
}
else
docker build . -f "$dockerfile" -t "${name}:${version}" --build-arg BASE_IMAGE_VERSION="$base_image_version" || {
echo "❌ Ошибка при сборке образа"
exit 1
}
fi
if [ "$push_to_registry" = true ]; then
if [ -z "$port" ]; then
registry="$registry_address"
else
registry="$registry_address:$port"
fi
echo "🏷 Создание тегов для registry..."
docker tag "${name}:${version}" "${registry}/${name}:latest" || {
echo "❌ Ошибка при создании тега latest"
exit 1
}
major=$(echo "$version" | cut -d. -f1)
minor=$(echo "$version" | cut -d. -f1-2)
full="$version"
docker tag "${name}:${version}" "${registry}/${name}:$full" || {
echo "❌ Ошибка при создании тега $full"
exit 1
}
docker tag "${name}:${version}" "${registry}/${name}:$minor" || {
echo "❌ Ошибка при создании тега $minor"
exit 1
}
docker tag "${name}:${version}" "${registry}/${name}:$major" || {
echo "❌ Ошибка при создании тега $major"
exit 1
}
echo " ✅ Созданы теги: latest, $full, $minor, $major"
echo "🚀 Отправка образов в registry..."
docker push "${registry}/${name}:latest" || {
echo "❌ Ошибка при отправке тега latest"
exit 1
}
docker push "${registry}/${name}:$full" || {
echo "❌ Ошибка при отправке тега $full"
exit 1
}
docker push "${registry}/${name}:$minor" || {
echo "❌ Ошибка при отправке тега $minor"
exit 1
}
docker push "${registry}/${name}:$major" || {
echo "❌ Ошибка при отправке тега $major"
exit 1
}
fi
echo "🎉 Готово! Образ ${name}:${version} успешно:"
echo " ✅ Собран"
[ "$push_to_registry" = true ] && echo " ✅ Размечен"
[ "$push_to_registry" = true ] && echo " ✅ Отправлен в registry"