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

Jenkins在向API发布删除请求时返回(403)Forbidden

我认为问题是,当你使用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;
    }
}

我知道这并不好看,但由于缺乏更好的解决方案,这项工作就完成了。

希望这也能帮助那些一直在挣扎的人们。如果你找到更好的解决方案,请告诉我。