No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 

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