113 lines
3.1 KiB
PowerShell
113 lines
3.1 KiB
PowerShell
|
|
param(
|
||
|
|
[string]$ServerHost = "116.62.17.81",
|
||
|
|
[int]$Port = 9444,
|
||
|
|
[string]$Username = "wkc",
|
||
|
|
[string]$Password = "wkc@0825",
|
||
|
|
[string]$RemoteRoot = "/volume1/webapp/ccdi",
|
||
|
|
[switch]$DryRun
|
||
|
|
)
|
||
|
|
|
||
|
|
Set-StrictMode -Version Latest
|
||
|
|
$ErrorActionPreference = "Stop"
|
||
|
|
|
||
|
|
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||
|
|
$repoRoot = (Resolve-Path (Join-Path $scriptDir "..")).Path
|
||
|
|
$stageRoot = Join-Path $repoRoot ".deploy\\ccdi-package"
|
||
|
|
|
||
|
|
if ($DryRun) {
|
||
|
|
Write-Host "[DryRun] 一键部署参数预览"
|
||
|
|
Write-Host "Host: $ServerHost"
|
||
|
|
Write-Host "Port: $Port"
|
||
|
|
Write-Host "Username: $Username"
|
||
|
|
Write-Host "RemoteRoot: $RemoteRoot"
|
||
|
|
exit 0
|
||
|
|
}
|
||
|
|
|
||
|
|
function Ensure-Command {
|
||
|
|
param([string]$CommandName)
|
||
|
|
if (-not (Get-Command $CommandName -ErrorAction SilentlyContinue)) {
|
||
|
|
throw "缺少命令: $CommandName"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function Reset-Directory {
|
||
|
|
param([string]$Path)
|
||
|
|
if (Test-Path $Path) {
|
||
|
|
[System.IO.Directory]::Delete($Path, $true)
|
||
|
|
}
|
||
|
|
New-Item -ItemType Directory -Path $Path | Out-Null
|
||
|
|
}
|
||
|
|
|
||
|
|
function Copy-ItemSafe {
|
||
|
|
param(
|
||
|
|
[string]$Source,
|
||
|
|
[string]$Destination
|
||
|
|
)
|
||
|
|
Copy-Item -Path $Source -Destination $Destination -Recurse -Force
|
||
|
|
}
|
||
|
|
|
||
|
|
Write-Host "[1/5] 检查本地环境"
|
||
|
|
Ensure-Command "mvn"
|
||
|
|
Ensure-Command "npm"
|
||
|
|
Ensure-Command "python"
|
||
|
|
|
||
|
|
Write-Host "[2/5] 打包后端"
|
||
|
|
Push-Location $repoRoot
|
||
|
|
try {
|
||
|
|
mvn clean package -DskipTests
|
||
|
|
if ($LASTEXITCODE -ne 0) {
|
||
|
|
throw "后端打包失败"
|
||
|
|
}
|
||
|
|
} finally {
|
||
|
|
Pop-Location
|
||
|
|
}
|
||
|
|
|
||
|
|
Write-Host "[3/5] 打包前端"
|
||
|
|
Push-Location (Join-Path $repoRoot "ruoyi-ui")
|
||
|
|
try {
|
||
|
|
npm run build:prod
|
||
|
|
if ($LASTEXITCODE -ne 0) {
|
||
|
|
throw "前端打包失败"
|
||
|
|
}
|
||
|
|
} finally {
|
||
|
|
Pop-Location
|
||
|
|
}
|
||
|
|
|
||
|
|
Write-Host "[4/5] 组装部署目录"
|
||
|
|
Reset-Directory $stageRoot
|
||
|
|
New-Item -ItemType Directory -Path (Join-Path $stageRoot "backend") | Out-Null
|
||
|
|
New-Item -ItemType Directory -Path (Join-Path $stageRoot "frontend") | Out-Null
|
||
|
|
|
||
|
|
Copy-ItemSafe (Join-Path $repoRoot "docker") (Join-Path $stageRoot "docker")
|
||
|
|
Copy-ItemSafe (Join-Path $repoRoot "lsfx-mock-server") (Join-Path $stageRoot "lsfx-mock-server")
|
||
|
|
Copy-ItemSafe (Join-Path $repoRoot "ruoyi-ui\\dist") (Join-Path $stageRoot "frontend\\dist")
|
||
|
|
Copy-ItemSafe (Join-Path $repoRoot "docker-compose.yml") (Join-Path $stageRoot "docker-compose.yml")
|
||
|
|
Copy-ItemSafe (Join-Path $repoRoot ".env.example") (Join-Path $stageRoot ".env.example")
|
||
|
|
Copy-ItemSafe (Join-Path $repoRoot "ruoyi-admin\\target\\ruoyi-admin.jar") (Join-Path $stageRoot "backend\\ruoyi-admin.jar")
|
||
|
|
|
||
|
|
Write-Host "[5/5] 上传并远端部署"
|
||
|
|
$paramikoCheck = @'
|
||
|
|
import importlib.util
|
||
|
|
import sys
|
||
|
|
sys.exit(0 if importlib.util.find_spec("paramiko") else 1)
|
||
|
|
'@
|
||
|
|
$paramikoCheck | python -
|
||
|
|
if ($LASTEXITCODE -ne 0) {
|
||
|
|
python -m pip install --user paramiko
|
||
|
|
if ($LASTEXITCODE -ne 0) {
|
||
|
|
throw "安装 paramiko 失败"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
python (Join-Path $scriptDir "remote-deploy.py") `
|
||
|
|
--host $ServerHost `
|
||
|
|
--port $Port `
|
||
|
|
--username $Username `
|
||
|
|
--password $Password `
|
||
|
|
--local-root $stageRoot `
|
||
|
|
--remote-root $RemoteRoot
|
||
|
|
|
||
|
|
if ($LASTEXITCODE -ne 0) {
|
||
|
|
throw "远端部署失败"
|
||
|
|
}
|