#!/usr/bin/env bash # Copyright 2026 Safronov Grigorii # # Licensed under the CDDL, Version 1.0 (the "License"); # you may not use this file except in compliance with the License. # # You may obtain a copy of the License at # https://opensource.org/licenses/CDDL-1.0 # # Скрипт сборки futriis с использованием vendoring зависимостей # Поддерживает Linux и Illumos (OpenIndiana) # После внеснения изменения(й) в файл "go.mod" требует ручного обновления зависимостей командой "go mod vendor" # Ключевые отличия от исходного build.sh: # Использование -mod=vendor - сборка из локальной копии зависимостей # Автоматическое создание vendor - если директория отсутствует # Проверка актуальности vendor - сравнение времени изменения go.mod и vendor/ # Дополнительные флаги - очистка, обновление, информация # Кросс-компиляция - поддержка сборки для других ОС # Улучшенный вывод - цветной, информативный ######################################### # Как использовать скрипт ######################################## # Полная сборка для всех платформ # ./vendoring_build.sh # Сборка только для Linux # ./vendoring_build.sh -l # Сборка только для Illumos # ./vendoring_build.sh -m # Сборка только для текущей ОС # ./vendoring_build.sh -o # Очистка бинарников # ./vendoring_build.sh -c # Полная очистка (бинарники + vendor) # ./vendoring_build.sh -C # Обновление зависимостей # ./vendoring_build.sh -u # Показать информацию о зависимостях # ./vendoring_build.sh -i # Показать справку # ./vendoring_build.sh -h set -e # Цвета для вывода RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Функции для вывода сообщений error_msg() { echo -e "${RED}❌ $1${NC}" } success_msg() { echo -e "${GREEN}✅ $1${NC}" } info_msg() { echo -e "${BLUE}📋 $1${NC}" } warning_msg() { echo -e "${YELLOW}⚠️ $1${NC}" } print_separator() { echo "================================================" } # Проверка наличия Go check_go() { info_msg "Checking Go installation..." if ! command -v go &> /dev/null; then error_msg "Go is not installed or not in PATH" exit 1 fi GO_VERSION=$(go version | awk '{print $3}') success_msg "Go found: $GO_VERSION" } # Проверка и создание vendor директории setup_vendor() { info_msg "Checking vendor directory..." if [ ! -d "vendor" ]; then warning_msg "Vendor directory not found. Creating vendor dependencies..." info_msg "Running: go mod vendor" if go mod vendor; then success_msg "Vendor dependencies created successfully" else error_msg "Failed to create vendor dependencies" exit 1 fi else info_msg "Vendor directory already exists" # Проверяем, не изменился ли go.mod if [ -f "go.mod" ] && [ -f "vendor/modules.txt" ]; then GO_MOD_TIME=$(stat -c %Y "go.mod" 2>/dev/null || stat -f %m "go.mod" 2>/dev/null) VENDOR_TIME=$(stat -c %Y "vendor/modules.txt" 2>/dev/null || stat -f %m "vendor/modules.txt" 2>/dev/null) if [ "$GO_MOD_TIME" -gt "$VENDOR_TIME" ] 2>/dev/null; then warning_msg "go.mod is newer than vendor directory" warning_msg "Consider running: go mod vendor" fi fi fi } # Создание директории bin create_bin_dir() { if [ ! -d "bin" ]; then info_msg "Creating bin directory..." mkdir -p bin success_msg "Bin directory created" fi } # Сборка для Linux build_linux() { info_msg "Building for Linux..." OUTPUT="bin/futriis-linux-vendor" GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -mod=vendor \ -ldflags="-s -w -X main.buildTime=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ -o "$OUTPUT" ./cmd/futriis if [ $? -eq 0 ]; then success_msg "Linux build successful: $OUTPUT" # Копируем в корень для удобства cp "$OUTPUT" ./futriis-linux-vendor 2>/dev/null || true info_msg "Binary copied to: ./futriis-linux-vendor" # Показываем размер бинарника SIZE=$(ls -lh "$OUTPUT" | awk '{print $5}') info_msg "Binary size: $SIZE" else error_msg "Linux build failed" return 1 fi } # Сборка для Illumos (OpenIndiana) build_illumos() { info_msg "Building for Illumos (OpenIndiana)..." OUTPUT="bin/futriis-illumos-vendor" # Для Illumos используем теги и включаем CGO GOOS=illumos GOARCH=amd64 CGO_ENABLED=1 go build -mod=vendor \ -tags=illumos \ -ldflags="-s -w -X main.buildTime=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ -o "$OUTPUT" ./cmd/futriis if [ $? -eq 0 ]; then success_msg "Illumos build successful: $OUTPUT" # Копируем в корень для удобства cp "$OUTPUT" ./futriis-illumos-vendor 2>/dev/null || true info_msg "Binary copied to: ./futriis-illumos-vendor" # Показываем размер бинарника SIZE=$(ls -lh "$OUTPUT" | awk '{print $5}') info_msg "Binary size: $SIZE" else error_msg "Illumos build failed" return 1 fi } # Сборка для текущей ОС (для разработки) build_current() { info_msg "Building for current OS ($(uname -s))..." OUTPUT="bin/futriis-current-vendor" go build -mod=vendor \ -ldflags="-s -w -X main.buildTime=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ -o "$OUTPUT" ./cmd/futriis if [ $? -eq 0 ]; then success_msg "Current OS build successful: $OUTPUT" # Копируем в корень для удобства cp "$OUTPUT" ./futriis-current-vendor 2>/dev/null || true info_msg "Binary copied to: ./futriis-current-vendor" SIZE=$(ls -lh "$OUTPUT" | awk '{print $5}') info_msg "Binary size: $SIZE" else error_msg "Current OS build failed" return 1 fi } # Очистка бинарных файлов clean() { info_msg "Cleaning binary files..." rm -f bin/futriis-*-vendor rm -f ./futriis-*-vendor success_msg "Clean completed" } # Очистка vendor директории clean_vendor() { info_msg "Cleaning vendor directory..." rm -rf vendor success_msg "Vendor directory removed" } # Обновление зависимостей update_deps() { info_msg "Updating dependencies..." info_msg "Running: go get -u ./..." go get -u ./... info_msg "Running: go mod tidy" go mod tidy info_msg "Running: go mod vendor" go mod vendor success_msg "Dependencies updated" } # Показать информацию о зависимостях show_deps() { info_msg "Project dependencies:" echo "" if [ -f "go.mod" ]; then echo "Direct dependencies:" go list -m all | head -20 echo "" fi if [ -d "vendor" ]; then echo "Vendor directory size:" du -sh vendor 2>/dev/null || echo "Cannot determine size" echo "" echo "Number of packages in vendor:" find vendor -name "*.go" 2>/dev/null | wc -l fi } # Показать справку show_help() { echo "Usage: $0 [OPTIONS]" echo "" echo "Options:" echo " -h, --help Show this help message" echo " -c, --clean Clean build artifacts" echo " -C, --clean-all Clean build artifacts and vendor directory" echo " -u, --update Update dependencies and rebuild vendor" echo " -i, --info Show dependency information" echo " -l, --linux Build only for Linux" echo " -m, --illumos Build only for Illumos" echo " -o, --only-os Build only for current OS" echo "" echo "Examples:" echo " $0 # Build for all supported platforms" echo " $0 -l # Build only for Linux" echo " $0 -c # Clean build artifacts" echo " $0 -u # Update dependencies and rebuild" } # Основная функция main() { print_separator echo -e "${GREEN}🔨 Building futriis database with vendoring${NC}" print_separator # Определяем ОС OS=$(uname -s | tr '[:upper:]' '[:lower:]') info_msg "Detected OS: $OS" # Обработка аргументов командной строки BUILD_LINUX=true BUILD_ILLUMOS=true BUILD_CURRENT=false while [[ $# -gt 0 ]]; do case $1 in -h|--help) show_help exit 0 ;; -c|--clean) clean exit 0 ;; -C|--clean-all) clean clean_vendor exit 0 ;; -u|--update) update_deps exit 0 ;; -i|--info) show_deps exit 0 ;; -l|--linux) BUILD_LINUX=true BUILD_ILLUMOS=false BUILD_CURRENT=false shift ;; -m|--illumos) BUILD_LINUX=false BUILD_ILLUMOS=true BUILD_CURRENT=false shift ;; -o|--only-os) BUILD_LINUX=false BUILD_ILLUMOS=false BUILD_CURRENT=true shift ;; *) error_msg "Unknown option: $1" show_help exit 1 ;; esac done # Проверяем Go check_go # Создаём vendor зависимости setup_vendor # Создаём bin директорию create_bin_dir print_separator # Сборка BUILD_FAILED=0 if [ "$BUILD_CURRENT" = true ]; then if ! build_current; then BUILD_FAILED=1 fi else if [ "$BUILD_LINUX" = true ] && [ "$OS" != "linux" ]; then info_msg "Cross-compiling for Linux..." if ! build_linux; then BUILD_FAILED=1 fi elif [ "$BUILD_LINUX" = true ] && [ "$OS" = "linux" ]; then if ! build_current; then BUILD_FAILED=1 fi fi if [ "$BUILD_ILLUMOS" = true ] && [ "$OS" != "sunos" ] && [ "$OS" != "illumos" ]; then info_msg "Cross-compiling for Illumos..." if ! build_illumos; then BUILD_FAILED=1 fi elif [ "$BUILD_ILLUMOS" = true ] && ([ "$OS" = "sunos" ] || [ "$OS" = "illumos" ]); then if ! build_current; then BUILD_FAILED=1 fi fi fi print_separator if [ $BUILD_FAILED -eq 0 ]; then success_msg "All builds completed successfully!" # Показываем список созданных бинарников echo "" info_msg "Generated binaries:" ls -lh bin/futriis-*-vendor 2>/dev/null || echo " No binaries in bin/" echo "" info_msg "To run the database:" echo " ./futriis-linux-vendor # On Linux" echo " ./futriis-illumos-vendor # On Illumos/OpenIndiana" else error_msg "Some builds failed" exit 1 fi } # Запуск основной функции main "$@"