| | |
| | | |
| | | $ErrorActionPreference = 'Stop' |
| | | $root = Split-Path -Parent $MyInvocation.MyCommand.Path |
| | | $pomPath = Join-Path $root 'traffic-audit-server\pom.xml' |
| | | if (-not (Test-Path $pomPath)) { throw "Missing Maven project: $pomPath" } |
| | | [xml]$pom = Get-Content -LiteralPath $pomPath -Raw -Encoding UTF8 |
| | | $productVersion = [string]$pom.project.version |
| | | if (-not $productVersion) { throw 'Missing <version> in traffic-audit-server\pom.xml' } |
| | | if ($productVersion -match '(?i)-SNAPSHOT$') { throw "Release builds must not use a SNAPSHOT version: $productVersion" } |
| | | if (-not $OutRoot) { $OutRoot = Join-Path $root 'deploy' } # 默认输出到仓库 deploy\(已 gitignore) |
| | | $tplDir = Join-Path $root 'deploy-templates' # 打包模板件(已入库) |
| | | $tplJarCfg = Join-Path $tplDir 'jar-application.yml' # 进 jar 的占位符配置 |
| | | $srcCfg = Join-Path $root 'traffic-audit-server\src\main\resources\application.yml' |
| | | $jarRel = 'traffic-audit-server\target\traffic-audit-server-1.0.0-SNAPSHOT.jar' |
| | | $jarRel = 'traffic-audit-server\target\traffic-audit-server.jar' |
| | | $jar = Join-Path $root $jarRel |
| | | $webDist = Join-Path $root 'traffic-audit-web\dist' |
| | | |
| | |
| | | $sr = New-Object System.IO.StreamReader($entry.Open()) |
| | | $text = $sr.ReadToEnd() |
| | | $sr.Close() |
| | | |
| | | $versionEntry = $zip.Entries | Where-Object { $_.FullName -eq 'BOOT-INF/classes/app-version.properties' } |
| | | if (-not $versionEntry) { throw 'jar 内缺少 BOOT-INF/classes/app-version.properties' } |
| | | $vr = New-Object System.IO.StreamReader($versionEntry.Open()) |
| | | $versionText = $vr.ReadToEnd() |
| | | $vr.Close() |
| | | |
| | | $manifestEntry = $zip.Entries | Where-Object { $_.FullName -eq 'META-INF/MANIFEST.MF' } |
| | | if (-not $manifestEntry) { throw 'jar 内缺少 META-INF/MANIFEST.MF' } |
| | | $mr = New-Object System.IO.StreamReader($manifestEntry.Open()) |
| | | $manifestText = $mr.ReadToEnd() |
| | | $mr.Close() |
| | | } finally { $zip.Dispose() } |
| | | |
| | | function Get-SecretHits([string]$ymlText) { |
| | |
| | | Write-Host ' 警告:jar 内置 password 不是 TRAFFIC_DB_PASSWORD 占位符形式,请确认模板。' |
| | | } |
| | | Write-Host ' 通过:jar 内置配置全部为占位符,无明文密钥/口令。' |
| | | |
| | | $builtVersion = '' |
| | | if ($versionText -match '(?m)^\s*version\s*=\s*(.+?)\s*$') { $builtVersion = $matches[1].Trim() } |
| | | if ($builtVersion -ne $productVersion) { |
| | | throw "版本不一致:pom.xml=$productVersion, app-version.properties=$builtVersion" |
| | | } |
| | | |
| | | $manifestVersion = '' |
| | | if ($manifestText -match '(?m)^Implementation-Version:\s*(.+?)\s*$') { $manifestVersion = $matches[1].Trim() } |
| | | if ($manifestVersion -ne $productVersion) { |
| | | throw "版本不一致:pom.xml=$productVersion, MANIFEST.MF=$manifestVersion" |
| | | } |
| | | Write-Host " 版本自检通过:$productVersion (pom / app-version.properties / MANIFEST.MF)" |
| | | |
| | | # ---------- [3/5] 前端构建 ---------- |
| | | # 单端口部署必须有 backend\web,所以即使 -NoFrontendDist 也需要 dist;只有 -SkipFrontend 才复用现有 dist。 |
| | |
| | | # ---------- [4/5] 组装完整部署目录 ---------- |
| | | Write-Host '[4/5] 组装部署目录...' |
| | | $stamp = Get-Date -Format 'yyyyMMdd' |
| | | $dest = Join-Path $OutRoot ("traffic-audit-deploy-" + $stamp) |
| | | $dest = Join-Path $OutRoot ("traffic-audit-deploy-" + $stamp + "-v" + $productVersion) |
| | | $n = 2 |
| | | while (Test-Path $dest) { $dest = Join-Path $OutRoot ("traffic-audit-deploy-" + $stamp + "-" + $n); $n++ } |
| | | while (Test-Path $dest) { $dest = Join-Path $OutRoot ("traffic-audit-deploy-" + $stamp + "-v" + $productVersion + "-" + $n); $n++ } |
| | | if ($NoFrontendDist) { |
| | | New-Item -ItemType Directory -Force -Path (Join-Path $dest 'backend'), (Join-Path $dest 'db') | Out-Null |
| | | } else { |
| | |
| | | cmd /c "robocopy `"$root\docs`" `"$docsDest`" /E /NFL /NDL /NJH /NJS /NP /XD _cache 工作日结 功能测试报告 问题汇总 /XF 生成_*.xlsx _bak_* >nul" |
| | | if ($LASTEXITCODE -ge 8) { throw "docs 复制失败(robocopy 返回 $LASTEXITCODE)" } |
| | | # db 脚本也放一份到 docs(与旧包一致:docs/init.sql 等) |
| | | Copy-Item (Join-Path $tplDir 'db\init.sql'), (Join-Path $tplDir 'db\sql_city_bus.sql'), (Join-Path $tplDir 'db\sql_city_taxi.sql'), (Join-Path $tplDir 'db\sql_wyc.sql'), (Join-Path $tplDir 'db\sql_holiday.sql'), (Join-Path $tplDir 'db\sql_holiday_decimal_migration.sql'), (Join-Path $tplDir 'db\sql_holiday_comparison_base_migration.sql'), (Join-Path $tplDir 'db\sql_holiday_previous_day_migration.sql'), (Join-Path $tplDir 'db\sql_observation_station.sql') $docsDest -Force -ErrorAction SilentlyContinue |
| | | Copy-Item (Join-Path $tplDir 'db\init.sql'), (Join-Path $tplDir 'db\sql_city_bus.sql'), (Join-Path $tplDir 'db\sql_city_taxi.sql'), (Join-Path $tplDir 'db\sql_wyc.sql'), (Join-Path $tplDir 'db\sql_holiday.sql'), (Join-Path $tplDir 'db\sql_holiday_decimal_migration.sql'), (Join-Path $tplDir 'db\sql_holiday_comparison_base_migration.sql'), (Join-Path $tplDir 'db\sql_holiday_previous_day_migration.sql'), (Join-Path $tplDir 'db\sql_holiday_vehicle_adjustment_migration.sql'), (Join-Path $tplDir 'db\sql_observation_station.sql') $docsDest -Force -ErrorAction SilentlyContinue |
| | | |
| | | # README:用模板并替换日期占位 |
| | | $readme = Get-Content (Join-Path $tplDir 'README-部署说明.txt') -Raw -Encoding UTF8 |
| | | $readme = $readme.Replace('{stamp}', $stamp) |
| | | $readme = $readme.Replace('{stamp}', $stamp).Replace('{version}', $productVersion) |
| | | Set-Content -LiteralPath (Join-Path $dest 'README-部署说明.txt') -Value $readme -Encoding UTF8 |
| | | |
| | | # ---------- [5/5] 整包明文密钥扫描 + 汇总 ---------- |