You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

258 rivejä
9.0 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. Copy-Item (Join-Path $ScriptDir "docker-compose.runtime.yml") (Join-Path $PackageDir "docker-compose.yml") -Force
  179. Copy-Item (Join-Path $ScriptDir ".env.example") (Join-Path $PackageDir ".env.example") -Force
  180. Copy-Item (Join-Path $ScriptDir "install.sh") (Join-Path $PackageDir "install.sh") -Force
  181. Copy-Item (Join-Path $ScriptDir "README.md") (Join-Path $PackageDir "README.md") -Force
  182. }
  183. function Save-Images {
  184. $Images = New-Object System.Collections.Generic.List[string]
  185. foreach ($Image in $AppImages) {
  186. $Images.Add($Image)
  187. }
  188. if (-not $NoMiddlewareImages) {
  189. Write-Log "Pull middleware images"
  190. foreach ($Image in $MiddlewareImages) {
  191. Invoke-Step $RootDir "docker" @("pull", $Image)
  192. $Images.Add($Image)
  193. }
  194. }
  195. Write-Log "Save images"
  196. Invoke-Step $RootDir "docker" @(@("save", "-o", (Join-Path $PackageDir "images.tar")) + $Images.ToArray())
  197. }
  198. function Archive-Package {
  199. New-Item -ItemType Directory -Force $DistDir | Out-Null
  200. if (Test-Path $PackageArchive) {
  201. Remove-Item $PackageArchive -Force
  202. }
  203. Invoke-Step $DistDir "tar" @("-czf", $PackageArchive, $PackageName)
  204. Write-Log "Package created: $PackageArchive"
  205. }
  206. Add-KnownToolPaths
  207. Assert-Command "docker"
  208. Assert-DockerDaemon
  209. Assert-Command "tar"
  210. $RootDir = Resolve-EmpRoot
  211. Write-Log "EMP root: $RootDir"
  212. Write-Log "Deploy root: $ScriptDir"
  213. if (-not $SkipBuild) {
  214. Assert-Command "mvn"
  215. Assert-Command "pnpm"
  216. Build-JavaImages
  217. Build-WsImage
  218. Build-AdminImage
  219. } else {
  220. Write-Log "Skip build, package existing local images only"
  221. }
  222. Prepare-Package
  223. Save-Images
  224. Archive-Package