代码环境
- 仓库:https://github.com/springvortex/spring-cloud-alibaba.git
- 分支:
release/v1.0.0- JDK:
21- Spring Boot:
4.1.1
微服务部署脚本最怕“清单漂移”:Compose 里新增了服务,脚本里却还维护着四个硬编码模块名。这次 Windows 侧 deploy.ps1 的做法是把 docker-compose.yml 当作唯一服务清单。
脚本先解析 Compose 中的镜像定义:
$modules = @(
Get-Content -LiteralPath "deploy\docker-compose.yml" |
ForEach-Object {
if ($_ -match 'image:\s*zjc/service-(?<module>[a-z0-9-]+):') {
$Matches["module"]
}
}
)
后面所有循环都基于 $modules:
foreach ($module in $modules) {
$requiredFiles += "deploy\config\$module\application.yaml.template"
$requiredFiles += "service-$module\target\jib-image.tar"
}
也就是说,新增一个 service-ai 时,只要 Compose 里有 zjc/service-ai:tag,脚本就会自动检查它的配置模板和镜像 tar,并按同样规则传输,不需要再改部署脚本的模块数组。
脚本把动作拆成三个开关:
[switch]$Build,
[switch]$Load,
[switch]$Start
Build 调 Maven 构建 linux/amd64 镜像 tar;Load 在远程执行 docker load;Start 加载镜像后执行 docker compose up -d。Start 包含加载动作,避免“只想启动却拿到未加载的旧镜像”。
传输前还有完整性检查:Compose、.env.example、部署文档、维护脚本、每个模块的模板和 tar 缺一不可。这个检查发生在任何 ssh/scp 动作之前,避免远程目录传到一半才发现本地产物缺失。
完整脚本较长,正文不贴全文,最新源码直接看 GitHub:deploy.ps1。
Windows 脚本怎么用
在仓库根目录执行。默认目标是 zjc@192.168.100.128,部署目录是 /home/zjc/app,默认 tag 是 1.0.0:
# 只传输已经存在的镜像 tar 和部署文件,不重新构建
.\deploy\scripts\windows\deploy.ps1
# 构建、传输
.\deploy\scripts\windows\deploy.ps1 -Build
# 构建、传输,并在远程执行 docker load
.\deploy\scripts\windows\deploy.ps1 -Build -Load
# 构建、传输、远程加载镜像,并执行 docker compose up -d
.\deploy\scripts\windows\deploy.ps1 -Build -Start
https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/deploy/scripts/README.md
自定义目标和版本:
.\deploy\scripts\windows\deploy.ps1 `
-Remote "zjc@192.168.100.128" `
-AppDir "/home/zjc/app" `
-Tag "1.0.1" `
-Build -Start
https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/deploy/scripts/README.md
如果 PowerShell 执行策略拦截脚本:
powershell -NoProfile -ExecutionPolicy Bypass -File `
.\deploy\scripts\windows\deploy.ps1 -Build
https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/deploy/scripts/README.md
Maven 不在 PATH,或者安装路径里有空格时,用 -MavenCommand 指定完整命令:
.\deploy\scripts\windows\deploy.ps1 `
-Build `
-MavenCommand "D:\tools\maven\bin\mvn.cmd"
https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/deploy/scripts/README.md
脚本传输后,Ubuntu 上的关键文件是:
/home/zjc/app/docker-compose.yml
/home/zjc/app/.env.example
/home/zjc/app/config/<module>/application.yaml.template
/home/zjc/app/scripts/unix/manage.sh
/home/zjc/app/images/service-<module>.tar
https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/deploy/scripts/README.md
首次使用 -Start 前,先把 .env 和每个模块的 config/<module>/application.yaml 准备好;脚本只会传模板,不会生成运行配置。
经验总结
让部署脚本的模块清单来自 Compose,而不是重复维护一份。脚本负责流程编排,服务拓扑仍由 Compose 声明,两边就不会各自为政。
评论
评论由 GitHub Discussions 承载,需要 GitHub 账号登录。