#!/bin/sh usage() { echo "✏️ Использование: $0 -n <имя> -v <версия> [-a <адрес>] [-p <порт>] [-r]" 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 "" echo "📌 Примеры:" echo " Только сборка: $0 -n myapp -v 2.5.7" echo " Сборка и отправка: $0 -n myapp -v 2.5.7 -a registry.example.com -p 5000 -r" 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 "❌ Ошибка: Адрес не может быть пустым" exit 1 fi } validate_port() { if [ -n "$1" ]; then echo "$1" | grep -Eq '^[0-9]+$' || { echo "❌ Ошибка: Порт должен быть числом" exit 1 } fi } push_to_registry=false name="" version="" address="" port="" while getopts ":n:v:a:p:r" opt; do case $opt in n) name="$OPTARG" ;; v) version="$OPTARG" ;; a) address="$OPTARG" ;; p) port="$OPTARG" ;; r) push_to_registry=true ;; \?) echo "❌ Неверный аргумент -$OPTARG" >&2; usage ;; :) echo "❌ Опция -$OPTARG требует аргумент" >&2; usage ;; esac done if [ -z "$name" ] || [ -z "$version" ]; then echo "❌ Ошибка: Не указаны обязательные аргументы (-n и -v)" usage fi validate_version "$version" if [ "$push_to_registry" = true ]; then if [ -z "$address" ]; then echo "❌ Ошибка: Для отправки в registry необходимо указать адрес (-a)" usage fi validate_address "$address" validate_port "$port" fi echo "🐳 Сборка образа $name:$version..." docker build . -t "${name}:${version}" || { echo "❌ Ошибка при сборке образа" exit 1 } if [ "$push_to_registry" = true ]; then if [ -z "$port" ]; then registry="$address" else 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"