#!/bin/bash # Jellyfin Debian Package Builder # This script builds a .deb package from the current publishing configuration # Usage: ./scripts/linux/build-deb-package.sh [--no-clean] [--output-dir PATH] set -e # Configuration SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" PROJECT_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")" BUILD_TEMP_DIR="" OUTPUT_DIR="${OUTPUT_DIR:-$PROJECT_ROOT/dist}" CLEAN_AFTER=true VERBOSE=false # Parse arguments while [[ $# -gt 0 ]]; do case $1 in --no-clean) CLEAN_AFTER=false shift ;; --output-dir) OUTPUT_DIR="$2" shift 2 ;; --verbose) VERBOSE=true shift ;; *) echo "Unknown option: $1" echo "Usage: $0 [--no-clean] [--output-dir PATH] [--verbose]" exit 1 ;; esac done # Functions log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $*" } error() { echo "[ERROR] $*" >&2 exit 1 } cleanup() { if [[ "$CLEAN_AFTER" == true ]] && [[ -n "$BUILD_TEMP_DIR" ]] && [[ -d "$BUILD_TEMP_DIR" ]]; then log "Cleaning up temporary directory: $BUILD_TEMP_DIR" rm -rf "$BUILD_TEMP_DIR" fi } trap cleanup EXIT # Extract version log "Reading version from SharedVersion.cs..." if [[ ! -f "$PROJECT_ROOT/SharedVersion.cs" ]]; then error "SharedVersion.cs not found in $PROJECT_ROOT" fi VERSION=$(grep -oP 'Version\s*=\s*"\K[^"]+' "$PROJECT_ROOT/SharedVersion.cs") if [[ -z "$VERSION" ]]; then error "Could not extract version from SharedVersion.cs" fi log "Version: $VERSION" # Create output directory mkdir -p "$OUTPUT_DIR" log "Output directory: $OUTPUT_DIR" # Create temporary build directory BUILD_TEMP_DIR=$(mktemp -d) log "Temporary build directory: $BUILD_TEMP_DIR" # Build and publish cd "$PROJECT_ROOT" log "Restoring dependencies..." dotnet restore Jellyfin.sln -r linux-x64 > /dev/null 2>&1 || \ error "Failed to restore dependencies" log "Building solution..." dotnet build Jellyfin.sln --configuration Release > /dev/null 2>&1 || \ error "Failed to build solution" log "Publishing Jellyfin.Server..." if ! dotnet publish "Jellyfin.Server/Jellyfin.Server.csproj" \ --configuration Release \ --self-contained true \ --runtime linux-x64 \ --output "$BUILD_TEMP_DIR" > /dev/null 2>&1; then error "Failed to publish Jellyfin.Server" fi # Verify published output if [[ ! -f "$BUILD_TEMP_DIR/jellyfin" ]]; then error "Published files not found in $BUILD_TEMP_DIR" fi log "Published files size: $(du -sh "$BUILD_TEMP_DIR" | cut -f1)" # Create Debian package PACKAGE_NAME="jellyfin-${VERSION}_amd64.deb" PACKAGE_PATH="$OUTPUT_DIR/$PACKAGE_NAME" log "Creating Debian package: $PACKAGE_NAME" # Check if fpm is installed if ! command -v fpm &> /dev/null; then error "fpm is not installed. Install it with: sudo gem install fpm" fi # Build the package if fpm \ -s dir \ -t deb \ -n jellyfin \ -v "$VERSION" \ -C "$BUILD_TEMP_DIR" \ -p "$PACKAGE_PATH" \ --license "LICENSE" \ --vendor "Jellyfin Contributors" \ --maintainer "Jellyfin Team " \ --description "Jellyfin Media Server - a free software media server" \ --url "https://jellyfin.org" \ --architecture x86_64 \ --depends "libssl3" \ --depends "libicu72" \ --depends "libfontconfig1" \ --depends "libc6 (>= 2.31)" \ --before-remove "$PROJECT_ROOT/scripts/debian/prerm" \ --after-install "$PROJECT_ROOT/scripts/debian/postinst" \ --after-remove "$PROJECT_ROOT/scripts/debian/postrm" \ opt/=opt/jellyfin; then log "Package created successfully!" log "Package path: $PACKAGE_PATH" log "Package size: $(du -sh "$PACKAGE_PATH" | cut -f1)" # Display package information log "" log "Package Information:" dpkg-deb -I "$PACKAGE_PATH" | sed 's/^/ /' log "" log "Installation command:" log " sudo dpkg -i \"$PACKAGE_PATH\"" log "" log "If dependencies are missing, run:" log " sudo apt-get install -f" else error "Failed to create Debian package" fi