📦 CoStrict 项目的自动化构建工具,用于构建 Docker 镜像、部署包、客户端程序等可发布产物
| 依赖 | 用途 | 使用脚本 |
|---|---|---|
| Bash(Linux/macOS/WSL/Git Bash) | 所有脚本的运行环境 | 全部 .sh 脚本 |
| Docker | 构建和推送 Docker 镜像 | build-depends.sh |
| Docker Compose | 本地测试站点启动 | start-local-site.sh |
| 工具 | 用途 | 使用脚本 |
|---|---|---|
| jq | JSON 文件解析与处理 | build-depends.sh、build-components.sh、check-update.sh、check-build.sh、gen-manifest.sh、gen-backend-spec.sh、gen-component.sh、gen-depend.sh |
| smc | 包签名、打包、索引管理 | build-components.sh(路径:/root/.costrict/bin) |
| rsync | 上传部署包到远程服务器 | build-components.sh |
| ssh | 远程服务器操作 | build-components.sh |
| zip | 创建 zip 格式部署包 | build-components.sh |
| getopt | 命令行参数解析 | build-depends.sh、build-components.sh |
| python | exec 类型包的构建脚本执行 | build-components.sh(需 build.py) |
| 文件/目录 | 用途 | 说明 |
|---|---|---|
.env |
环境配置文件 | 定义镜像仓库(DH_ENV_*)和包上传(ENV_*)的环境变量 |
costrict-private.pem |
私钥文件 | 用于对部署包进行签名验证 |
components/ |
部署包配置目录 | 存放各组件包的 JSON 定义(供 build-components.sh 使用) |
depends/ |
依赖包配置目录 | 存放各 Docker 镜像的 JSON 定义(供 build-depends.sh 使用) |
configures/ |
配置文件目录 | 存放各服务的运行配置(创建组件包时的源目录) |
| 要求 | 用途 |
|---|---|
| Docker Hub 推送权限(或私有镜像仓库登录凭证) | 推送构建好的 Docker 镜像 |
| SSH 免密登录远程服务器 | 上传部署包到目标环境(通过 rsync over SSH) |
# Ubuntu/Debian
sudo apt-get install -y jq zip rsync
# CentOS/RHEL
sudo yum install -y jq zip rsync
# macOS
brew install jq zip rsync# 构建镜像(不推送),然后构建包
./build-costrict.sh
# 构建镜像并推送到 docker hub
./build-costrict.sh --push
# 构建镜像并推送到 test 和 prod 环境
./build-costrict.sh --push test,prod
# 构建包并上传到默认环境
./build-costrict.sh --upload def
# 完整构建:推送镜像到所有环境,上传包到 prod
./build-costrict.sh --push all --upload prod# 步骤1: 构建 Docker 镜像(可选推送)
./build-depends.sh --build
./build-depends.sh --build --push
# 步骤2: 检查镜像是否已构建,列出待构建列表
./check-build.sh --build-type dependency
# 步骤3: 检查更新并自动递增依赖包版本
./check-update.sh --update --build-type dependency
# 步骤4: 更新 backend 子系统规格
./gen-backend-spec.sh
# 步骤5: 检查更新并自动递增组件包版本
./check-update.sh --update --build-type component
# 步骤6: 更新发布清单
./gen-manifest.sh
# 步骤7: 构建部署包(可选上传)
./build-components.sh --packages "backend,frontend,costrict-system" --def
./build-components.sh --packages "backend,frontend,costrict-system" --def --upload defbuilder/
├── build-depends.sh # Docker 镜像构建脚本
├── build-components.sh # 部署包构建脚本
├── build-costrict.sh # 完整构建脚本(自动化流程)
├── check-update.sh # 更新检测与版本递增脚本
├── check-build.sh # 已打包/已构建状态检测脚本
├── gen-manifest.sh # 发布清单更新脚本
├── gen-backend-spec.sh # backend 子系统规格生成脚本
├── gen-component.sh # 组件模块定义生成脚本
├── gen-depend.sh # 依赖包定义生成脚本
├── start-local-site.sh # 本地测试站点脚本
├── costrict-manifest.json # CoStrict 组件清单模板
├── costrict-backend-spec.json # backend 子系统规格模板
├── packages.json # 包列表索引
├── latest.json # 包版本和 checksum 记录
│
├── depends/ # Docker 镜像配置目录
│ ├── casdoor.json
│ ├── chat-rag.json
│ └── ...
│
├── components/ # 部署包配置目录
│ ├── backend.json # 后端部署包配置
│ ├── frontend.json # 前端部署包配置
│ ├── costrict.json # 完整系统配置
│ └── ...
│
├── configures/ # 配置文件目录
│ ├── common/ # 通用配置
│ │ ├── apisix/ # API 网关配置
│ │ ├── casdoor/ # 认证服务配置
│ │ ├── backend/ # 后端服务配置
│ │ └── ...
│ ├── darwin/ # macOS 配置
│ ├── linux/ # Linux 配置
│ └── windows/ # Windows 配置
│
├── packages/ # 构建产物输出目录
│ └── {package}/
│ └── {os}/{arch}/{ver}/
│
└── site/ # 本地测试站点
├── docker-compose.yml
└── nginx.conf
| 包类型 | 后缀 | 说明 | 用途 |
|---|---|---|---|
| Docker 镜像 | - | 容器镜像 | 推送到镜像仓库,供部署拉取 |
| Docker-Compose 包 | .zip |
Compose 部署文件 | 私有化部署包 |
| K8s 包 | .zip |
Kubernetes 部署文件 | K8s 集群部署 |
| 客户端程序包 | .exec |
可执行程序 | 客户端工具下载 |
| 客户端配置包 | .conf |
配置文件 | 客户端配置更新 |
功能:读取 depends/{package}.json 配置,构建 Docker 镜像并推送到仓库
用法:
./build-depends.sh [OPTIONS] [ACTIONS]选项:
| 选项 | 说明 |
|---|---|
-p, --packages <PACKAGES> |
以逗号分隔的模块列表 (如 "pkg1,pkg2,pkg3") |
-h, --help |
帮助信息 |
动作:
| 动作 | 说明 |
|---|---|
--build |
构建镜像 |
--update |
使用构建好的依赖更新组件配置(如 image.env) |
--push [<ENV>] |
推送镜像。如果 ENV 为空或包含 def,推送到 docker hub;否则推送到指定环境(逗号分隔),如 test,prod |
环境说明:
- 推送目标环境由
.env中的DH_ENV_NAMES数组定义 def- 推送到 docker huball- 推送到所有环境- 也可指定具体环境名,如
test,prod
示例:
# 构建单个模块的镜像
./build-depends.sh --packages casdoor --build
# 构建并推送到 docker hub
./build-depends.sh --packages casdoor --build --push
# 构建多个模块并推送到多个环境
./build-depends.sh --packages "casdoor,chat-rag" --build --push test,prod
# 构建并更新组件配置,再推送到所有环境
./build-depends.sh --packages casdoor --build --update --push all
# 处理所有镜像
./build-depends.sh --build --push all配置文件:depends/*.json
功能:读取 components/{package}.json 配置,构建 zip/exec/conf 类型包
用法:
./build-components.sh [OPTIONS] [ACTIONS]选项:
| 选项 | 说明 |
|---|---|
-p, --packages <list> |
以逗号分隔的模块列表 |
--type <type> |
包类型过滤 (exec, conf, zip) |
--key <key> |
私钥文件(默认: costrict-private.pem) |
-h, --help |
帮助信息 |
动作:
| 动作 | 说明 |
|---|---|
--clean |
清理早期版本 |
--build |
构建包 |
--pack |
打包并签名 |
--index |
构建索引 |
--def |
执行默认步骤 (build + pack + index) |
--upload <env> |
上传包到指定环境 |
--upload-packages <env> |
仅上传 packages.json 到指定环境 |
环境说明:
- 环境由
.env中的ENV_NAMES数组定义 def- 默认环境(第一个环境)all- 所有环境- 支持逗号分隔的多个环境,如
test,prod
示例:
# 构建单个包(执行完整流程)
./build-components.sh --packages backend --def
# 构建并上传到默认环境
./build-components.sh --packages backend --def --upload def
# 构建多个包并上传到多个环境
./build-components.sh --packages "backend,frontend" --def --upload test,prod
# 仅上传 packages.json
./build-components.sh --upload-packages def
# 仅构建指定类型的包
./build-components.sh --type zip --def
# 使用自定义私钥签名
./build-components.sh --packages backend --def --key /path/to/private.pem配置文件:components/*.json
功能:一键完成 CoStrict 完整版本的构建发布
用法:
./build-costrict.sh [选项]选项:
| 选项 | 说明 |
|---|---|
--push [env] |
推送镜像到指定环境(会传递给 build-depends.sh)。构建镜像始终执行,此选项只控制是否推送。如果 env 为空或 'def',推送到 docker hub;否则推送到指定环境(如 'test,prod' 或 'all') |
--upload <ENV> |
指定包上传的环境(会传递给 build-components.sh) |
--skip-depend |
跳过依赖处理(Step 1 和 Step 2),不处理 dependency 包 |
--help, -h |
显示帮助信息 |
执行流程:
- 调用
check-update.sh自动递增 dependency 包的版本号 - 调用
check-build.sh检查尚未构建的 dependency 包,若有则调用build-depends.sh构建 - 调用
gen-backend-spec.sh更新backend/system-spec.json - 调用
check-update.sh自动递增 component 包的版本号 - 调用
gen-manifest.sh更新 manifest,并重新检查 costrict-system 版本 - 调用
check-build.sh检查尚未打包的 component 包,若有则调用build-components.sh构建
示例:
# 构建镜像(不推送),然后构建包
./build-costrict.sh
# 构建镜像并推送到 docker hub
./build-costrict.sh --push
# 构建镜像并推送到 test 和 prod 环境
./build-costrict.sh --push test,prod
# 构建包并上传到 prod 环境
./build-costrict.sh --upload prod
# 完整构建:推送镜像到所有环境,上传包到 prod
./build-costrict.sh --push all --upload prod
# 跳过依赖处理,仅构建组件包
./build-costrict.sh --skip-depend --upload def功能:检测 components/ 或 depends/ 目录中包的版本和内容变化,支持自动递增版本号
用法:
./check-update.sh [OPTIONS]选项:
| 选项 | 说明 |
|---|---|
-t, --build-type <TYPE> |
检测类型:component(默认,检测 components 目录)或 dependency(检测 depends 目录) |
-u, --update |
当 checksum 变化时自动更新版本号(递增 patch) |
-p, --packages <list> |
仅检查指定的包(逗号分隔) |
-v, --verbose |
显示每个文件的 checksum 计算详情 |
-h, --help |
帮助信息 |
工作原理:
- 遍历
components/或depends/目录中的 JSON 配置文件(由--build-type指定) - 计算包
path所指目录的 CHECKSUM 和文件数 - 比较当前版本和 checksum 与
latest.json中的记录 - 使用
--update时自动递增包的 patch 版本号
示例:
# 检查所有组件包的更新状态
./check-update.sh
# 检查依赖包的更新状态
./check-update.sh --build-type dependency
# 检查指定包并自动更新版本
./check-update.sh --update --packages backend,frontend
# 自动更新依赖包版本
./check-update.sh --update --build-type dependency
# 显示详细信息
./check-update.sh --verbose功能:检测组件包或依赖包的版本是否已经构建/打包完成,输出尚未构建的模块列表
用法:
./check-build.sh [OPTIONS]选项:
| 选项 | 说明 |
|---|---|
-t, --build-type <TYPE> |
检测类型:component(默认,检测 components 目录)或 dependency(检测 depends 目录) |
-p, --packages <list> |
仅检查指定的包(逗号分隔) |
-v, --verbose |
显示每个平台的详细检查信息 |
-h, --help |
帮助信息 |
工作原理:
- component 模式:遍历
components/目录的 JSON 配置,检查packages/{name}/{os}/{arch}/{version}/目录下是否存在构建产物 - dependency 模式:遍历
depends/目录的 JSON 配置,检查images/{name}/versions.json中是否记录了对应版本
示例:
# 检查所有组件包是否已打包
./check-build.sh
# 检查依赖包是否已构建
./check-build.sh --build-type dependency
# 检查指定包
./check-build.sh --packages backend,frontend
# 详细模式
./check-build.sh --verbose功能:以 costrict-manifest.json 为模板,扫描 components/ 目录补全组件版本信息
用法:
./gen-manifest.sh无参数
输出:configures/common/costrict-system/manifest.json
工作原理:
- 遍历
components/*.json,提取每个已启用的模块的name、subsystem、version字段 - 排除
costrict-system自身 - 替换模板中的 components 数组,生成完整的 manifest.json
功能:扫描 components/ 和 configures/common/*/services.json,自动生成 backend 子系统规格文件
用法:
./gen-backend-spec.sh无参数
输出:configures/common/backend/system-spec.json
工作原理:
- 扫描
components/目录,筛选出enabled且subsystem=backend的模块,提取 components 数组 - 扫描
configures/common/*/services.json,聚合所有已启用模块的 services 定义 - 以
costrict-backend-spec.json为模板输出完整的 system-spec.json
功能:创建可被 build-components.sh 构建的组件模块定义,同时生成源目录骨架与待构建元件
用法:
./gen-component.sh [OPTIONS]选项:
| 选项 | 说明 |
|---|---|
--name <NAME> |
组件名(必填)。决定输出文件名 components/<NAME>.json |
--type <TYPE> |
组件类型:zip(默认)/ conf / exec |
--path <PATH> |
源目录(默认按 type 推导) |
--version <VERSION> |
版本号(默认:1.0.0) |
--platforms <SPEC> |
平台规格,逗号分隔(如 linux/amd64,windows/amd64) |
--subsystem <SUBSYSTEM> |
所属子系统(默认:backend) |
--description <DESC> |
描述信息 |
--disabled |
将 enabled 置为 false |
--no-scaffold |
仅生成 JSON,不创建目录骨架 |
--force |
覆盖已存在的文件 |
-h, --help |
帮助信息 |
示例:
# 生成一个 zip 组件
./gen-component.sh --name my-pkg
# 生成一个 conf 配置组件
./gen-component.sh --name my-config --type conf
# 生成一个 exec 可执行组件
./gen-component.sh --name my-app --type exec
# 指定多平台与版本
./gen-component.sh --name my-app --version 2.1.0 --platforms linux/amd64,linux/arm64,darwin/arm64功能:创建可被 build-depends.sh 构建的依赖包定义文件(depends/<NAME>.json)
用法:
./gen-depend.sh [OPTIONS]选项:
| 选项 | 说明 |
|---|---|
--name <NAME> |
模块名(必填)。决定输出文件名 depends/<NAME>.json |
--path <PATH> |
构建镜像时的工作路径(必填) |
--version <VERSION> |
版本号(默认:1.0.0) |
--repo <REPO> |
Docker Hub 仓库名(默认:zgsm) |
--type <TYPE> |
依赖类型:exec(默认)/ frontend |
--tag <TAG> |
镜像标签模板(exec 默认:v{{.version}}) |
--command <COMMAND> |
构建命令模板(默认按 type 自动生成) |
--description <DESC> |
描述信息 |
--disabled |
将 enabled 置为 false |
--force |
覆盖已存在的定义文件 |
-h, --help |
帮助信息 |
示例:
# 生成一个 Docker 镜像依赖定义
./gen-depend.sh --name my-service --version 1.0.0 --path ../../services/my-service
# 生成一个前端类型依赖定义
./gen-depend.sh --name my-frontend --version 1.0.0 --path ../../my-frontend --type frontend功能:启动本地 nginx 容器,构建可供下载包的测试站点
用法:
./start-local-site.sh无参数
使用方式:
- 设置 cloud 地址为
http://localhost即可通过该站点更新软件
# Docker 镜像上传环境
declare -a DH_ENV_NAMES=("test" "prod")
declare -a DH_ENV_URLS=(...)
declare -a DH_ENV_USERS=(...)
declare -a DH_ENV_PASSWORDS=(...)
# 包上传环境
declare -a ENV_NAMES=("test" "prod")
declare -a ENV_HOSTS=(...)
declare -a ENV_PORTS=(...)
declare -a ENV_PATHS=(...){
"name": "costrict-admin-backend",
"repo": "zgsm",
"version": "1.0.43",
"path": "../costrict-admin/backend",
"command": "docker build --build-arg VERSION={{ .version }} . -t {{ .repo }}/{{ .name }}:{{ .tag }}",
"tag": "{{ .version }}",
"description": "The back-end docker-service of costrict"
}字段说明:
| 字段 | 必填 | 说明 |
|---|---|---|
| name | ✓ | 模块名 |
| repo | ✓ | 镜像仓库名 |
| version | 镜像版本 | |
| path | 构建时的工作路径 | |
| command | 构建命令(支持模板语法) | |
| tag | 镜像标签(默认为 version) | |
| description | 镜像描述 |
{
"name": "backend",
"version": "1.0.0",
"type": "zip",
"path": "configures/common/backend",
"os": ["linux"],
"arch": ["amd64", "arm64"]
}# 完整自动化发布
./build-costrict.sh --push all --upload prod# 1. 修改配置文件
vim configures/common/casdoor/casdoor.yml
# 2. 检查更新并自动递增版本
./check-update.sh --update --packages casdoor
# 3. 重新构建并上传
./build-components.sh --packages casdoor --def --upload prod
# 4. 更新 manifest
./gen-manifest.sh# 构建单个镜像并推送到 docker hub
./build-depends.sh --packages casdoor --build --push
# 构建所有镜像并推送到所有环境
./build-depends.sh --build --push all# 启动本地包下载站点
./start-local-site.sh
# 然后设置 cloud 地址为 http://localhost# 查看所有组件包的变更状态
./check-update.sh --verbose
# 查看依赖包的变更状态
./check-update.sh --build-type dependency --verbose
# 检查指定包
./check-update.sh --packages backend,frontend,casdoor# 创建新的组件模块定义(zip 类型)
./gen-component.sh --name my-service --description "My new service"
# 创建新的 Docker 镜像依赖定义
./gen-depend.sh --name my-image --version 1.0.0 --path ../../services/my-image
# 然后手动编辑配置文件后正常构建- 使用
gen-depend.sh快速生成:./gen-depend.sh --name {name} --path {path} --version {ver} - 或手动在
depends/目录创建{name}.json配置文件 - 运行
./build-depends.sh --packages {name} --build --push
- 使用
gen-component.sh快速生成:./gen-component.sh --name {name} - 或手动在
components/目录创建{name}.json配置文件 - 在
configures/common/目录创建对应配置文件 - 运行
./build-components.sh --packages {name} --def --upload def
- Docker 镜像 → 镜像仓库(由
.env中的DH_ENV_*配置) - 部署包 → Nginx 文件服务器(由
.env中的ENV_*配置)
# 查看构建配置中的版本
cat components/backend.json | jq '.version'
# 查看生成的 manifest
cat configures/common/costrict-system/manifest.json
# 查看版本记录
cat latest.json# 更新组件包版本
./check-update.sh --update
# 更新依赖包版本
./check-update.sh --update --build-type dependency./build-costrict.sh --skip-depend --upload def- 模块开发指南 - 查看完整的模块开发流程
- 各服务配置详见
configures/common/目录