Привел в порядок

This commit is contained in:
Alexander Zhirov 2025-04-29 01:00:20 +03:00
parent 92ff34dbf3
commit a6734d8fdd
6 changed files with 395 additions and 315 deletions

114
build.sh
View file

@ -1,76 +1,91 @@
#!/bin/sh
usage() {
echo "✏️ Использование: $0 -n <имя> -v <версия> -d <версия_docker> -b <версия_базового_образа> [-r <адрес_registry>] [-p <порт>]"
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 " -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
echo " -n, --name Имя собираемого образа (обязательно)"
echo " -v, --version Версия собираемого образа в формате X.Y.Z (обязательно)"
echo " -b, --base-image-version Версия базового образа (обязательно)"
echo " -o, --old Использовать Dockerfile.20.10.20 (по умолчанию Dockerfile.27.3.1)"
echo " -R, --repositories Список репозиториев для сборки (через точку с запятой)"
echo " -r, --push-to-registry Адрес registry для отправки образов (например, registry.example.com)"
echo " -p, --port Порт registry (по умолчанию 5000)"
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)"
exit 1
usage 1
}
}
validate_address() {
if [ -z "$1" ]; then
echo "❌ Ошибка: Адрес registry не может быть пустым"
exit 1
}
usage 1
fi
}
validate_port() {
if [ -n "$1" ]; then
echo "$1" | grep -Eq '^[0-9]+$' || {
echo "❌ Ошибка: Порт должен быть числом"
exit 1
usage 1
}
fi
}
check_dockerfile() {
if [ ! -f "Dockerfile.$1" ]; then
echo "❌ Ошибка: Файл Dockerfile.$1 не найден в директории docker"
exit 1
if [ ! -f "$1" ]; then
echo "❌ Ошибка: Файл $1 не найден в директории docker"
usage 1
fi
}
push_to_registry=false
name=""
version=""
docker_version=""
base_image_version=""
registry_address=""
port="5000"
use_old=false
dockerfile="Dockerfile.27.3.1"
repositories=""
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 ;;
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 "$docker_version" ] || [ -z "$base_image_version" ]; then
echo "❌ Ошибка: Не указаны обязательные аргументы (-n, -v, -d и -b)"
usage
if [ -z "$name" ] || [ -z "$version" ] || [ -z "$base_image_version" ]; then
echo "❌ Ошибка: Не указаны обязательные аргументы (-n, -v и -b)"
usage 1
fi
validate_version "$version"
@ -78,7 +93,7 @@ validate_version "$version"
if [ "$push_to_registry" = true ]; then
if [ -z "$registry_address" ]; then
echo "❌ Ошибка: Для отправки в registry необходимо указать адрес с -r"
usage
usage 1
fi
validate_address "$registry_address"
@ -91,14 +106,29 @@ cd docker || {
exit 1
}
echo "🔍 Проверка наличия Dockerfile..."
check_dockerfile "$docker_version"
if [ "$use_old" = true ]; then
dockerfile="Dockerfile.20.10.20"
fi
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
}
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
registry="$registry_address:$port"