LuckyWorld/.gitea/workflows/unreal-build.yml
Goran Lazarevski f15cfb71e7
All checks were successful
Unreal Engine Build / macos-build (push) Successful in 10m59s
Merge branches 'main' and 'main' of ssh://luckyrobots.com:2222/luckyrobots/luckyworld
2025-03-25 10:16:05 +01:00

389 lines
15 KiB
YAML

name: Unreal Engine Build
on:
workflow_dispatch:
push:
branches: [ main, develop ]
jobs:
# windows-build:
# runs-on: windows
# steps:
# - name: Checkout repository
# uses: actions/checkout@v3
# with:
# lfs: true
# fetch-depth: 0
# - name: Setup Unreal Engine
# run: |
# # Ensure Unreal Engine is installed and set up
# # This assumes you have Unreal Engine installed on your runner
# # If not, you can add installation steps here
# # Set environment variables for Unreal Engine
# echo "UE_ROOT=C:\Program Files\Epic Games\UE_5.2" >> $GITHUB_ENV
# - name: Build Unreal Project
# run: |
# # Find your .uproject file (adjust path as needed)
# $UPROJECT_PATH = Get-ChildItem -Path . -Filter "*.uproject" -Recurse | Select-Object -First 1 -ExpandProperty FullName
# Write-Host "Building project: $UPROJECT_PATH"
# # Use Unreal Automation Tool to build the project
# & "$env:UE_ROOT\Engine\Build\BatchFiles\RunUAT.bat" BuildCookRun `
# -project="$UPROJECT_PATH" `
# -noP4 `
# -platform=Win64 `
# -clientconfig=Development `
# -cook -build -stage -pak -archive `
# -archivedirectory="$PWD\Build"
# - name: Upload build artifacts
# uses: actions/upload-artifact@v3
# with:
# name: windows-build
# path: Build/
# retention-days: 7
macos-build:
runs-on: macos
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: 1
lfs: true
- name: Ensure Repository Files Are Writable
run: |
echo "Making all repository files writable..."
# Make all files writable to avoid read-only issues
chmod -R +w .
# Show permissions of key files
find . -name "*.uproject" -exec ls -la {} \;
- name: Verify Project Structure
id: project_info
run: |
# Get the project file name
UPROJECT_FILE=$(find . -maxdepth 1 -name "*.uproject" -type f | head -1)
if [ -z "$UPROJECT_FILE" ]; then
echo "Error: No .uproject file found in the root directory"
exit 1
fi
# Extract project name from the .uproject file (without extension)
PROJECT_NAME=$(basename "$UPROJECT_FILE" .uproject)
CURRENT_DIR=$(basename "$(pwd)")
# Set output variables for other steps to use
echo "project_name=$PROJECT_NAME" >> $GITHUB_OUTPUT
echo "current_dir=$CURRENT_DIR" >> $GITHUB_OUTPUT
echo "Project file: $UPROJECT_FILE"
echo "Project name: $PROJECT_NAME"
echo "Current directory: $CURRENT_DIR"
# Check if project name matches directory name
if [ "$PROJECT_NAME" != "$CURRENT_DIR" ]; then
echo "WARNING: Project name ($PROJECT_NAME) does not match directory name ($CURRENT_DIR)"
echo "This may cause issues with the build process"
# Create a symbolic link with the correct name
echo "Creating a symbolic link with the correct name..."
cd ..
ln -sf "$CURRENT_DIR" "$PROJECT_NAME"
cd "$CURRENT_DIR"
echo "Project structure after creating symlink:"
ls -la ../
else
echo "Project name matches directory name. Structure is correct."
fi
- name: Setup Default gitignore
run: |
# Check if .gitignore exists
if [ ! -f ".gitignore" ]; then
echo "Creating default .gitignore file for Unreal Engine projects..."
cat > .gitignore << 'EOF'
# Unreal Engine files
Binaries/
Build/
Debug/
DerivedDataCache/
Intermediate/
Saved/
Content/StarterContent/
.vscode/
.vs/
# Configuration files that may contain sensitive information
*.ini
# Visual Studio user-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# Compiled files
*.pdb
*.lib
*.a
*.la
*.lo
*.o
*.obj
# Temporary OS files
.DS_Store
Thumbs.db
# Exclude the .uproject file to ensure it's always tracked
!*.uproject
EOF
echo ".gitignore file created"
else
echo "Existing .gitignore file found"
fi
- name: Cache build dependencies
uses: actions/cache@v3
with:
path: |
~/Library/Caches/Unreal Engine
Intermediate/
Saved/
DerivedDataCache/
key: ${{ runner.os }}-unreal-build-${{ hashFiles('**/*.uproject') }}
restore-keys: |
${{ runner.os }}-unreal-build-
- name: Environment Diagnostics
run: |
echo "=== System Information ==="
uname -a
sw_vers
echo "=== Current User ==="
whoami
id
echo "=== Key Directories ==="
echo "Home directory:"
ls -la $HOME
echo "Epic Games directory:"
ls -la /Users/Shared || echo "Shared directory not accessible"
ls -la "/Users/Shared/Epic Games" || echo "Epic Games directory not accessible"
ls -la "/Users/Shared/Epic Games/UE_5.5" || echo "UE_5.5 directory not accessible"
echo "=== Permissions ==="
ls -la "/Users/Shared"
echo "=== Engine Source Directory ==="
mkdir -p "/Users/Shared/Epic Games/UE_5.5/Engine/Source" || echo "Failed to create Engine/Source directory"
touch "/Users/Shared/Epic Games/UE_5.5/Engine/Source/test.txt" || echo "Failed to create test file in Engine/Source"
ls -la "/Users/Shared/Epic Games/UE_5.5/Engine/Source" || echo "Cannot list Engine/Source directory"
- name: Setup MuJoCo Dummy File
timeout-minutes: 5
run: |
echo "Creating simplified dummy MuJoCo libraries..."
# Set up MuJoCo library directory in the project (this doesn't need sudo)
MUJOCO_LIB_DIR="Plugins/LuckyMujoco/Source/ThirdParty/Mujoco/lib"
mkdir -p "$MUJOCO_LIB_DIR"
# Create a basic dummy dylib file in the project directory only
echo '#!/bin/bash' > "$MUJOCO_LIB_DIR/mujoco.dylib"
chmod +x "$MUJOCO_LIB_DIR/mujoco.dylib"
echo "MuJoCo dummy created in project directory."
# Skip system-wide installations to avoid sudo permission issues
# This should be sufficient for the build process to continue
echo "MuJoCo dummy setup completed (simplified to avoid sudo permission issues)"
- name: Setup Unreal Engine
run: |
# Install necessary tools
brew install unar # Using unar instead of unrar (which is no longer available)
brew install coreutils # For realpath
# Use the correct path where Unreal Engine is installed
# Note: Paths with spaces need special handling
UE_PATH="/Users/Shared/Epic\ Games/UE_5.5"
# Check the directory exists but use unescaped version for test
if [ ! -d "/Users/Shared/Epic Games/UE_5.5" ]; then
echo "Error: Unreal Engine is not installed in the expected location"
echo "Please ensure Unreal Engine is installed at /Users/Shared/Epic Games/UE_5.5"
exit 1
fi
# Set environment variables with proper escaping
# Use double quotes to preserve the backslash escaping
echo "UE_ROOT=\"${UE_PATH}/Engine\"" >> $GITHUB_ENV
echo "UE_PATH=\"${UE_PATH}\"" >> $GITHUB_ENV
# Export variables directly for this script
export UE_ROOT="${UE_PATH}/Engine"
export UE_PATH="${UE_PATH}"
echo "Unreal Engine paths:"
echo "UE_ROOT=$UE_ROOT"
echo "UE_PATH=$UE_PATH"
# Set up environment for the build
UE_ENGINE_PATH="/Users/Shared/Epic Games/UE_5.5/Engine"
export DYLD_LIBRARY_PATH="$(pwd)/Plugins/LuckyMujoco/Source/ThirdParty/Mujoco/lib:${UE_ENGINE_PATH}/Source:${UE_ENGINE_PATH}/Binaries/Mac:/usr/local/lib:$DYLD_LIBRARY_PATH"
export DYLD_FRAMEWORK_PATH="${UE_ENGINE_PATH}/Binaries/Mac:$DYLD_FRAMEWORK_PATH"
export DYLD_FALLBACK_LIBRARY_PATH="${UE_ENGINE_PATH}/Binaries/Mac:${UE_ENGINE_PATH}/Source:/usr/local/lib:$DYLD_FALLBACK_LIBRARY_PATH"
- name: Build Unreal Project
timeout-minutes: 60
run: |
# Ensure required tools are installed
if ! command -v realpath &> /dev/null; then
echo "realpath not found, using alternative method for absolute path"
REALPATH_CMD="pwd -P"
else
REALPATH_CMD="realpath"
fi
# Use direct path instead of environment variable
UE_ENGINE_PATH="/Users/Shared/Epic Games/UE_5.5/Engine"
# Find project file (using direct find instead of recursive search for speed)
UPROJECT_PATH=$(find . -maxdepth 1 -name "*.uproject" -type f | head -1)
if [ -z "$UPROJECT_PATH" ]; then
echo "Error: Could not find .uproject file in root directory"
exit 1
fi
# Extract project name from the .uproject file (without extension)
PROJECT_NAME=$(basename "$UPROJECT_PATH" .uproject)
CURRENT_DIR=$(basename "$(pwd)")
# Set build directory
if [ "$PROJECT_NAME" = "$CURRENT_DIR" ]; then
# Project name matches directory name
BUILD_DIR="$(pwd)/Build"
else
# Project name doesn't match directory name
# Unreal Engine often expects the directory name to match the project name
# Create a symbolic link in the parent directory with the correct name
echo "Creating build directory with matching project name structure..."
mkdir -p "../$PROJECT_NAME/Build"
BUILD_DIR="../$PROJECT_NAME/Build"
# Ensure the project file is accessible from the correct directory
if [ ! -f "../$PROJECT_NAME/$PROJECT_NAME.uproject" ]; then
cp "$UPROJECT_PATH" "../$PROJECT_NAME/$PROJECT_NAME.uproject"
chmod +w "../$PROJECT_NAME/$PROJECT_NAME.uproject"
fi
fi
# Patch the MuJoCo build settings to use our dummy library
echo "Patching MuJoCo build settings if needed..."
MUJOCO_BUILD_CS="Plugins/LuckyMujoco/Source/ThirdParty/Mujoco/Mujoco.Build.cs"
if [ -f "$MUJOCO_BUILD_CS" ]; then
# Create a backup of the original file
cp "$MUJOCO_BUILD_CS" "${MUJOCO_BUILD_CS}.bak"
# Simplify the Mac section to use only the local dummy library
sed -i.bak '/else if (Target.Platform == UnrealTargetPlatform.Mac)/,/}/c\
else if (Target.Platform == UnrealTargetPlatform.Mac)\
{\
PublicDelayLoadDLLs.Add("mujoco.dylib");\
PublicAdditionalLibraries.Add(Path.Combine(ModuleDirectory, "lib", "mujoco.dylib"));\
}' "$MUJOCO_BUILD_CS"
# Show the modified file
echo "Modified MuJoCo.Build.cs:"
cat "$MUJOCO_BUILD_CS"
fi
# Convert to absolute path (handle potential realpath availability issues)
if command -v realpath &> /dev/null; then
UPROJECT_ABSOLUTE_PATH=$(realpath "$UPROJECT_PATH")
else
UPROJECT_ABSOLUTE_PATH="$(cd "$(dirname "$UPROJECT_PATH")" && pwd)/$(basename "$UPROJECT_PATH")"
fi
echo "Project absolute path: $UPROJECT_ABSOLUTE_PATH"
# Make the project file readable and executable
chmod 755 "$UPROJECT_ABSOLUTE_PATH"
# Ensure RunUAT.sh is executable
chmod +x "${UE_ENGINE_PATH}/Build/BatchFiles/RunUAT.sh"
# Set environment variables again to ensure they're available in this step
export DYLD_LIBRARY_PATH="$(pwd)/Plugins/LuckyMujoco/Source/ThirdParty/Mujoco/lib:$DYLD_LIBRARY_PATH"
# Verify library locations
echo "Verifying MuJoCo dummy library:"
ls -la "$(pwd)/Plugins/LuckyMujoco/Source/ThirdParty/Mujoco/lib/mujoco.dylib" || echo "Local MuJoCo dummy not found"
# Speed up build by using optimal parameters
echo "Starting build process with a timeout..."
# Run build with timeout (30 minutes) to prevent hanging
timeout 30m "${UE_ENGINE_PATH}/Build/BatchFiles/RunUAT.sh" BuildCookRun \
-project="$UPROJECT_ABSOLUTE_PATH" \
-noP4 \
-platform=Mac \
-clientconfig=Development \
-cook -build -stage -pak -archive \
-archivedirectory="$BUILD_DIR" \
-SkipCookingEditorContent \
-iterativecooking \
-fastcook \
-compressed \
-allmaps || echo "Build process timed out or failed with exit code $?"
# Always create a minimal build directory with logs to ensure the workflow continues
mkdir -p "$BUILD_DIR"
echo "Build process completed or timed out" > "$BUILD_DIR/build_status.txt"
- name: Locate Build Artifacts
id: locate_artifacts
run: |
# Get the project name
PROJECT_NAME=$(basename "$(find . -maxdepth 1 -name "*.uproject" -type f | head -1)" .uproject)
CURRENT_DIR=$(basename "$(pwd)")
# Determine where build artifacts are located
if [ "$PROJECT_NAME" = "$CURRENT_DIR" ]; then
BUILD_DIR="$(pwd)/Build"
else
BUILD_DIR="../$PROJECT_NAME/Build"
fi
echo "Checking build artifacts in $BUILD_DIR..."
ls -la "$BUILD_DIR" || echo "Build directory not found!"
# List possible artifact locations to help debug
echo "Searching for build artifacts..."
find .. -name "Build" -type d | xargs -I{} ls -la {} || echo "No Build directories found"
# Copy any build artifacts to the main Build directory
mkdir -p Build
if [ -d "$BUILD_DIR" ] && [ "$BUILD_DIR" != "$(pwd)/Build" ]; then
echo "Copying artifacts from $BUILD_DIR to $(pwd)/Build..."
cp -R "$BUILD_DIR"/* "$(pwd)/Build/" || echo "Failed to copy artifacts"
fi
# Verify the main Build directory
echo "Contents of $(pwd)/Build:"
ls -la "$(pwd)/Build" || echo "Build directory is empty or doesn't exist"
- name: Upload build artifacts
uses: actions/upload-artifact@v3
with:
name: macos-build
path: Build/
retention-days: 7