This commit is contained in:
Alexander Zhirov 2025-04-23 22:41:05 +03:00
commit 1637cbdd96
4 changed files with 231 additions and 0 deletions

137
build.sh Normal file
View file

@ -0,0 +1,137 @@
#!/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"