ufc-predictor / scripts /update_models.ps1
AlvaroMros's picture
Automated model update: 2025-07-15 20:00:00
8c767a0
# UFC Model Update Script for Windows Task Scheduler
# This script safely updates models with resource limits and pushes logs to git
# Configuration
$PROJECT_DIR = "C:\Users\Alvaro\Desktop\ufc" # Change this to your actual path
$LOG_DIR = "$PROJECT_DIR\logs"
$LOG_FILE = "$LOG_DIR\model_update.log"
$LOCK_FILE = "$LOG_DIR\update.lock"
$MAX_TIMEOUT_MINUTES = 120 # 2 hours timeout
# Create logs directory if it doesn't exist
if (!(Test-Path $LOG_DIR)) {
New-Item -ItemType Directory -Path $LOG_DIR -Force
}
# Function to log with timestamp
function Write-Log {
param($Message)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
"[$timestamp] $Message" | Out-File -FilePath $LOG_FILE -Append
Write-Host "[$timestamp] $Message"
}
# Function to safely execute git commands
function Invoke-GitCommand {
param($Command, $Description)
try {
Write-Log "Git: $Description"
$result = Invoke-Expression "git $Command" 2>&1
if ($LASTEXITCODE -eq 0) {
Write-Log "Git: $Description completed successfully"
if ($result) { Write-Log "Git output: $result" }
return $true
} else {
Write-Log "Git: $Description failed with exit code $LASTEXITCODE"
Write-Log "Git error: $result"
return $false
}
} catch {
Write-Log "Git: Error executing $Description - $($_.Exception.Message)"
return $false
}
}
# Function to commit and push changes
function Push-ChangesToGit {
Write-Log "Starting git operations..."
# Check if we're in a git repository
if (!(Test-Path ".git")) {
Write-Log "Not in a git repository. Skipping git operations."
return
}
# Check git status
$gitStatus = git status --porcelain 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Log "Failed to check git status. Skipping git operations."
return
}
if ([string]::IsNullOrWhiteSpace($gitStatus)) {
Write-Log "No changes to commit."
return
}
# Add all changes
if (!(Invoke-GitCommand "add ." "Adding all changes")) {
return
}
# Create commit message with timestamp
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$commitMessage = "Automated model update: $timestamp"
# Commit changes
if (!(Invoke-GitCommand "commit -m `"$commitMessage`"" "Committing changes")) {
return
}
# Push to remote
if (!(Invoke-GitCommand "push" "Pushing to remote repository")) {
Write-Log "Failed to push changes. Changes are committed locally."
return
}
Write-Log "Successfully pushed all changes to git repository."
}
# Check if another update is already running
if (Test-Path $LOCK_FILE) {
Write-Log "Another update process is already running. Exiting."
exit 1
}
# Create lock file
$PID | Out-File -FilePath $LOCK_FILE
try {
Write-Log "Starting automated model update and git sync..."
# Change to project directory
Set-Location $PROJECT_DIR
# Verify we're in the right directory
if (!(Test-Path "src\main.py")) {
Write-Log "Error: Not in UFC project directory. Expected to find src\main.py"
exit 1
}
# Create a job to run the update with timeout
Write-Log "Running model update pipeline..."
$job = Start-Job -ScriptBlock {
param($projectDir)
Set-Location $projectDir
python -m src.main --pipeline update 2>&1
} -ArgumentList $PROJECT_DIR
# Wait for job completion with timeout
$updateSuccess = $false
if (Wait-Job $job -Timeout ($MAX_TIMEOUT_MINUTES * 60)) {
$result = Receive-Job $job
$exitCode = $job.State
if ($exitCode -eq "Completed") {
Write-Log "Model update pipeline completed successfully."
Write-Log "Pipeline output: $result"
$updateSuccess = $true
} else {
Write-Log "Model update pipeline failed. State: $exitCode"
Write-Log "Pipeline output: $result"
}
} else {
Write-Log "Model update timed out after $MAX_TIMEOUT_MINUTES minutes. Stopping job."
Stop-Job $job
}
Remove-Job $job -Force
# Always attempt to push logs and any changes to git
Write-Log "Syncing changes to git repository..."
Push-ChangesToGit
if ($updateSuccess) {
Write-Log "Automated update completed successfully with git sync."
} else {
Write-Log "Automated update completed with errors, but logs have been synced to git."
}
} catch {
Write-Log "Critical error during automated update: $($_.Exception.Message)"
# Try to push error logs to git
try {
Set-Location $PROJECT_DIR
Push-ChangesToGit
} catch {
Write-Log "Failed to push error logs to git: $($_.Exception.Message)"
}
} finally {
# Cleanup lock file
if (Test-Path $LOCK_FILE) {
Remove-Item $LOCK_FILE -Force
}
Write-Log "Automated update process finished."
}