apk-builder/build.sh

154 lines
5.6 KiB
Bash
Executable file
Raw 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() {
echo "✏️ Использование: $0 -n <имя> -v <версия> -d <версия_docker> -b <версия_базового_образа> [-r <адрес_registry>] [-p <порт>]"
echo "🔧 Опции:"
echo " -n, --name Имя образа (обязательно)"
echo " -v, --version Версия образа в формате X.Y.Z (обязательно)"
echo " -d, --docker-version Версия Docker для сборки (обязательно)"
echo " -b, --base-image-version Версия базового образа (обязательно)"
echo " -r, --push-to-registry Адрес registry для отправки образов (например, registry.example.com)"
echo " -p, --port Порт registry (по умолчанию 5000)"
echo ""
echo "📌 Примеры:"
echo " Только сборка: $0 -n myapp -v 2.5.7 -d 20.10 -b 3.8"
echo " Сборка и отправка: $0 -n myapp -v 2.5.7 -d 20.10 -b 3.8 -r registry.example.com"
echo " Сборка и отправка с другим портом: $0 -n myapp -v 2.5.7 -d 20.10 -b 3.8 -r registry.example.com -p 8080"
exit 1
}
validate_version() {
echo "$1" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$' || {
echo "❌ Ошибка: Версия должна быть в формате X.Y.Z (например, 2.5.7)"
exit 1
}
}
validate_address() {
if [ -z "$1" ]; then
echo "❌ Ошибка: Адрес registry не может быть пустым"
exit 1
}
}
validate_port() {
if [ -n "$1" ]; then
echo "$1" | grep -Eq '^[0-9]+$' || {
echo "❌ Ошибка: Порт должен быть числом"
exit 1
}
fi
}
check_dockerfile() {
if [ ! -f "Dockerfile.$1" ]; then
echo "❌ Ошибка: Файл Dockerfile.$1 не найден в директории docker"
exit 1
fi
}
push_to_registry=false
name=""
version=""
docker_version=""
base_image_version=""
registry_address=""
port="5000"
while getopts ":n:v:d:b:p:r:" opt; do
case $opt in
n) name="$OPTARG" ;;
v) version="$OPTARG" ;;
d) docker_version="$OPTARG" ;;
b) base_image_version="$OPTARG" ;;
p) port="$OPTARG" ;;
r) push_to_registry=true; registry_address="$OPTARG" ;;
\?) echo "❌ Неверный аргумент -$OPTARG" >&2; usage ;;
:) echo "❌ Опция -$OPTARG требует аргумент" >&2; usage ;;
esac
done
if [ -z "$name" ] || [ -z "$version" ] || [ -z "$docker_version" ] || [ -z "$base_image_version" ]; then
echo "❌ Ошибка: Не указаны обязательные аргументы (-n, -v, -d и -b)"
usage
fi
validate_version "$version"
if [ "$push_to_registry" = true ]; then
if [ -z "$registry_address" ]; then
echo "❌ Ошибка: Для отправки в registry необходимо указать адрес с -r"
usage
fi
validate_address "$registry_address"
validate_port "$port"
fi
echo "📂 Переход в директорию docker..."
cd docker || {
echo "❌ Ошибка: Не удалось перейти в директорию docker"
exit 1
}
echo "🔍 Проверка наличия Dockerfile..."
check_dockerfile "$docker_version"
echo "🐳 Сборка образа $name:$version с использованием Dockerfile.$docker_version и базового образа версии $base_image_version..."
docker build . -f "Dockerfile.$docker_version" -t "${name}:${version}" --build-arg BASE_IMAGE_VERSION="$base_image_version" || {
echo "❌ Ошибка при сборке образа"
exit 1
}
if [ "$push_to_registry" = true ]; then
registry="$registry_address:$port"
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"