rust_cnb/
build.rs

1//! Build API 客户端
2
3use crate::error::{ApiError, Result};
4use reqwest::Client;
5use serde_json::Value;
6use url::Url;
7
8/// Build API 客户端
9pub struct BuildClient {
10    base_url: String,
11    client: Client,
12}
13
14impl BuildClient {
15    /// 创建新的 Build API 客户端
16    pub fn new(base_url: String, client: Client) -> Self {
17        Self { base_url, client }
18    }
19
20    /// 设置认证信息
21    pub fn with_auth(self, token: &str) -> Self {
22        // 这里可以扩展认证逻辑
23        self
24    }
25
26    /// 停止一个构建。 Stop a build.
27    pub async fn post_repo_build_stop_sn(
28        &self,
29        repo: String,
30        sn: String,
31    ) -> Result<Value> {
32        let path = format!("/{}/-/build/stop/{}", repo, sn);
33        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
34        
35
36                let request = self.client.request(
37            reqwest::Method::POST,
38            url
39        );
40        
41
42
43
44        let response = request.send().await?;
45        
46        if response.status().is_success() {
47            let json: Value = response.json().await?;
48            Ok(json)
49        } else {
50            Err(ApiError::HttpError(response.status().as_u16()))
51        }
52    }
53
54    /// 开始一个构建。Start a build.
55    pub async fn post_repo_build_start(
56        &self,
57        repo: String,
58        request_data: serde_json::Value,
59    ) -> Result<Value> {
60        let path = format!("/{}/-/build/start", repo);
61        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
62        
63
64        
65        let mut request = self.client.request(
66            reqwest::Method::POST,
67            url
68        );
69
70
71
72        request = request.json(&request_data);
73
74        let response = request.send().await?;
75        
76        if response.status().is_success() {
77            let json: Value = response.json().await?;
78            Ok(json)
79        } else {
80            Err(ApiError::HttpError(response.status().as_u16()))
81        }
82    }
83
84    /// 查询流水线Stage详情。Get pipeline build stage detail.
85    pub async fn get_repo_build_logs_stage_sn_pipeline_id_stage_id(
86        &self,
87        repo: String,
88        sn: String,
89        pipeline_id: String,
90        stage_id: String,
91    ) -> Result<Value> {
92        let path = format!("/{}/-/build/logs/stage/{}/{}/{}", repo, sn, pipeline_id, stage_id);
93        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
94        
95
96                let request = self.client.request(
97            reqwest::Method::GET,
98            url
99        );
100        
101
102
103
104        let response = request.send().await?;
105        
106        if response.status().is_success() {
107            let json: Value = response.json().await?;
108            Ok(json)
109        } else {
110            Err(ApiError::HttpError(response.status().as_u16()))
111        }
112    }
113
114    /// 查询流水线构建列表。List pipeline builds.
115    pub async fn get_repo_build_logs(
116        &self,
117        repo: String,
118        create_time: Option<String>,
119        end_time: Option<String>,
120        event: Option<String>,
121        page: Option<i64>,
122        pagesize: Option<i64>,
123        sha: Option<String>,
124        sn: Option<String>,
125        source_ref: Option<String>,
126        status: Option<String>,
127        target_ref: Option<String>,
128        user_id: Option<String>,
129        user_name: Option<String>,
130    ) -> Result<Value> {
131        let path = format!("/{}/-/build/logs", repo);
132        let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
133        
134        if let Some(value) = create_time {
135            url.query_pairs_mut().append_pair("createTime", &value.to_string());
136        }
137        if let Some(value) = end_time {
138            url.query_pairs_mut().append_pair("endTime", &value.to_string());
139        }
140        if let Some(value) = event {
141            url.query_pairs_mut().append_pair("event", &value.to_string());
142        }
143        if let Some(value) = page {
144            url.query_pairs_mut().append_pair("page", &value.to_string());
145        }
146        if let Some(value) = pagesize {
147            url.query_pairs_mut().append_pair("pagesize", &value.to_string());
148        }
149        if let Some(value) = sha {
150            url.query_pairs_mut().append_pair("sha", &value.to_string());
151        }
152        if let Some(value) = sn {
153            url.query_pairs_mut().append_pair("sn", &value.to_string());
154        }
155        if let Some(value) = source_ref {
156            url.query_pairs_mut().append_pair("sourceRef", &value.to_string());
157        }
158        if let Some(value) = status {
159            url.query_pairs_mut().append_pair("status", &value.to_string());
160        }
161        if let Some(value) = target_ref {
162            url.query_pairs_mut().append_pair("targetRef", &value.to_string());
163        }
164        if let Some(value) = user_id {
165            url.query_pairs_mut().append_pair("userId", &value.to_string());
166        }
167        if let Some(value) = user_name {
168            url.query_pairs_mut().append_pair("userName", &value.to_string());
169        }
170
171                let request = self.client.request(
172            reqwest::Method::GET,
173            url
174        );
175        
176
177
178
179        let response = request.send().await?;
180        
181        if response.status().is_success() {
182            let json: Value = response.json().await?;
183            Ok(json)
184        } else {
185            Err(ApiError::HttpError(response.status().as_u16()))
186        }
187    }
188
189    /// 查询流水线构建状态。Get pipeline build status.
190    pub async fn get_repo_build_status_sn(
191        &self,
192        repo: String,
193        sn: String,
194    ) -> Result<Value> {
195        let path = format!("/{}/-/build/status/{}", repo, sn);
196        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
197        
198
199                let request = self.client.request(
200            reqwest::Method::GET,
201            url
202        );
203        
204
205
206
207        let response = request.send().await?;
208        
209        if response.status().is_success() {
210            let json: Value = response.json().await?;
211            Ok(json)
212        } else {
213            Err(ApiError::HttpError(response.status().as_u16()))
214        }
215    }
216
217}