From c582d57e708d5b8d7d5d18c8a2b7a62b1b981ea5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D1=80=D0=B8=D0=B3=D0=BE=D1=80=D0=B8=D0=B9=20=D0=A1?= =?UTF-8?q?=D0=B0=D1=84=D1=80=D0=BE=D0=BD=D0=BE=D0=B2?= Date: Mon, 27 Apr 2026 19:15:59 +0000 Subject: [PATCH] Upload files to "/" --- vendor_build.sh | 412 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 412 insertions(+) create mode 100644 vendor_build.sh diff --git a/vendor_build.sh b/vendor_build.sh new file mode 100644 index 0000000..9a938e0 --- /dev/null +++ b/vendor_build.sh @@ -0,0 +1,412 @@ +#!/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 "$@"