2 files changed
+52
-11
crates/cli/src/deploy/mod.rs
+52
-10
@@ -14,11 +14,15 @@ use config::check_config;
14
use git::remote_deployment_setup;
15
use git2::{PushOptions, RemoteCallbacks, Repository};
16
use remote_messages::{build_next_app, start_server};
17
-use smbcloud_model::project::DeploymentPayload;
18
-use smbcloud_model::project::DeploymentStatus;
17
+use smbcloud_model::project::{DeploymentPayload, DeploymentStatus};
18
use smbcloud_networking::{environment::Environment, get_smb_token};
20
-use smbcloud_networking_project::crud_project_deployment_create::create;
19
+use smbcloud_networking_project::{
20
+ crud_project_deployment_create::create, crud_project_deployment_update::update,
21
+};
22
use spinners::Spinner;
23
+use std::sync::atomic::AtomicBool;
24
+use std::sync::atomic::Ordering;
25
+use std::sync::Arc;
26
27
pub async fn process_deploy(env: Environment) -> Result<CommandResult> {
28
// Check credentials.
@@ -33,7 +37,7 @@ pub async fn process_deploy(env: Environment) -> Result<CommandResult> {
37
let config = check_config(env).await?;
38
39
// Validate config with project.
36
- check_project(env, &access_token, config.project.id).await?;
40
+ check_project(env, &access_token, config.project.id.clone()).await?;
41
42
// Check remote repository setup.
43
let repo = match Repository::open(".") {
@@ -68,7 +72,7 @@ pub async fn process_deploy(env: Environment) -> Result<CommandResult> {
72
status: DeploymentStatus::Started,
73
};
74
71
- let _deployment = create(env, config.project.id, payload).await?;
75
+ let created_deployment = create(env, config.project.id.clone(), payload).await?;
76
let user = me(env).await?;
77
78
let mut push_opts = PushOptions::new();
@@ -76,6 +80,7 @@ pub async fn process_deploy(env: Environment) -> Result<CommandResult> {
80
81
// For updating status to failed
82
let deployment_failed_flag = Arc::new(AtomicBool::new(false));
83
+ let update_env = env; // Env is Copy
84
let update_access_token = access_token.clone();
85
let update_project_id = config.project.id.clone();
86
let update_deployment_id = created_deployment.id.clone();
@@ -96,12 +101,49 @@ pub async fn process_deploy(env: Environment) -> Result<CommandResult> {
101
}
102
true // continue receiving.
103
});
99
- callbacks.push_update_reference(|_x, status_message| match status_message {
100
- Some(e) => {
101
- println!("Deployment fail: {}", e);
102
- Ok(())
104
+ callbacks.push_update_reference({
105
+ let flag_clone = deployment_failed_flag.clone();
106
+ let access_token_for_update_cb = update_access_token.clone();
107
+ let project_id_for_update_cb = update_project_id.clone();
108
+ let deployment_id_for_update_cb = update_deployment_id.clone();
109
+
110
+ move |_refname, status_message| {
111
+ if let Some(e) = status_message {
112
+ // Try to set the flag. If it was already true, do nothing.
113
+ if !flag_clone.swap(true, Ordering::SeqCst) {
114
+ println!(
115
+ "Deployment ref update failed: {}. Marking deployment as Failed.",
116
+ e
117
+ );
118
+
119
+ let update_payload = DeploymentPayload {
120
+ commit_hash: commit_hash.to_string(),
121
+ status: DeploymentStatus::Failed,
122
+ };
123
+
124
+ // We are in a sync callback, so we need to block on the async task.
125
+ let handle = tokio::runtime::Handle::current();
126
+ let result = handle.block_on(async {
127
+ update(
128
+ update_env, // Env is Copy
129
+ access_token_for_update_cb.clone(),
130
+ project_id_for_update_cb.clone(),
131
+ deployment_id_for_update_cb.clone(),
132
+ update_payload,
133
+ )
134
+ .await
135
+ });
136
+
137
+ match result {
138
+ Ok(_) => println!("Deployment status successfully updated to Failed."),
139
+ Err(update_err) => {
140
+ eprintln!("Error updating deployment status to Failed: {}", update_err)
141
+ }
142
+ }
143
+ }
144
+ }
145
+ Ok(()) // Report success for the git callback itself, error is handled above.
146
}
104
- None => Ok(()),
147
});
148
push_opts.remote_callbacks(callbacks);
149
crates/smbcloud-networking-project/src/crud_project_deployment_update.rs
-1
@@ -22,4 +22,3 @@ pub async fn update(
22
.header("Authorization", access_token);
23
request(builder).await
24
}
25
-