@smbcloud / cli / commits / d45a999

update deployment status

Seto Elkahfi committed May 31, 2025 at 19:16 UTC d45a99950ac74d7b75d20a6b71d225dffab738e5
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 -