# Register Gitea Actions runner trên VPS Windows Server. # Có thể dùng chung với VIETREPORT (runner có thể serve nhiều repo qua labels). # # Usage (admin PowerShell): # .\setup-gitea-runner.ps1 -RegistrationToken 'xxxx' -RunnerName 'vps-win-01' # # Lấy RegistrationToken từ: # https://git.baocaogiaoduc.vn/-/admin/actions/runners (admin only) # hoặc per-repo: https://git.baocaogiaoduc.vn/vietreport-admin/solution-erp/settings/actions/runners param( [Parameter(Mandatory=$true)] [string]$RegistrationToken, [string]$RunnerName = "vps-win-$(Get-Date -Format 'yyyyMMdd')", [string]$InstallDir = "C:\gitea-runner", [string]$GiteaUrl = "https://git.baocaogiaoduc.vn", [string]$Labels = "windows-latest,self-hosted,windows,x64" ) $ErrorActionPreference = 'Stop' # ===================== 1. Download runner ===================== $RunnerExe = Join-Path $InstallDir "act_runner.exe" if (-not (Test-Path $RunnerExe)) { Write-Host "==> Download Gitea act_runner" -ForegroundColor Cyan if (-not (Test-Path $InstallDir)) { New-Item -ItemType Directory -Force -Path $InstallDir | Out-Null } # Latest release từ Gitea $url = "https://dl.gitea.com/act_runner/act_runner-windows-amd64.exe" Invoke-WebRequest -Uri $url -OutFile $RunnerExe -UseBasicParsing Write-Host " Downloaded $RunnerExe" } # ===================== 2. Register ===================== Set-Location $InstallDir if (-not (Test-Path (Join-Path $InstallDir ".runner"))) { Write-Host "`n==> Register với Gitea $GiteaUrl" -ForegroundColor Cyan & $RunnerExe register ` --no-interactive ` --instance $GiteaUrl ` --token $RegistrationToken ` --name $RunnerName ` --labels $Labels if ($LASTEXITCODE -ne 0) { Write-Error "Register fail. Check:`n- Token đúng?`n- GiteaUrl reachable?`n- Runner name '$RunnerName' đã dùng?" exit 1 } Write-Host " Registered as '$RunnerName'" } else { Write-Host " Runner đã register (.runner file exists)" } # ===================== 3. Install as Windows service ===================== $ServiceName = "gitea-runner" $svc = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue if (-not $svc) { Write-Host "`n==> Install Windows service" -ForegroundColor Cyan # act_runner không có built-in service install — dùng nssm hoặc sc.exe # Dùng sc.exe đơn giản: $escapedPath = $RunnerExe -replace '\\', '\\' sc.exe create $ServiceName binPath= "`"$escapedPath`" daemon --config `"$InstallDir\config.yml`"" start= auto DisplayName= "Gitea Actions Runner" Start-Service $ServiceName Write-Host " Service '$ServiceName' installed + started" } else { if ($svc.Status -ne 'Running') { Start-Service $ServiceName Write-Host " Service started" } else { Write-Host " Service already running" } } Write-Host "`n✅ Runner setup DONE" -ForegroundColor Green Write-Host " Check trên Gitea: $GiteaUrl/-/admin/actions/runners (admin) hoặc repo settings > Actions > Runners" Write-Host " Labels: $Labels" Write-Host " Log: Get-Content '$InstallDir\log.txt' -Tail 50 -Wait"