修复Jenkins构建地址归一化
Project CI / Repository checks (push) Successful in 59s
Project CI / Backend tests (push) Has been cancelled
Project CI / Native shell tests (push) Has been cancelled
Project CI / Frontend tests (push) Has been cancelled

将 Jenkins 返回的外部构建路径重绑定到受信本机 origin
增加外部 Jenkins URL 的状态与产物轮询回归测试
This commit is contained in:
2026-08-15 18:12:39 +08:00
parent 7cd8b39593
commit 1a61c0bea7
2 changed files with 20 additions and 4 deletions
@@ -274,11 +274,27 @@ impl JenkinsClient {
}
fn resolve_trusted_url(&self, value: &str) -> Result<Url, String> {
let url = Url::parse(value)
let returned = Url::parse(value)
.or_else(|_| self.job_url.join(value))
.map_err(|_| "Jenkins 返回了无效 URL".to_string())?;
self.ensure_same_origin(&url)?;
Ok(url)
if !returned.username().is_empty()
|| returned.password().is_some()
|| !returned.path().starts_with(self.root_url.path())
{
return Err("Jenkins 返回了非受信源 URL".to_string());
}
let relative_path = returned
.path()
.strip_prefix(self.root_url.path())
.ok_or_else(|| "Jenkins 返回了非受信路径".to_string())?;
let mut trusted = self
.root_url
.join(relative_path)
.map_err(|_| "Jenkins 返回了无效 URL".to_string())?;
trusted.set_query(returned.query());
trusted.set_fragment(None);
self.ensure_same_origin(&trusted)?;
Ok(trusted)
}
fn ensure_same_origin(&self, url: &Url) -> Result<(), String> {
@@ -95,7 +95,7 @@ async fn mock_trigger(
async fn mock_queue(axum::extract::Path(id): axum::extract::Path<u64>) -> Json<Value> {
Json(
json!({"cancelled": false, "executable": {"url": format!("/jenkins/job/shared/job/Genarrative-Preview-Deployer/{id}/")}}),
json!({"cancelled": false, "executable": {"url": format!("http://192.168.35.82:8080/jenkins/job/shared/job/Genarrative-Preview-Deployer/{id}/")}}),
)
}