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 "$@"