Промежуточный стабильный вариант

This commit is contained in:
Alexander Zhirov 2025-04-28 11:14:51 +03:00
parent ab7a65969e
commit 92ff34dbf3
5 changed files with 111 additions and 46 deletions

67
build.sh Normal file → Executable file
View file

@ -1,17 +1,19 @@
#!/bin/sh
usage() {
echo "✏️ Использование: $0 -n <имя> -v <версия> [-a <адрес>] [-p <порт>] [-r]"
echo "✏️ Использование: $0 -n <имя> -v <версия> -d <версия_docker> -b <версия_базового_образа> [-r <адрес_registry>] [-p <порт>]"
echo "🔧 Опции:"
echo " -n, --name Имя образа (обязательно)"
echo " -v, --version Версия образа в формате X.Y.Z (обязательно)"
echo " -a, --address Адрес registry (требуется с -r)"
echo " -p, --port Порт registry (опционально)"
echo " -r, --push-to-registry Создать теги и отправить образы в registry"
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"
echo " Сборка и отправка: $0 -n myapp -v 2.5.7 -a registry.example.com -p 5000 -r"
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
}
@ -24,9 +26,9 @@ validate_version() {
validate_address() {
if [ -z "$1" ]; then
echo "❌ Ошибка: Адрес не может быть пустым"
echo "❌ Ошибка: Адрес registry не может быть пустым"
exit 1
fi
}
}
validate_port() {
@ -38,53 +40,68 @@ validate_port() {
fi
}
check_dockerfile() {
if [ ! -f "Dockerfile.$1" ]; then
echo "❌ Ошибка: Файл Dockerfile.$1 не найден в директории docker"
exit 1
fi
}
push_to_registry=false
name=""
version=""
address=""
port=""
docker_version=""
base_image_version=""
registry_address=""
port="5000"
while getopts ":n:v:a:p:r" opt; do
while getopts ":n:v:d:b:p:r:" opt; do
case $opt in
n) name="$OPTARG" ;;
v) version="$OPTARG" ;;
a) address="$OPTARG" ;;
d) docker_version="$OPTARG" ;;
b) base_image_version="$OPTARG" ;;
p) port="$OPTARG" ;;
r) push_to_registry=true ;;
r) push_to_registry=true; registry_address="$OPTARG" ;;
\?) echo "❌ Неверный аргумент -$OPTARG" >&2; usage ;;
:) echo "❌ Опция -$OPTARG требует аргумент" >&2; usage ;;
esac
done
if [ -z "$name" ] || [ -z "$version" ]; then
echo "❌ Ошибка: Не указаны обязательные аргументы (-n и -v)"
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 "$address" ]; then
echo "❌ Ошибка: Для отправки в registry необходимо указать адрес (-a)"
if [ -z "$registry_address" ]; then
echo "❌ Ошибка: Для отправки в registry необходимо указать адрес с -r"
usage
fi
validate_address "$address"
validate_address "$registry_address"
validate_port "$port"
fi
echo "🐳 Сборка образа $name:$version..."
docker build . -t "${name}:${version}" || {
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
if [ -z "$port" ]; then
registry="$address"
else
registry="$address:$port"
fi
registry="$registry_address:$port"
echo "🏷 Создание тегов для registry..."