Skip to content

Commit bdf837e

Browse files
committed
feat(deploy): 实现本地部署包支持及部署流程优化
- 添加本地部署包存储路径支持,修改包URL构建逻辑 - 优化部署服务异步执行上下文传递 - 新增部署测试脚本和打包脚本 - 添加数据库schema文件用于部署模块 - 更新配置文件包含数据库连接和私钥信息
1 parent 2166377 commit bdf837e

File tree

7 files changed

+624
-17
lines changed

7 files changed

+624
-17
lines changed

docs/deploy/schema.sql

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
-- Deploy模块数据库架构
2+
-- 部署相关的主机、实例和版本历史表
3+
4+
-- 创建hosts表:主机信息
5+
CREATE TABLE hosts (
6+
id SERIAL PRIMARY KEY,
7+
name VARCHAR(255) UNIQUE,
8+
ip_address VARCHAR(45) UNIQUE,
9+
is_stopped BOOLEAN
10+
);
11+
12+
-- 创建instances表:服务实例信息
13+
CREATE TABLE instances (
14+
id VARCHAR(255) NOT NULL PRIMARY KEY, -- VARCHAR类型主键,非自增,不为空
15+
service_name VARCHAR(255),
16+
service_version VARCHAR(255),
17+
host_id VARCHAR(255),
18+
host_ip_address VARCHAR(45),
19+
ip_address VARCHAR(45),
20+
port INT,
21+
status VARCHAR(50),
22+
is_stopped BOOLEAN,
23+
-- 保留ip_address和port的组合唯一约束
24+
CONSTRAINT unique_ip_port UNIQUE (ip_address, port)
25+
);
26+
27+
-- 1. 创建service_name和service_version的联合索引
28+
CREATE INDEX idx_instances_service_name_version
29+
ON instances (service_name, service_version);
30+
31+
-- 2. 创建service_name和ip_address的联合索引
32+
CREATE INDEX idx_instances_service_name_ip
33+
ON instances (service_name, ip_address);
34+
35+
-- 3. 创建version_histories表:版本历史记录
36+
CREATE TABLE version_histories (
37+
id SERIAL PRIMARY KEY,
38+
instance_id VARCHAR(255),
39+
service_name VARCHAR(255),
40+
service_version VARCHAR(255),
41+
status VARCHAR(50)
42+
);
43+
44+
-- 初始化主机数据
45+
-- 插入 jfcs1021 主机数据
46+
INSERT INTO hosts (name, ip_address, is_stopped)
47+
VALUES ('jfcs1021', '10.210.10.33', false);
48+
49+
-- 插入 jfcs1022 主机数据
50+
INSERT INTO hosts (name, ip_address, is_stopped)
51+
VALUES ('jfcs1022', '10.210.10.30', false);
52+
53+
-- 插入 jfcs1023 主机数据
54+
INSERT INTO hosts (name, ip_address, is_stopped)
55+
VALUES ('jfcs1023', '10.210.10.31', false);

internal/deploy/config.yaml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
database:
2+
host: "localhost"
3+
port: 5432
4+
user: "admin"
5+
password: "password"
6+
dbname: "zeroops"
7+
sslmode: "disable"
8+
9+
privateKey: |
10+
-----BEGIN RSA PRIVATE KEY-----
11+
MIICXQIBAAKBgQDZsfv1qscqYdy4vY+P4e3cAtmvppXQcRvrF1cB4drkv0haU24Y
12+
7m5qYtT52Kr539RdbKKdLAM6s20lWy7+5C0DgacdwYWd/7PeCELyEipZJL07Vro7
13+
Ate8Bfjya+wltGK9+XNUIHiumUKULW4KDx21+1NLAUeJ6PeW+DAkmJWF6QIDAQAB
14+
AoGBAJlNxenTQj6OfCl9FMR2jlMJjtMrtQT9InQEE7m3m7bLHeC+MCJOhmNVBjaM
15+
ZpthDORdxIZ6oCuOf6Z2+Dl35lntGFh5J7S34UP2BWzF1IyyQfySCNexGNHKT1G1
16+
XKQtHmtc2gWWthEg+S6ciIyw2IGrrP2Rke81vYHExPrexf0hAkEA9Izb0MiYsMCB
17+
/jemLJB0Lb3Y/B8xjGjQFFBQT7bmwBVjvZWZVpnMnXi9sWGdgUpxsCuAIROXjZ40
18+
IRZ2C9EouwJBAOPjPvV8Sgw4vaseOqlJvSq/C/pIFx6RVznDGlc8bRg7SgTPpjHG
19+
4G+M3mVgpCX1a/EU1mB+fhiJ2LAZ/pTtY6sCQGaW9NwIWu3DRIVGCSMm0mYh/3X9
20+
DAcwLSJoctiODQ1Fq9rreDE5QfpJnaJdJfsIJNtX1F+L3YceeBXtW0Ynz2MCQBI8
21+
9KP274Is5FkWkUFNKnuKUK4WKOuEXEO+LpR+vIhs7k6WQ8nGDd4/mujoJBr5mkrw
22+
DPwqA3N5TMNDQVGv8gMCQQCaKGJgWYgvo3/milFfImbp+m7/Y3vCptarldXrYQWO
23+
AQjxwc71ZGBFDITYvdgJM1MTqc8xQek1FXn1vfpy2c6O
24+
-----END RSA PRIVATE KEY-----
4.3 MB
Binary file not shown.

