25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 

269 satır
9.4 KiB

  1. param(
  2. [string]$ImageNamespace = $(if ($env:IMAGE_NAMESPACE) { $env:IMAGE_NAMESPACE } else { "emp-test" }),
  3. [string]$ImageTag = $(if ($env:IMAGE_TAG) { $env:IMAGE_TAG } else { Get-Date -Format "yyyyMMddHHmmss" }),
  4. [string]$NpmRegistry = $(if ($env:NPM_REGISTRY) { $env:NPM_REGISTRY } else { "https://registry.npmjs.org" }),
  5. [string]$EmpRoot = $(if ($env:EMP_ROOT) { $env:EMP_ROOT } else { "" }),
  6. [switch]$SkipBuild,
  7. [switch]$NoMiddlewareImages
  8. )
  9. $ErrorActionPreference = "Stop"
  10. # Local package script. Build images locally, export them, then run on server only with docker load + compose up.
  11. $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
  12. $RootDir = $null
  13. $DistDir = Join-Path $ScriptDir "dist"
  14. $BuildContextDir = Join-Path $ScriptDir ".build-context"
  15. $PackageName = "emp-test-runtime-$ImageTag"
  16. $PackageDir = Join-Path $DistDir $PackageName
  17. $PackageArchive = Join-Path $DistDir "$PackageName.tar.gz"
  18. $JavaModules = @("emp_gateway", "emp_auth", "emp_monitor", "emp_data")
  19. $AppImages = @(
  20. "$ImageNamespace/emp-gateway:$ImageTag",
  21. "$ImageNamespace/emp-gateway:latest",
  22. "$ImageNamespace/emp-auth:$ImageTag",
  23. "$ImageNamespace/emp-auth:latest",
  24. "$ImageNamespace/emp-monitor:$ImageTag",
  25. "$ImageNamespace/emp-monitor:latest",
  26. "$ImageNamespace/emp-data:$ImageTag",
  27. "$ImageNamespace/emp-data:latest",
  28. "$ImageNamespace/emp-pdf:$ImageTag",
  29. "$ImageNamespace/emp-pdf:latest",
  30. "$ImageNamespace/emp-ws:$ImageTag",
  31. "$ImageNamespace/emp-ws:latest",
  32. "$ImageNamespace/emp-admin:$ImageTag",
  33. "$ImageNamespace/emp-admin:latest"
  34. )
  35. $MiddlewareImages = @(
  36. $(if ($env:MYSQL_IMAGE) { $env:MYSQL_IMAGE } else { "mysql:8.0" }),
  37. $(if ($env:REDIS_IMAGE) { $env:REDIS_IMAGE } else { "redis:7-alpine" }),
  38. $(if ($env:KAFKA_IMAGE) { $env:KAFKA_IMAGE } else { "bitnami/kafka:3.7.0" }),
  39. $(if ($env:TDENGINE_IMAGE) { $env:TDENGINE_IMAGE } else { "tdengine/tdengine:3.3.6.0" }),
  40. $(if ($env:NACOS_IMAGE) { $env:NACOS_IMAGE } else { "nacos/nacos-server:v2.3.2-slim" })
  41. )
  42. function Write-Log {
  43. param([string]$Message)
  44. Write-Host "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] $Message"
  45. }
  46. function Add-KnownToolPaths {
  47. $KnownDirs = @(
  48. "C:\Program Files\Docker\Docker\resources\bin",
  49. "C:\Program Files\Docker\Docker",
  50. "$env:ProgramFiles\Docker\Docker\resources\bin"
  51. )
  52. foreach ($Dir in $KnownDirs) {
  53. if ($Dir -and (Test-Path $Dir) -and (($env:Path -split ';') -notcontains $Dir)) {
  54. $env:Path = "$Dir;$env:Path"
  55. }
  56. }
  57. }
  58. function Assert-Command {
  59. param([string]$Name)
  60. if (-not (Get-Command $Name -ErrorAction SilentlyContinue)) {
  61. throw "Missing command: $Name"
  62. }
  63. }
  64. function Assert-DockerDaemon {
  65. & docker info *> $null
  66. if ($LASTEXITCODE -ne 0) {
  67. throw "Docker daemon is not running. Start Docker Desktop and wait until it is ready, then rerun this script."
  68. }
  69. }
  70. function Test-EmpRoot {
  71. param([string]$Path)
  72. return (Test-Path (Join-Path $Path "emp_server")) `
  73. -and (Test-Path (Join-Path $Path "emp_admin")) `
  74. -and (Test-Path (Join-Path $Path "emp_ws"))
  75. }
  76. function Resolve-EmpRoot {
  77. if ($EmpRoot) {
  78. $Resolved = (Resolve-Path $EmpRoot).Path
  79. if (-not (Test-EmpRoot $Resolved)) {
  80. throw "EMP_ROOT is invalid: $EmpRoot"
  81. }
  82. return $Resolved
  83. }
  84. $Candidates = @(
  85. (Join-Path $ScriptDir "..\.."),
  86. (Join-Path $ScriptDir "..\..\emp"),
  87. (Join-Path $ScriptDir ".."),
  88. (Get-Location).Path
  89. )
  90. foreach ($Candidate in $Candidates) {
  91. if (Test-Path $Candidate) {
  92. $Resolved = (Resolve-Path $Candidate).Path
  93. if (Test-EmpRoot $Resolved) {
  94. return $Resolved
  95. }
  96. }
  97. }
  98. throw "Cannot find EMP root. Set EMP_ROOT=/path/to/emp where emp_server, emp_admin and emp_ws exist."
  99. }
  100. function Invoke-Step {
  101. param(
  102. [string]$WorkingDirectory,
  103. [string]$FilePath,
  104. [string[]]$Arguments
  105. )
  106. Push-Location $WorkingDirectory
  107. try {
  108. & $FilePath @Arguments
  109. if ($LASTEXITCODE -ne 0) {
  110. throw "$FilePath failed, exit code: $LASTEXITCODE"
  111. }
  112. } finally {
  113. Pop-Location
  114. }
  115. }
  116. function Build-JavaImages {
  117. $ServerDir = Join-Path $RootDir "emp_server"
  118. Write-Log "Build backend jars"
  119. Invoke-Step $ServerDir "mvn" @("package", "-DskipTests", "-B", "-pl", ($JavaModules -join ","), "-am")
  120. foreach ($Module in $JavaModules) {
  121. $TargetDir = Join-Path $ServerDir "$Module\target"
  122. $Jar = Get-ChildItem $TargetDir -Filter "*.jar" |
  123. Where-Object { $_.Name -ne "app.jar" -and $_.Name -notlike "*original*" } |
  124. Select-Object -First 1
  125. if (-not $Jar) {
  126. throw "Jar not found for $Module"
  127. }
  128. Copy-Item $Jar.FullName (Join-Path $TargetDir "app.jar") -Force
  129. }
  130. Write-Log "Build backend images"
  131. Invoke-Step $ServerDir "docker" @("build", "-f", "Dockerfile.service", "--build-arg", "MODULE=emp_gateway", "-t", "$ImageNamespace/emp-gateway:$ImageTag", "-t", "$ImageNamespace/emp-gateway:latest", ".")
  132. Invoke-Step $ServerDir "docker" @("build", "-f", "Dockerfile.service", "--build-arg", "MODULE=emp_auth", "-t", "$ImageNamespace/emp-auth:$ImageTag", "-t", "$ImageNamespace/emp-auth:latest", ".")
  133. Invoke-Step $ServerDir "docker" @("build", "-f", "Dockerfile.service", "--build-arg", "MODULE=emp_monitor", "-t", "$ImageNamespace/emp-monitor:$ImageTag", "-t", "$ImageNamespace/emp-monitor:latest", ".")
  134. Invoke-Step $ServerDir "docker" @("build", "-f", "Dockerfile.service", "--build-arg", "MODULE=emp_data", "-t", "$ImageNamespace/emp-data:$ImageTag", "-t", "$ImageNamespace/emp-data:latest", ".")
  135. Write-Log "Build PDF image"
  136. Invoke-Step $ServerDir "docker" @("build", "-f", "emp_pdf/Dockerfile", "-t", "$ImageNamespace/emp-pdf:$ImageTag", "-t", "$ImageNamespace/emp-pdf:latest", "emp_pdf")
  137. }
  138. function Build-WsImage {
  139. Write-Log "Build WS/simulator image"
  140. $Dockerfile = Join-Path $ScriptDir "dockerfiles\emp-ws.Dockerfile"
  141. Invoke-Step $RootDir "docker" @(
  142. "build",
  143. "-f", $Dockerfile,
  144. "--build-arg", "NPM_REGISTRY=$NpmRegistry",
  145. "-t", "$ImageNamespace/emp-ws:$ImageTag",
  146. "-t", "$ImageNamespace/emp-ws:latest",
  147. "."
  148. )
  149. }
  150. function Build-AdminImage {
  151. $AdminDir = Join-Path $RootDir "emp_admin"
  152. Write-Log "Build frontend dist"
  153. Invoke-Step $AdminDir "pnpm" @("install", "--frozen-lockfile")
  154. Invoke-Step $AdminDir "pnpm" @("run", "build:shunfeng")
  155. Write-Log "Prepare frontend image context"
  156. $ContextDir = Join-Path $BuildContextDir "emp-admin"
  157. if (Test-Path $ContextDir) {
  158. Remove-Item $ContextDir -Recurse -Force
  159. }
  160. New-Item -ItemType Directory -Force $ContextDir | Out-Null
  161. Copy-Item (Join-Path $AdminDir "dist") (Join-Path $ContextDir "dist") -Recurse -Force
  162. Copy-Item (Join-Path $ScriptDir "nginx\admin.conf") (Join-Path $ContextDir "admin.conf") -Force
  163. Write-Log "Build frontend image"
  164. $Dockerfile = Join-Path $ScriptDir "dockerfiles\emp-admin.Dockerfile"
  165. Invoke-Step $ContextDir "docker" @(
  166. "build",
  167. "-f", $Dockerfile,
  168. "-t", "$ImageNamespace/emp-admin:$ImageTag",
  169. "-t", "$ImageNamespace/emp-admin:latest",
  170. "."
  171. )
  172. }
  173. function Prepare-Package {
  174. if (Test-Path $PackageDir) {
  175. Remove-Item $PackageDir -Recurse -Force
  176. }
  177. New-Item -ItemType Directory -Force $PackageDir | Out-Null
  178. $ComposeSource = Join-Path $ScriptDir "docker-compose.runtime.yml"
  179. $EnvSource = Join-Path $ScriptDir ".env.example"
  180. $TestComposeSource = Join-Path $ScriptDir "test\docker-compose.yml"
  181. $TestEnvSource = Join-Path $ScriptDir "test\env.txt"
  182. if (Test-Path $TestComposeSource) {
  183. $ComposeSource = $TestComposeSource
  184. }
  185. if (Test-Path $TestEnvSource) {
  186. $EnvSource = $TestEnvSource
  187. }
  188. Copy-Item $ComposeSource (Join-Path $PackageDir "docker-compose.yml") -Force
  189. Copy-Item $EnvSource (Join-Path $PackageDir ".env.example") -Force
  190. Copy-Item (Join-Path $ScriptDir "install.sh") (Join-Path $PackageDir "install.sh") -Force
  191. Copy-Item (Join-Path $ScriptDir "README.md") (Join-Path $PackageDir "README.md") -Force
  192. }
  193. function Save-Images {
  194. $Images = New-Object System.Collections.Generic.List[string]
  195. foreach ($Image in $AppImages) {
  196. $Images.Add($Image)
  197. }
  198. if (-not $NoMiddlewareImages) {
  199. Write-Log "Pull middleware images"
  200. foreach ($Image in $MiddlewareImages) {
  201. Invoke-Step $RootDir "docker" @("pull", $Image)
  202. $Images.Add($Image)
  203. }
  204. }
  205. Write-Log "Save images"
  206. Invoke-Step $RootDir "docker" @(@("save", "-o", (Join-Path $PackageDir "images.tar")) + $Images.ToArray())
  207. }
  208. function Archive-Package {
  209. New-Item -ItemType Directory -Force $DistDir | Out-Null
  210. if (Test-Path $PackageArchive) {
  211. Remove-Item $PackageArchive -Force
  212. }
  213. Invoke-Step $DistDir "tar" @("-czf", $PackageArchive, $PackageName)
  214. Write-Log "Package created: $PackageArchive"
  215. }
  216. Add-KnownToolPaths
  217. Assert-Command "docker"
  218. Assert-DockerDaemon
  219. Assert-Command "tar"
  220. $RootDir = Resolve-EmpRoot
  221. Write-Log "EMP root: $RootDir"
  222. Write-Log "Deploy root: $ScriptDir"
  223. if (-not $SkipBuild) {
  224. Assert-Command "mvn"
  225. Assert-Command "pnpm"
  226. Build-JavaImages
  227. Build-WsImage
  228. Build-AdminImage
  229. } else {
  230. Write-Log "Skip build, package existing local images only"
  231. }
  232. Prepare-Package
  233. Save-Images
  234. Archive-Package