Jenkins在向API发布删除请求时返回(403)Forbidden
本文关键字:请求 返回 Forbidden API 在向 布删除 Jenkins 删除 | 更新日期: 2023-09-27 18:29:08
我正试图使用C#脚本删除Jenkins作业。当我运行代码时,它实际上是有效的。作业已删除。然而,Jenkins仍然返回403错误。我做错什么了吗?
这是我的代码:
String credentials = ConfigurationManager.AppSettings["jenkinsUser"] + ":" + ConfigurationManager.AppSettings["jenkinsKey"];
String authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes(credentials));
try
{
using (WebClient wc = new WebClient())
{
wc.Headers[HttpRequestHeader.Authorization] = "Basic " + authorization;
string HtmlResult = wc.UploadString(ConfigurationManager.AppSettings["jenkinsDeleteJobUrl"], "POST", "");
Console.WriteLine("Success");
}
}
catch(WebException e)
{
Console.WriteLine("Something went wrong");
throw e;
}
我使用的url是[My Jenkins url]/job/{0}/doDelete
我也尝试过使用HttpWebRequest,得到了同样的结果。希望有人知道答案。
[Edit]请注意,当我使用Postman执行相同的请求时,它会顺利通过,重定向到Jenkins主页,返回代码为200。
这是邮差的电话:
POST /job/[jobname]/doDelete HTTP/1.1
Host: [my jenkins url]
Authorization: Basic [my auth hash]
Cache-Control: no-cache
我认为问题是,当你使用doDelete url删除Jenkins作业时,你会被重定向到你的Jenkins主页。由于您是用程序进行此操作的,Jenkins不会识别用户会话(即使您的原始请求包含Authorization标头),从而导致禁用代码。
作为一个变通办法,我做了以下工作:
try {
string credentials = ConfigurationManager.AppSettings["jenkinsUser"] + ":" + ConfigurationManager.AppSettings["jenkinsKey"];
string authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes(credentials));
using (WebClient wc = new WebClient())
{
wc.Headers[HttpRequestHeader.Authorization] = "Basic " + authorization;
string HtmlResult = wc.UploadString(String.Format(ConfigurationManager.AppSettings["jenkinsDeleteJobUrl"], jobName), "POST", "");
}
}
catch (WebException e)
{
// ignore the 403 error for now
HttpWebResponse errorResponse = e.Response as HttpWebResponse;
if(errorResponse.StatusCode != HttpStatusCode.Forbidden)
{
throw e;
}
}
// if the job no longer exists, it is proof that the request went through
if(!JenkinsHelper.GetJenkinsJobs().Contains(jobName))
{
Console.WriteLine("Job successfully deleted.");
return true;
}
else
{
Console.WriteLine("Could not delete job.");
return false;
}
使用这个助手函数,其中JenkinsJobListUrl=[MyJenkinsUrl]/api/xml?xpath=hudson/job/name&wrapper=作业
public static List<string> GetJenkinsJobs()
{
try
{
string credentials = ConfigurationManager.AppSettings["jenkinsUser"] + ":" + ConfigurationManager.AppSettings["jenkinsKey"];
string authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes(credentials));
using (WebClient wc = new WebClient())
{
wc.Headers[HttpRequestHeader.Authorization] = "Basic " + authorization;
string HtmlResult = wc.DownloadString(String.Format(ConfigurationManager.AppSettings["jenkinsJobListUrl"]));
XDocument doc = XDocument.Parse(HtmlResult);
return doc.Root.Elements("name").Select(element => element.Value).ToList();
}
}
catch (WebException e)
{
Console.WriteLine("Could not retreive Jenkins job list");
throw e;
}
}
我知道这并不好看,但由于缺乏更好的解决方案,这项工作就完成了。
希望这也能帮助那些一直在挣扎的人们。如果你找到更好的解决方案,请告诉我。