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    /// 查询流水线Stage详情。Get pipeline build stage detail.
27    pub async fn get_repo_build_logs_stage_sn_pipeline_id_stage_id(
28        &self,
29        repo: String,
30        sn: String,
31        pipeline_id: String,
32        stage_id: String,
33    ) -> Result<Value> {
34        let path = format!("/{}/-/build/logs/stage/{}/{}/{}", repo, sn, pipeline_id, stage_id);
35        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
36        
37
38                let request = self.client.request(
39            reqwest::Method::GET,
40            url
41        );
42        
43
44
45
46        let response = request.send().await?;
47        
48        if response.status().is_success() {
49            let json: Value = response.json().await?;
50            Ok(json)
51        } else {
52            Err(ApiError::HttpError(response.status().as_u16()))
53        }
54    }
55
56    /// 查询流水线构建状态。Get pipeline build status.
57    pub async fn get_repo_build_status_sn(
58        &self,
59        repo: String,
60        sn: String,
61    ) -> Result<Value> {
62        let path = format!("/{}/-/build/status/{}", repo, sn);
63        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
64        
65
66                let request = self.client.request(
67            reqwest::Method::GET,
68            url
69        );
70        
71
72
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    /// 开始一个构建。Start a build.
85    pub async fn post_repo_build_start(
86        &self,
87        repo: String,
88        request_data: serde_json::Value,
89    ) -> Result<Value> {
90        let path = format!("/{}/-/build/start", repo);
91        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
92        
93
94        
95        let mut request = self.client.request(
96            reqwest::Method::POST,
97            url
98        );
99
100
101
102        request = request.json(&request_data);
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    /// 删除流水线日志内容。Delete pipeline logs content.
115    pub async fn delete_repo_build_logs_sn(
116        &self,
117        repo: String,
118        sn: String,
119    ) -> Result<Value> {
120        let path = format!("/{}/-/build/logs/{}", repo, sn);
121        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
122        
123
124                let request = self.client.request(
125            reqwest::Method::DELETE,
126            url
127        );
128        
129
130
131
132        let response = request.send().await?;
133        
134        if response.status().is_success() {
135            let json: Value = response.json().await?;
136            Ok(json)
137        } else {
138            Err(ApiError::HttpError(response.status().as_u16()))
139        }
140    }
141
142    /// 流水线runner日志下载。Pipeline runner log download.
143    pub async fn get_repo_build_runner_download_log_pipeline_id(
144        &self,
145        repo: String,
146        pipeline_id: String,
147    ) -> Result<Value> {
148        let path = format!("/{}/-/build/runner/download/log/{}", repo, pipeline_id);
149        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
150        
151
152                let request = self.client.request(
153            reqwest::Method::GET,
154            url
155        );
156        
157
158
159
160        let response = request.send().await?;
161        
162        if response.status().is_success() {
163            let json: Value = response.json().await?;
164            Ok(json)
165        } else {
166            Err(ApiError::HttpError(response.status().as_u16()))
167        }
168    }
169
170    /// 查询流水线构建列表。List pipeline builds.
171    pub async fn get_repo_build_logs(
172        &self,
173        repo: String,
174        create_time: Option<String>,
175        end_time: Option<String>,
176        event: Option<String>,
177        page: Option<i64>,
178        pagesize: Option<i64>,
179        sha: Option<String>,
180        sn: Option<String>,
181        source_ref: Option<String>,
182        status: Option<String>,
183        target_ref: Option<String>,
184        user_id: Option<String>,
185        user_name: Option<String>,
186    ) -> Result<Value> {
187        let path = format!("/{}/-/build/logs", repo);
188        let mut url = Url::parse(&format!("{}{}", self.base_url, path))?;
189        
190        if let Some(value) = create_time {
191            url.query_pairs_mut().append_pair("createTime", &value.to_string());
192        }
193        if let Some(value) = end_time {
194            url.query_pairs_mut().append_pair("endTime", &value.to_string());
195        }
196        if let Some(value) = event {
197            url.query_pairs_mut().append_pair("event", &value.to_string());
198        }
199        if let Some(value) = page {
200            url.query_pairs_mut().append_pair("page", &value.to_string());
201        }
202        if let Some(value) = pagesize {
203            url.query_pairs_mut().append_pair("pagesize", &value.to_string());
204        }
205        if let Some(value) = sha {
206            url.query_pairs_mut().append_pair("sha", &value.to_string());
207        }
208        if let Some(value) = sn {
209            url.query_pairs_mut().append_pair("sn", &value.to_string());
210        }
211        if let Some(value) = source_ref {
212            url.query_pairs_mut().append_pair("sourceRef", &value.to_string());
213        }
214        if let Some(value) = status {
215            url.query_pairs_mut().append_pair("status", &value.to_string());
216        }
217        if let Some(value) = target_ref {
218            url.query_pairs_mut().append_pair("targetRef", &value.to_string());
219        }
220        if let Some(value) = user_id {
221            url.query_pairs_mut().append_pair("userId", &value.to_string());
222        }
223        if let Some(value) = user_name {
224            url.query_pairs_mut().append_pair("userName", &value.to_string());
225        }
226
227                let request = self.client.request(
228            reqwest::Method::GET,
229            url
230        );
231        
232
233
234
235        let response = request.send().await?;
236        
237        if response.status().is_success() {
238            let json: Value = response.json().await?;
239            Ok(json)
240        } else {
241            Err(ApiError::HttpError(response.status().as_u16()))
242        }
243    }
244
245    /// 停止一个构建。 Stop a build.
246    pub async fn post_repo_build_stop_sn(
247        &self,
248        repo: String,
249        sn: String,
250    ) -> Result<Value> {
251        let path = format!("/{}/-/build/stop/{}", repo, sn);
252        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
253        
254
255                let request = self.client.request(
256            reqwest::Method::POST,
257            url
258        );
259        
260
261
262
263        let response = request.send().await?;
264        
265        if response.status().is_success() {
266            let json: Value = response.json().await?;
267            Ok(json)
268        } else {
269            Err(ApiError::HttpError(response.status().as_u16()))
270        }
271    }
272
273}