kdeploy 1.2.33 → 1.2.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +121 -79
- data/README_EN.md +131 -72
- data/lib/kdeploy/cli.rb +31 -7
- data/lib/kdeploy/command_executor.rb +4 -48
- data/lib/kdeploy/dsl.rb +88 -0
- data/lib/kdeploy/errors.rb +6 -2
- data/lib/kdeploy/executor.rb +28 -6
- data/lib/kdeploy/initializer.rb +22 -30
- data/lib/kdeploy/output_formatter.rb +49 -43
- data/lib/kdeploy/runner.rb +41 -44
- data/lib/kdeploy/version.rb +1 -1
- data/lib/kdeploy.rb +0 -1
- data/r.md +1 -0
- metadata +2 -3
- data/lib/kdeploy/command_grouper.rb +0 -38
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a38f6cd05a9b367146a9589800c65ebbc62a1c4192b6be8347d1156031c54d6b
|
|
4
|
+
data.tar.gz: 1cde973c19e35e14d299fbc2c8e307f2a69093d8a442d542a9db262f057213a4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9db48da0d7a90fa51389c2311b0aaea919cc87d4e47360ce3323f5202a96d3998e955819a5d39528f998f9edb2d4f90808bfd5dfdab1b2ea47c4f443a57452b5
|
|
7
|
+
data.tar.gz: 98d5a5c755f1a75e2491f4a8d09e1842851bf077316f6a50f11f964ebaef334f6b6666017d8a78b4918dcef4f17d8e181e4d60e5867212db3bea163d6c860c0e
|
data/README.md
CHANGED
|
@@ -98,6 +98,12 @@ kdeploy version
|
|
|
98
98
|
|
|
99
99
|
您应该看到版本信息和横幅。
|
|
100
100
|
|
|
101
|
+
**若找不到 `kdeploy` 命令**:gem 的可执行目录可能不在 PATH 中。将以下内容加入 `~/.zshrc` 或 `~/.bashrc` 后执行 `source ~/.zshrc`:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
export PATH="$(ruby -e 'puts Gem.bindir'):$PATH"
|
|
105
|
+
```
|
|
106
|
+
|
|
101
107
|
### Shell 自动补全
|
|
102
108
|
|
|
103
109
|
Kdeploy 在安装期间自动配置 shell 自动补全。如果需要,可以手动添加到 shell 配置中:
|
|
@@ -137,35 +143,30 @@ kdeploy init my-deployment
|
|
|
137
143
|
|
|
138
144
|
### 2. 配置主机和任务
|
|
139
145
|
|
|
140
|
-
编辑 `deploy.rb
|
|
146
|
+
编辑 `deploy.rb`(使用 Chef 风格资源 DSL):
|
|
141
147
|
|
|
142
148
|
```ruby
|
|
143
149
|
# 定义主机
|
|
144
150
|
host "web01", user: "ubuntu", ip: "10.0.0.1", key: "~/.ssh/id_rsa"
|
|
145
151
|
host "web02", user: "ubuntu", ip: "10.0.0.2", key: "~/.ssh/id_rsa"
|
|
146
|
-
|
|
147
|
-
# 定义角色
|
|
148
152
|
role :web, %w[web01 web02]
|
|
149
153
|
|
|
150
154
|
# 定义部署任务
|
|
151
|
-
task :
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
port: 3000
|
|
160
|
-
|
|
161
|
-
run "sudo systemctl start nginx"
|
|
155
|
+
task :deploy_web, roles: :web do
|
|
156
|
+
package "nginx"
|
|
157
|
+
directory "/etc/nginx/conf.d"
|
|
158
|
+
template "/etc/nginx/nginx.conf", source: "./config/nginx.conf.erb",
|
|
159
|
+
variables: { domain_name: "example.com", port: 3000 }
|
|
160
|
+
file "/etc/nginx/conf.d/app.conf", source: "./config/app.conf"
|
|
161
|
+
run "nginx -t", sudo: true
|
|
162
|
+
service "nginx", action: %i[enable restart]
|
|
162
163
|
end
|
|
163
164
|
```
|
|
164
165
|
|
|
165
166
|
### 3. 运行部署
|
|
166
167
|
|
|
167
168
|
```bash
|
|
168
|
-
kdeploy execute deploy.rb
|
|
169
|
+
kdeploy execute deploy.rb deploy_web
|
|
169
170
|
```
|
|
170
171
|
|
|
171
172
|
## 📖 使用指南
|
|
@@ -356,7 +357,7 @@ end
|
|
|
356
357
|
|
|
357
358
|
```ruby
|
|
358
359
|
task :deploy_web, roles: :web do
|
|
359
|
-
|
|
360
|
+
service "nginx", action: :restart
|
|
360
361
|
end
|
|
361
362
|
```
|
|
362
363
|
|
|
@@ -364,29 +365,22 @@ end
|
|
|
364
365
|
|
|
365
366
|
```ruby
|
|
366
367
|
task :maintenance, on: %w[web01] do
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
sudo systemctl start nginx
|
|
371
|
-
SHELL
|
|
368
|
+
service "nginx", action: :stop
|
|
369
|
+
run "apt-get update && apt-get upgrade -y", sudo: true
|
|
370
|
+
service "nginx", action: %i[start enable]
|
|
372
371
|
end
|
|
373
372
|
```
|
|
374
373
|
|
|
375
374
|
#### 多命令任务
|
|
376
375
|
|
|
377
376
|
```ruby
|
|
378
|
-
task :
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
# 启动服务
|
|
386
|
-
run "sudo systemctl start nginx"
|
|
387
|
-
|
|
388
|
-
# 验证状态
|
|
389
|
-
run "sudo systemctl status nginx"
|
|
377
|
+
task :deploy_web, roles: :web do
|
|
378
|
+
package "nginx"
|
|
379
|
+
directory "/etc/nginx/conf.d"
|
|
380
|
+
template "/etc/nginx/nginx.conf", source: "./config/nginx.conf.erb", variables: { port: 3000 }
|
|
381
|
+
file "/etc/nginx/conf.d/app.conf", source: "./config/app.conf"
|
|
382
|
+
run "nginx -t", sudo: true
|
|
383
|
+
service "nginx", action: %i[enable restart]
|
|
390
384
|
end
|
|
391
385
|
```
|
|
392
386
|
|
|
@@ -529,6 +523,67 @@ sync "./config", "/etc/app",
|
|
|
529
523
|
- 同步静态资源文件
|
|
530
524
|
- 保持本地和远程目录结构一致
|
|
531
525
|
|
|
526
|
+
### Chef 风格资源 DSL
|
|
527
|
+
|
|
528
|
+
Kdeploy 提供类似 Chef 的声明式资源 DSL,可替代或与底层原语(`run`、`upload`、`upload_template`)混用。
|
|
529
|
+
|
|
530
|
+
#### `package` - 安装系统包
|
|
531
|
+
|
|
532
|
+
```ruby
|
|
533
|
+
package "nginx"
|
|
534
|
+
package "nginx", version: "1.18"
|
|
535
|
+
package "nginx", platform: :yum # CentOS/RHEL
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
默认使用 apt(Ubuntu/Debian);`platform: :yum` 生成 yum 命令。
|
|
539
|
+
|
|
540
|
+
#### `service` - 管理系统服务(systemd)
|
|
541
|
+
|
|
542
|
+
```ruby
|
|
543
|
+
service "nginx", action: [:enable, :start]
|
|
544
|
+
service "nginx", action: :restart
|
|
545
|
+
service "nginx", action: [:stop, :disable]
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
支持 `:start`、`:stop`、`:restart`、`:reload`、`:enable`、`:disable`。
|
|
549
|
+
|
|
550
|
+
#### `template` - 部署 ERB 模板
|
|
551
|
+
|
|
552
|
+
```ruby
|
|
553
|
+
template "/etc/nginx/nginx.conf", source: "./config/nginx.conf.erb", variables: { port: 3000 }
|
|
554
|
+
# 或 block 语法
|
|
555
|
+
template "/etc/app.conf" do
|
|
556
|
+
source "./config/app.erb"
|
|
557
|
+
variables(domain: "example.com")
|
|
558
|
+
end
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
#### `file` - 上传本地文件
|
|
562
|
+
|
|
563
|
+
```ruby
|
|
564
|
+
file "/etc/nginx/conf.d/app.conf", source: "./config/app.conf"
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
#### `directory` - 确保远程目录存在
|
|
568
|
+
|
|
569
|
+
```ruby
|
|
570
|
+
directory "/etc/nginx/conf.d"
|
|
571
|
+
directory "/var/log/app", mode: "0755"
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
**示例:使用资源 DSL 部署 Nginx**
|
|
575
|
+
|
|
576
|
+
```ruby
|
|
577
|
+
task :deploy_nginx, roles: :web do
|
|
578
|
+
package "nginx"
|
|
579
|
+
directory "/etc/nginx/conf.d"
|
|
580
|
+
template "/etc/nginx/nginx.conf", source: "./config/nginx.conf.erb", variables: { port: 3000 }
|
|
581
|
+
file "/etc/nginx/conf.d/app.conf", source: "./config/app.conf"
|
|
582
|
+
run "nginx -t"
|
|
583
|
+
service "nginx", action: [:enable, :restart]
|
|
584
|
+
end
|
|
585
|
+
```
|
|
586
|
+
|
|
532
587
|
### 模板支持
|
|
533
588
|
|
|
534
589
|
Kdeploy 支持 ERB(嵌入式 Ruby)模板,用于动态配置生成。
|
|
@@ -575,11 +630,8 @@ http {
|
|
|
575
630
|
|
|
576
631
|
```ruby
|
|
577
632
|
task :deploy_config do
|
|
578
|
-
|
|
579
|
-
domain_name: "example.com",
|
|
580
|
-
port: 3000,
|
|
581
|
-
worker_processes: 4,
|
|
582
|
-
worker_connections: 2048
|
|
633
|
+
template "/etc/nginx/nginx.conf", source: "./config/nginx.conf.erb",
|
|
634
|
+
variables: { domain_name: "example.com", port: 3000, worker_processes: 4, worker_connections: 2048 }
|
|
583
635
|
end
|
|
584
636
|
```
|
|
585
637
|
|
|
@@ -642,15 +694,11 @@ verify_host_key: true
|
|
|
642
694
|
|
|
643
695
|
```ruby
|
|
644
696
|
task :deploy do
|
|
645
|
-
if ENV['ENVIRONMENT'] == 'production'
|
|
646
|
-
run "sudo systemctl stop nginx"
|
|
647
|
-
end
|
|
697
|
+
service "nginx", action: :stop if ENV['ENVIRONMENT'] == 'production'
|
|
648
698
|
|
|
649
|
-
|
|
699
|
+
file "/etc/nginx/nginx.conf", source: "./config/nginx.conf"
|
|
650
700
|
|
|
651
|
-
if ENV['ENVIRONMENT'] == 'production'
|
|
652
|
-
run "sudo systemctl start nginx"
|
|
653
|
-
end
|
|
701
|
+
service "nginx", action: :start if ENV['ENVIRONMENT'] == 'production'
|
|
654
702
|
end
|
|
655
703
|
```
|
|
656
704
|
|
|
@@ -673,9 +721,10 @@ end
|
|
|
673
721
|
|
|
674
722
|
```ruby
|
|
675
723
|
task :deploy do
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
run "
|
|
724
|
+
service "nginx", action: :stop
|
|
725
|
+
file "/etc/nginx/nginx.conf", source: "./config/nginx.conf"
|
|
726
|
+
run "nginx -t" || raise "Nginx 配置无效"
|
|
727
|
+
service "nginx", action: :start
|
|
679
728
|
end
|
|
680
729
|
```
|
|
681
730
|
|
|
@@ -753,10 +802,9 @@ end
|
|
|
753
802
|
### 3. 使用模板进行动态配置
|
|
754
803
|
|
|
755
804
|
```ruby
|
|
756
|
-
# ✅ 好的做法 -
|
|
757
|
-
|
|
758
|
-
domain_name: "example.com",
|
|
759
|
-
port: 3000
|
|
805
|
+
# ✅ 好的做法 - 使用 template 资源
|
|
806
|
+
template "/etc/nginx/nginx.conf", source: "./config/nginx.conf.erb",
|
|
807
|
+
variables: { domain_name: "example.com", port: 3000 }
|
|
760
808
|
|
|
761
809
|
# ❌ 避免 - 硬编码值
|
|
762
810
|
run "echo 'server_name example.com;' > /etc/nginx/nginx.conf"
|
|
@@ -766,12 +814,10 @@ run "echo 'server_name example.com;' > /etc/nginx/nginx.conf"
|
|
|
766
814
|
|
|
767
815
|
```ruby
|
|
768
816
|
task :deploy do
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
upload "./config/nginx.conf", "/etc/nginx/nginx.conf"
|
|
774
|
-
run "sudo systemctl reload nginx"
|
|
817
|
+
template "/etc/nginx/nginx.conf", source: "./config/nginx.conf.erb", variables: { port: 3000 }
|
|
818
|
+
file "/etc/nginx/conf.d/app.conf", source: "./config/app.conf"
|
|
819
|
+
run "nginx -t", sudo: true # 配置无效时 run 会抛异常
|
|
820
|
+
service "nginx", action: :reload
|
|
775
821
|
end
|
|
776
822
|
```
|
|
777
823
|
|
|
@@ -875,7 +921,6 @@ kdeploy execute deploy.rb deploy --parallel 3
|
|
|
875
921
|
- **Executor** (`executor.rb`): SSH/SCP 执行引擎
|
|
876
922
|
- **Runner** (`runner.rb`): 并发任务执行协调器
|
|
877
923
|
- **CommandExecutor** (`command_executor.rb`): 单个命令执行
|
|
878
|
-
- **CommandGrouper** (`command_grouper.rb`): 命令分组逻辑
|
|
879
924
|
- **Template** (`template.rb`): ERB 模板渲染
|
|
880
925
|
- **Output** (`output.rb`): 输出格式化和显示
|
|
881
926
|
- **Configuration** (`configuration.rb`): 配置管理
|
|
@@ -885,10 +930,9 @@ kdeploy execute deploy.rb deploy --parallel 3
|
|
|
885
930
|
|
|
886
931
|
1. **解析配置**: 加载并解析 `deploy.rb`
|
|
887
932
|
2. **解析主机**: 根据任务定义确定目标主机
|
|
888
|
-
3.
|
|
889
|
-
4.
|
|
890
|
-
5.
|
|
891
|
-
6. **显示输出**: 格式化并向用户显示结果
|
|
933
|
+
3. **并发执行**: 跨主机并行运行任务,按序执行每台主机上的命令
|
|
934
|
+
4. **收集结果**: 收集执行结果和状态
|
|
935
|
+
5. **显示输出**: 格式化并向用户显示结果
|
|
892
936
|
|
|
893
937
|
### 并发模型
|
|
894
938
|
|
|
@@ -928,7 +972,6 @@ kdeploy/
|
|
|
928
972
|
│ ├── executor.rb # SSH/SCP 执行器
|
|
929
973
|
│ ├── runner.rb # 任务运行器
|
|
930
974
|
│ ├── command_executor.rb # 命令执行器
|
|
931
|
-
│ ├── command_grouper.rb # 命令分组器
|
|
932
975
|
│ ├── template.rb # 模板处理器
|
|
933
976
|
│ ├── output.rb # 输出接口
|
|
934
977
|
│ ├── configuration.rb # 配置
|
|
@@ -1012,7 +1055,14 @@ bundle exec rubocop -a
|
|
|
1012
1055
|
|
|
1013
1056
|
### 示例项目
|
|
1014
1057
|
|
|
1015
|
-
|
|
1058
|
+
本仓库的 [sample/](sample/) 目录提供完整示例,包含 Nginx、Node Exporter、目录同步等任务,支持 Vagrant 本地测试:
|
|
1059
|
+
|
|
1060
|
+
```bash
|
|
1061
|
+
cd sample
|
|
1062
|
+
vagrant up
|
|
1063
|
+
kdeploy execute deploy.rb deploy_web --dry-run # 预览
|
|
1064
|
+
kdeploy execute deploy.rb deploy_web # 执行
|
|
1065
|
+
```
|
|
1016
1066
|
|
|
1017
1067
|
### 常见部署场景
|
|
1018
1068
|
|
|
@@ -1053,12 +1103,9 @@ end
|
|
|
1053
1103
|
|
|
1054
1104
|
```ruby
|
|
1055
1105
|
task :update_config, roles: :web do
|
|
1056
|
-
|
|
1057
|
-
environment: "production",
|
|
1058
|
-
|
|
1059
|
-
redis_url: ENV['REDIS_URL']
|
|
1060
|
-
|
|
1061
|
-
run "sudo systemctl reload app"
|
|
1106
|
+
template "/etc/app/config.yml", source: "./config/app.yml.erb",
|
|
1107
|
+
variables: { environment: "production", database_url: ENV['DATABASE_URL'], redis_url: ENV['REDIS_URL'] }
|
|
1108
|
+
service "app", action: :reload
|
|
1062
1109
|
end
|
|
1063
1110
|
```
|
|
1064
1111
|
|
|
@@ -1066,16 +1113,11 @@ end
|
|
|
1066
1113
|
|
|
1067
1114
|
```ruby
|
|
1068
1115
|
task :deploy_app, roles: :web do
|
|
1069
|
-
# 同步应用程序代码,忽略开发文件
|
|
1070
1116
|
sync "./app", "/var/www/app",
|
|
1071
1117
|
ignore: [".git", "*.log", "node_modules", ".env.local", "*.tmp"],
|
|
1072
1118
|
delete: true
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
sync "./config", "/etc/app",
|
|
1076
|
-
exclude: ["*.example", "*.bak"]
|
|
1077
|
-
|
|
1078
|
-
run "sudo systemctl restart app"
|
|
1119
|
+
sync "./config", "/etc/app", exclude: ["*.example", "*.bak"]
|
|
1120
|
+
service "app", action: :restart
|
|
1079
1121
|
end
|
|
1080
1122
|
```
|
|
1081
1123
|
|
|
@@ -1088,7 +1130,7 @@ end
|
|
|
1088
1130
|
- **GitHub**: https://github.com/kevin197011/kdeploy
|
|
1089
1131
|
- **RubyGems**: https://rubygems.org/gems/kdeploy
|
|
1090
1132
|
- **Issues**: https://github.com/kevin197011/kdeploy/issues
|
|
1091
|
-
-
|
|
1133
|
+
- **示例**: [sample/](sample/) 目录(含 Vagrant 配置)
|
|
1092
1134
|
|
|
1093
1135
|
## 🙏 致谢
|
|
1094
1136
|
|