Files

167 lines
5.1 KiB
PowerShell

# Publish MyOffice API + SPA for Proxmox (artifacts only, no source).
# Usage (from repo root):
# .\proxmox\publish.ps1
# .\proxmox\publish.ps1 -OutDir D:\builds\myoffice
# .\proxmox\publish.ps1 -Tar # also write myoffice-publish.tar.gz next to OutDir
#
# Before build:
# 1) copy appsettings.shared.json → Development + Production overlays (only if missing)
# 2) restore NuGet + npm
#
# Output: <OutDir>/ with MyOffice.Web.dll + wwwroot/ (SPA, same-origin URLs)
[CmdletBinding()]
param(
[string]$OutDir = '',
[switch]$Tar
)
$ErrorActionPreference = 'Stop'
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$repoRoot = Resolve-Path (Join-Path $scriptDir '..')
Set-Location $repoRoot
if (-not $OutDir) {
$OutDir = Join-Path $repoRoot '_Published'
}
$OutDir = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($OutDir)
$sharedDir = Join-Path $repoRoot 'MyOffice.Shared'
$sharedBase = Join-Path $sharedDir 'appsettings.shared.json'
if (-not (Test-Path $sharedBase)) {
throw "Missing $sharedBase"
}
Write-Host "-----------------------------------------------"
Write-Host "Copy appsettings.shared.json -> Development + Production (if missing)"
Write-Host "-----------------------------------------------"
foreach ($name in @('appsettings.shared.Development.json', 'appsettings.shared.Production.json')) {
$dest = Join-Path $sharedDir $name
if (Test-Path $dest) {
Write-Host "Skip (exists): $name"
}
else {
Copy-Item $sharedBase $dest
Write-Host "Created: $name"
}
}
Write-Host "-----------------------------------------------"
Write-Host "Restore NuGet packages"
Write-Host "-----------------------------------------------"
dotnet restore 'MyOffice.Web\MyOffice.Web.csproj' --nologo
if ($LASTEXITCODE -ne 0) {
throw "dotnet restore failed with exit code $LASTEXITCODE"
}
$spaDir = Join-Path $repoRoot 'MyOffice.SPA'
$envSample = Join-Path $spaDir 'src\environments\environment.sample.ts'
$envLocal = Join-Path $spaDir 'src\environments\environment.ts'
if (-not (Test-Path $envLocal) -and (Test-Path $envSample)) {
Copy-Item $envSample $envLocal
}
Write-Host "-----------------------------------------------"
Write-Host "Restore npm packages (MyOffice.SPA)"
Write-Host "-----------------------------------------------"
Push-Location $spaDir
try {
if (Test-Path (Join-Path $spaDir 'package-lock.json')) {
npm ci
}
else {
npm install
}
if ($LASTEXITCODE -ne 0) {
throw "npm restore failed with exit code $LASTEXITCODE"
}
}
finally {
Pop-Location
}
Write-Host "-----------------------------------------------"
Write-Host "dotnet publish -> $OutDir"
Write-Host "-----------------------------------------------"
if (Test-Path $OutDir) {
Remove-Item -Recurse -Force $OutDir
}
New-Item -ItemType Directory -Path $OutDir | Out-Null
dotnet publish 'MyOffice.Web\MyOffice.Web.csproj' -c Release -o $OutDir --no-restore --nologo
if ($LASTEXITCODE -ne 0) {
throw "dotnet publish failed with exit code $LASTEXITCODE"
}
# CT owns Production overlays — do not ship local env-specific appsettings.
# Keep appsettings.json + appsettings.shared.json (required at runtime).
Get-ChildItem -Path $OutDir -Filter 'appsettings*.json' -File -ErrorAction SilentlyContinue |
Where-Object {
$_.Name -notin @('appsettings.json', 'appsettings.shared.json')
} |
Remove-Item -Force
Write-Host "-----------------------------------------------"
Write-Host "ng build (proxmox) -> $OutDir\wwwroot"
Write-Host "-----------------------------------------------"
Push-Location $spaDir
try {
$spaOut = Join-Path $env:TEMP ("myoffice-spa-" + [guid]::NewGuid().ToString('N'))
npx ng build --configuration proxmox --output-path $spaOut
if ($LASTEXITCODE -ne 0) {
throw "ng build failed with exit code $LASTEXITCODE"
}
$wwwroot = Join-Path $OutDir 'wwwroot'
if (Test-Path $wwwroot) {
Remove-Item -Recurse -Force $wwwroot
}
New-Item -ItemType Directory -Path $wwwroot | Out-Null
$browser = Join-Path $spaOut 'browser'
if (Test-Path $browser) {
Copy-Item -Path (Join-Path $browser '*') -Destination $wwwroot -Recurse -Force
}
else {
Copy-Item -Path (Join-Path $spaOut '*') -Destination $wwwroot -Recurse -Force
}
Remove-Item -Recurse -Force $spaOut -ErrorAction SilentlyContinue
}
finally {
Pop-Location
}
if ($Tar) {
$tarPath = Join-Path (Split-Path -Parent $OutDir) 'myoffice-publish.tar.gz'
if (Test-Path $tarPath) {
Remove-Item -Force $tarPath
}
Write-Host "-----------------------------------------------"
Write-Host "tar -> $tarPath"
Write-Host "-----------------------------------------------"
# Windows 10+ tar; paths relative to OutDir parent
Push-Location (Split-Path -Parent $OutDir)
try {
$leaf = Split-Path -Leaf $OutDir
tar -czf $tarPath $leaf
if ($LASTEXITCODE -ne 0) {
throw "tar failed with exit code $LASTEXITCODE"
}
}
finally {
Pop-Location
}
Write-Host "Archive: $tarPath"
}
Write-Host ""
Write-Host "Published to $OutDir"
Write-Host "Next (Gitea): .\proxmox\publish.ps1 -Tar ; .\proxmox\release.ps1 -GiteaUrl ... -Owner ... -Tag v1.2.3"
Write-Host "Linux/CI: ./proxmox/publish.sh --tar ; ./proxmox/release.sh ..."
Write-Host "Lab SSH: .\proxmox\deploy.ps1 -TargetHost <ct-ip>"
Write-Host ""