internal/service_manager/service/deploy_adapter.go

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package service
33
import (
44
"fmt"
55
"net/http"
6+
"os"
7+
"strings"
68

79
deployModel "github.com/qiniu/zeroops/internal/deploy/model"
810
deployService "github.com/qiniu/zeroops/internal/deploy/service"
@@ -19,7 +21,7 @@ type DeployAdapter struct {
1921
func NewDeployAdapter(instanceManager InstanceManager) *DeployAdapter {
2022
return &DeployAdapter{
2123
instanceManager: instanceManager,
22-
baseURL: "http://artifacts.zeroops.com", // 默认包仓库URL,可以从配置读取
24+
baseURL: "/Users/dingnanjia/workspace/mock/zeroops/internal/deploy/packages", // 本地包仓库路径
2325
}
2426
}
2527

@@ -115,10 +117,10 @@ func (a *DeployAdapter) buildPackageURL(serviceName, version, customURL string)
115117
return customURL
116118
}
117119

118-
// 否则基于约定构建URL
119-
// 格式:{baseURL}/packages/{service}/{version}/{service}-{version}.tar.gz
120-
return fmt.Sprintf("%s/packages/%s/%s/%s-%s.tar.gz",
121-
a.baseURL, serviceName, version, serviceName, version)
120+
// 否则基于约定构建本地文件路径
121+
// 格式:{baseURL}/{service}-{version}.tar.gz
122+
return fmt.Sprintf("%s/%s-%s.tar.gz",
123+
a.baseURL, serviceName, version)
122124
}
123125

124126
// ValidatePackageURL 验证包URL是否有效
@@ -128,15 +130,26 @@ func (a *DeployAdapter) ValidatePackageURL(packageURL string) error {
128130
return err
129131
}
130132

131-
// 额外的简单HTTP检查
132-
resp, err := http.Head(packageURL)
133-
if err != nil {
134-
return fmt.Errorf("package URL not accessible: %w", err)
135-
}
136-
defer resp.Body.Close()
137-
138-
if resp.StatusCode != 200 {
139-
return fmt.Errorf("package not found: HTTP %d", resp.StatusCode)
133+
// 区分HTTP URL和本地文件路径
134+
if strings.HasPrefix(packageURL, "http://") || strings.HasPrefix(packageURL, "https://") {
135+
// HTTP URL检查
136+
resp, err := http.Head(packageURL)
137+
if err != nil {
138+
return fmt.Errorf("package URL not accessible: %w", err)
139+
}
140+
defer resp.Body.Close()
141+
142+
if resp.StatusCode != 200 {
143+
return fmt.Errorf("package not found: HTTP %d", resp.StatusCode)
144+
}
145+
} else {
146+
// 本地文件路径检查
147+
if _, err := os.Stat(packageURL); err != nil {
148+
if os.IsNotExist(err) {
149+
return fmt.Errorf("package file not found: %s", packageURL)
150+
}
151+
return fmt.Errorf("package file not accessible: %w", err)
152+
}
140153
}
141154

142155
return nil

internal/service_manager/service/deploy_service.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func (s *Service) CreateDeployment(ctx context.Context, req *model.CreateDeploym
4242
Msg("deployment created successfully")
4343

4444
// 异步执行实际部署
45-
go s.executeActualDeployment(ctx, req)
45+
go s.executeActualDeployment(context.Background(), req)
4646

4747
// 返回创建的部署信息
4848
deployment := &model.Deployment{
@@ -291,7 +291,7 @@ func (s *Service) RollbackDeployment(ctx context.Context, service, version strin
291291
}
292292

293293
// 异步执行实际回滚
294-
go s.executeActualRollback(ctx, deployment, req)
294+
go s.executeActualRollback(context.Background(), deployment, req)
295295

296296
// 更新数据库状态
297297
err = s.db.RollbackDeployment(ctx, service, version)
@@ -309,7 +309,7 @@ func (s *Service) RollbackDeployment(ctx context.Context, service, version strin
309309
}
310310

311311
// executeActualRollback 执行实际回滚操作
312-
func (s *Service) executeActualRollback(_ context.Context, deployment *model.Deployment, req *model.RollbackDeploymentRequest) {
312+
func (s *Service) executeActualRollback(ctx context.Context, deployment *model.Deployment, req *model.RollbackDeploymentRequest) {
313313
// 捕获panic,防止goroutine崩溃
314314
defer func() {
315315
if r := recover(); r != nil {

0 commit comments

Comments
 (0)