diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 292dbff..6126c47 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -101,114 +101,27 @@ jobs: --runtime win-x64 ` --self-contained false - # ============== FE BUILD WITH NPM CACHE ============== - # Cache `node_modules` ở `C:\npm-cache-erp\\\` ngoài workspace. - # Cache key = SHA256(package.json) 16-char prefix → đổi deps = fresh install. - # Junction từ workspace → cache (instant, không file copy). - # Lần đầu (cold cache): 49s + 33s. Lần sau (warm cache): 1-2s mỗi app. - # Vite 8 rolldown native binding match platform — install trên runner Windows - # (gotcha #20 từ Phase 5) → cache install này dùng được lần sau. - - name: Build fe-admin (with npm junction cache) + # FE build — npm install fresh mỗi run (Vite 8 rolldown gotcha #20). + # NOTE: Junction-based npm cache đã thử ở commit 29eb5d9 nhưng FAIL — `tsc not found`, + # script không hiện Write-Host log. Cần debug riêng (xem gotcha #39 mới). + # Tạm dùng fresh install như cũ (49s + 33s = 82s/run). Path filter ở trên đã + # save 100% time cho commit MD-only — đó là win lớn nhất. + - name: Build fe-admin shell: powershell + working-directory: fe-admin run: | - $ErrorActionPreference = 'Stop' - $hash = (Get-FileHash 'fe-admin/package.json' -Algorithm SHA256).Hash.Substring(0, 16) - $cacheDir = "C:\npm-cache-erp\fe-admin\$hash" - $cacheNm = "$cacheDir\node_modules" - $nmTarget = 'fe-admin\node_modules' + # Vite 8 rolldown native binding must match platform; fresh resolve on Windows + Remove-Item node_modules, package-lock.json -Recurse -Force -ErrorAction SilentlyContinue + & 'C:\Program Files\nodejs\npm.cmd' install --no-audit --no-fund + & 'C:\Program Files\nodejs\npm.cmd' run build - # Clean junction/dir cũ trong workspace nếu còn (act_runner thường clean nhưng phòng hờ) - if (Test-Path $nmTarget) { cmd /c rmdir /s /q $nmTarget } - - if (Test-Path $cacheNm) { - Write-Host "✓ npm cache HIT fe-admin (key: $hash)" - cmd /c mklink /J $nmTarget $cacheNm | Out-Null - } else { - Write-Host "✗ npm cache MISS fe-admin (key: $hash) — fresh install" - Push-Location fe-admin - try { - Remove-Item package-lock.json -Force -ErrorAction SilentlyContinue - & 'C:\Program Files\nodejs\npm.cmd' install --no-audit --no-fund - if ($LASTEXITCODE -ne 0) { throw "npm install failed: $LASTEXITCODE" } - } finally { Pop-Location } - New-Item -ItemType Directory -Force $cacheDir | Out-Null - Move-Item $nmTarget $cacheNm -Force - cmd /c mklink /J $nmTarget $cacheNm | Out-Null - } - - Push-Location fe-admin - try { - & 'C:\Program Files\nodejs\npm.cmd' run build - if ($LASTEXITCODE -ne 0) { throw "npm build failed: $LASTEXITCODE" } - } finally { Pop-Location } - - - name: Build fe-user (with npm junction cache) + - name: Build fe-user shell: powershell + working-directory: fe-user run: | - $ErrorActionPreference = 'Stop' - $hash = (Get-FileHash 'fe-user/package.json' -Algorithm SHA256).Hash.Substring(0, 16) - $cacheDir = "C:\npm-cache-erp\fe-user\$hash" - $cacheNm = "$cacheDir\node_modules" - $nmTarget = 'fe-user\node_modules' - - if (Test-Path $nmTarget) { cmd /c rmdir /s /q $nmTarget } - - if (Test-Path $cacheNm) { - Write-Host "✓ npm cache HIT fe-user (key: $hash)" - cmd /c mklink /J $nmTarget $cacheNm | Out-Null - } else { - Write-Host "✗ npm cache MISS fe-user (key: $hash) — fresh install" - Push-Location fe-user - try { - Remove-Item package-lock.json -Force -ErrorAction SilentlyContinue - & 'C:\Program Files\nodejs\npm.cmd' install --no-audit --no-fund - if ($LASTEXITCODE -ne 0) { throw "npm install failed: $LASTEXITCODE" } - } finally { Pop-Location } - New-Item -ItemType Directory -Force $cacheDir | Out-Null - Move-Item $nmTarget $cacheNm -Force - cmd /c mklink /J $nmTarget $cacheNm | Out-Null - } - - Push-Location fe-user - try { - & 'C:\Program Files\nodejs\npm.cmd' run build - if ($LASTEXITCODE -ne 0) { throw "npm build failed: $LASTEXITCODE" } - } finally { Pop-Location } - - # Safety: convert junction → nothing trước khi act_runner có thể cleanup workspace. - # `cmd /c rmdir /q` chỉ remove junction reference, KHÔNG recurse vào target. - # Tránh trường hợp Remove-Item -Recurse từ runner cleanup follow junction + - # delete cache contents. - - name: Remove FE node_modules junctions (preserve cache) - if: always() - shell: powershell - run: | - foreach ($app in @('fe-admin', 'fe-user')) { - $junction = "$app\node_modules" - if (Test-Path $junction) { - cmd /c rmdir /q $junction 2>$null - Write-Host "Removed junction: $junction" - } - } - - # Cache cleanup — keep top 5 most recent per app (FIFO eviction). - # Mỗi cache ~250MB. 5 versions × 2 app × 250MB = 2.5 GB max disk usage. - - name: Prune old npm caches - if: always() - shell: powershell - run: | - foreach ($app in @('fe-admin', 'fe-user')) { - $root = "C:\npm-cache-erp\$app" - if (Test-Path $root) { - $stale = Get-ChildItem $root -Directory | - Sort-Object LastWriteTime -Descending | - Select-Object -Skip 5 - foreach ($d in $stale) { - Write-Host "Pruning stale cache: $($d.FullName)" - Remove-Item $d.FullName -Recurse -Force -ErrorAction SilentlyContinue - } - } - } + Remove-Item node_modules, package-lock.json -Recurse -Force -ErrorAction SilentlyContinue + & 'C:\Program Files\nodejs\npm.cmd' install --no-audit --no-fund + & 'C:\Program Files\nodejs\npm.cmd' run build - name: Deploy to IIS (local) if: github.ref == 'refs/heads/main'