File wps-office-build.sh of Package wps-office-docker

#!/bin/bash
# Скрипт сборки WPS Office в Docker контейнере

set -e

# Директории
WPS_DIR="/opt/wps-office"
SOURCE_DIR="/var/lib/wps-office-docker/source"
DOCKER_CONTEXT="/var/lib/wps-office-docker/docker-context"
LOG_FILE="/var/log/wps-office-docker/build.log"
STATUS_FILE="/var/lib/wps-office-docker/status"
DOCKERFILE="/etc/wps-office-docker/Dockerfile.wps"
SRPM_FILE="$SOURCE_DIR/wps-office-12.1.2.23578-46.2.src.rpm"

# Цвета
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# Создаем директории
mkdir -p "$WPS_DIR" "$DOCKER_CONTEXT" "$(dirname "$LOG_FILE")"

# Функция логирования
log() {
    echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE"
}

log_success() {
    echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] ✅ $1${NC}" | tee -a "$LOG_FILE"
}

log_error() {
    echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ❌ $1${NC}" | tee -a "$LOG_FILE"
}

# Функция очистки
clean() {
    log "Очистка предыдущей сборки..."
    rm -rf "$WPS_DIR"/* "$DOCKER_CONTEXT"/* 2>/dev/null || true
    docker stop wps-builder 2>/dev/null || true
    docker rm wps-builder 2>/dev/null || true
    docker rmi wps-builder:latest 2>/dev/null || true
    echo "clean" > "$STATUS_FILE"
    log_success "Очистка завершена"
}

# Функция проверки исходников
check_sources() {
    log "Проверка исходных файлов..."
    
    if [ ! -f "$SRPM_FILE" ]; then
        log_error "SRPM файл не найден: $SRPM_FILE"
        return 1
    fi
    
    local size=$(du -h "$SRPM_FILE" | cut -f1)
    log_success "Найден SRPM: $(basename $SRPM_FILE) (размер: $size)"
    return 0
}

# Функция подготовки контекста
prepare_context() {
    log "Подготовка Docker контекста..."
    
    rm -rf "$DOCKER_CONTEXT"/*
    mkdir -p "$DOCKER_CONTEXT"
    
    if [ ! -f "$DOCKERFILE" ]; then
        log_error "Dockerfile не найден: $DOCKERFILE"
        return 1
    fi
    
    cp "$DOCKERFILE" "$DOCKER_CONTEXT/Dockerfile"
    cp "$SRPM_FILE" "$DOCKER_CONTEXT/"
    
    log_success "Контекст подготовлен"
    return 0
}

# Функция сборки
build() {
    log "Начало сборки Docker образа..."
    echo "building" > "$STATUS_FILE"
    
    cd "$DOCKER_CONTEXT"
    
    # Сборка с таймаутом 100 минут
    timeout 100m docker build --no-cache -t wps-builder:latest . 2>&1 | tee -a "$LOG_FILE"
    BUILD_STATUS=${PIPESTATUS[0]}
    
    if [ $BUILD_STATUS -eq 124 ]; then
        log_error "Таймаут при сборке (15 минут)"
        return 1
    elif [ $BUILD_STATUS -ne 0 ]; then
        log_error "Ошибка при сборке Docker образа"
        return 1
    fi
    
    log_success "Docker образ собран"
    
    # Запуск контейнера
    log "Запуск контейнера..."
    docker run --name wps-builder \
        -v "$WPS_DIR:/output" \
        wps-builder:latest 2>&1 | tee -a "$LOG_FILE"
    
    # Проверка результата
    if [ -f "$WPS_DIR/opt/kingsoft/wps-office/office6/wps" ]; then
        log_success "✅ WPS Office успешно собран!"
        echo "installed" > "$STATUS_FILE"
        
        # Делаем бинарники исполняемыми
        chmod +x "$WPS_DIR/opt/kingsoft/wps-office/office6/"* 2>/dev/null || true
        
        docker rm wps-builder >/dev/null 2>&1 || true
        return 0
    else
        log_error "Бинарники WPS не найдены после сборки!"
        echo "failed" > "$STATUS_FILE"
        return 1
    fi
}

# Обработка аргументов
if [ "$1" = "--clean" ]; then
    clean
    exit 0
fi

# Основная функция
main() {
    log "=========================================="
    log "Начало сборки WPS Office"
    log "=========================================="
    
    # Проверка Docker
    if ! command -v docker &>/dev/null; then
        log_error "Docker не установлен"
        exit 1
    fi
    
    if ! docker info &>/dev/null; then
        log_error "Docker не запущен"
        exit 1
    fi
    
    # Проверка исходников
    check_sources || exit 1
    
    # Подготовка контекста
    prepare_context || exit 1
    
    # Сборка
    if build; then
        log_success "=========================================="
        log_success "WPS Office готов к использованию!"
        log_success "Запуск: wps-office (Writer)"
        log_success "       wps-presentation (Presentation)"
        log_success "       wps-spreadsheets (Spreadsheets)"
        log_success "       wps-pdf (PDF Reader)"
        log_success "=========================================="
        exit 0
    else
        log_error "=========================================="
        log_error "Сборка завершилась с ошибкой"
        log_error "Проверьте лог: tail -f $LOG_FILE"
        log_error "Для очистки: sudo wps-office-build --clean"
        log_error "=========================================="
        exit 1
    fi
}

main "$@"
openSUSE Build Service is sponsored by