@@ -7,6 +7,7 @@ use colored::Colorize;
7
7
use indexmap:: IndexMap ;
8
8
use serde:: Deserialize ;
9
9
use serde_json:: Value ;
10
+ use ssh2:: Session ;
10
11
use std:: path:: Path ;
11
12
use std:: process:: exit;
12
13
@@ -29,21 +30,99 @@ struct Deployment {
29
30
name : String ,
30
31
hosts : String ,
31
32
chdir : Option < String > ,
32
- tasks : Vec < Task > ,
33
+ tasks : Vec < common :: Task > ,
33
34
}
34
35
35
- #[ derive( Debug , Deserialize ) ]
36
- #[ serde( rename_all = "kebab-case" ) ]
37
- struct Task {
38
- name : String ,
39
- shell : Option < String > ,
40
- command : Option < String > ,
41
- register : Option < String > ,
42
- debug : Option < common:: Debug > ,
43
- vars : Option < IndexMap < String , String > > ,
44
- chdir : Option < String > ,
45
- when : Option < String > ,
46
- r#loop : Option < Vec < Value > > ,
36
+ fn process_tasks (
37
+ tasks : & [ common:: Task ] ,
38
+ is_localhost : bool ,
39
+ session : Option < & Session > ,
40
+ dep_chdir : Option < & str > ,
41
+ vars_map : & mut IndexMap < String , Value > ,
42
+ deploy_file_dir : & Path ,
43
+ ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
44
+ for task in tasks {
45
+ if !modules:: when:: process ( & task. when , vars_map) {
46
+ println ! ( "{}" , format!( "Skipping task: {}\n " , task. name) . yellow( ) ) ;
47
+ continue ;
48
+ }
49
+
50
+ println ! ( "{}" , format!( "Executing task: {}" , task. name) . cyan( ) ) ;
51
+
52
+ let task_chdir = task. chdir . as_deref ( ) . or ( dep_chdir) ; // Use task-level chdir if present, otherwise use top-level chdir
53
+
54
+ if let Some ( vars) = & task. vars {
55
+ for ( key, value) in vars {
56
+ let evaluated_value = utils:: replace_placeholders_vars ( & value, vars_map) ;
57
+ vars_map. insert ( key. clone ( ) , evaluated_value) ;
58
+ }
59
+ }
60
+
61
+ // Debug print to verify vars_map
62
+ // println!("Vars map: {:?}", vars_map);
63
+
64
+ let loop_items = task. r#loop . clone ( ) . unwrap_or_else ( || vec ! [ Value :: Null ] ) ;
65
+
66
+ for item in loop_items {
67
+ vars_map. shift_remove ( "item" ) ;
68
+
69
+ if !item. is_null ( ) {
70
+ vars_map. insert ( "item" . to_string ( ) , item. clone ( ) ) ;
71
+ }
72
+
73
+ if let Some ( debug) = & task. debug {
74
+ modules:: debug:: process ( debug, vars_map) ;
75
+ }
76
+
77
+ if let Some ( shell_command) = & task. shell {
78
+ let commands = utils:: split_commands ( shell_command) ;
79
+ modules:: command:: process (
80
+ commands,
81
+ is_localhost,
82
+ session,
83
+ true ,
84
+ task_chdir,
85
+ task. register . as_ref ( ) ,
86
+ vars_map,
87
+ ) ?;
88
+ }
89
+
90
+ if let Some ( command) = & task. command {
91
+ let commands = utils:: split_commands ( command) ;
92
+ modules:: command:: process (
93
+ commands,
94
+ is_localhost,
95
+ session,
96
+ false ,
97
+ task_chdir,
98
+ task. register . as_ref ( ) ,
99
+ vars_map,
100
+ ) ?;
101
+ }
102
+
103
+ if let Some ( include_file) = & task. include_tasks {
104
+ println ! (
105
+ "{}" ,
106
+ format!( "Including tasks from: {}\n " , include_file) . blue( )
107
+ ) ;
108
+ let include_file_path = deploy_file_dir. join ( include_file) ;
109
+ let included_tasks =
110
+ modules:: include_tasks:: process ( include_file_path. to_str ( ) . unwrap ( ) ) ?;
111
+ process_tasks (
112
+ & included_tasks,
113
+ is_localhost,
114
+ session,
115
+ task_chdir,
116
+ vars_map,
117
+ deploy_file_dir,
118
+ ) ?;
119
+ }
120
+ }
121
+
122
+ println ! ( ) ;
123
+ }
124
+
125
+ Ok ( ( ) )
47
126
}
48
127
49
128
fn main ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
@@ -114,6 +193,9 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
114
193
}
115
194
}
116
195
196
+ let deploy_file_path = Path :: new ( deploy_file) ;
197
+ let deploy_file_dir = deploy_file_path. parent ( ) . unwrap_or ( Path :: new ( "." ) ) ;
198
+
117
199
for dep in deployments {
118
200
println ! ( "{}" , format!( "Starting deployment: {}\n " , dep. name) . green( ) ) ;
119
201
@@ -148,69 +230,14 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
148
230
None
149
231
} ;
150
232
151
- for task in & dep. tasks {
152
- if !modules:: when:: process ( & task. when , & vars_map) {
153
- println ! ( "{}" , format!( "Skipping task: {}\n " , task. name) . yellow( ) ) ;
154
- continue ;
155
- }
156
-
157
- println ! ( "{}" , format!( "Executing task: {}" , task. name) . cyan( ) ) ;
158
-
159
- let task_chdir = task. chdir . as_deref ( ) . or ( dep. chdir . as_deref ( ) ) ; // Use task-level chdir if present, otherwise use top-level chdir
160
-
161
- if let Some ( vars) = & task. vars {
162
- for ( key, value) in vars {
163
- let evaluated_value =
164
- utils:: replace_placeholders_vars ( & value, & vars_map) ;
165
- vars_map. insert ( key. clone ( ) , evaluated_value) ;
166
- }
167
- }
168
-
169
- // Debug print to verify vars_map
170
- // println!("Vars map: {:?}", vars_map);
171
-
172
- let loop_items = task. r#loop . clone ( ) . unwrap_or_else ( || vec ! [ Value :: Null ] ) ;
173
-
174
- for item in loop_items {
175
- vars_map. shift_remove ( "item" ) ;
176
-
177
- if !item. is_null ( ) {
178
- vars_map. insert ( "item" . to_string ( ) , item. clone ( ) ) ;
179
- }
180
-
181
- if let Some ( debug) = & task. debug {
182
- modules:: debug:: process ( debug, & vars_map) ;
183
- }
184
-
185
- if let Some ( shell_command) = & task. shell {
186
- let commands = utils:: split_commands ( shell_command) ;
187
- modules:: command:: process (
188
- commands,
189
- is_localhost,
190
- session. as_ref ( ) ,
191
- true ,
192
- task_chdir,
193
- task. register . as_ref ( ) ,
194
- & mut vars_map,
195
- ) ?;
196
- }
197
-
198
- if let Some ( command) = & task. command {
199
- let commands = utils:: split_commands ( command) ;
200
- modules:: command:: process (
201
- commands,
202
- is_localhost,
203
- session. as_ref ( ) ,
204
- false ,
205
- task_chdir,
206
- task. register . as_ref ( ) ,
207
- & mut vars_map,
208
- ) ?;
209
- }
210
- }
211
-
212
- println ! ( ) ;
213
- }
233
+ process_tasks (
234
+ & dep. tasks ,
235
+ is_localhost,
236
+ session. as_ref ( ) ,
237
+ dep. chdir . as_deref ( ) ,
238
+ & mut vars_map,
239
+ deploy_file_dir,
240
+ ) ?;
214
241
} else {
215
242
eprintln ! (
216
243
"{}" ,
0 commit comments