Как сказал Эндрю в своем ответе , нет простого способа сделать это через REST API. Я в настоящее время сталкиваюсь с той же самой проблемой и придумал некоторый веб-просмотр. Это необходимо, поскольку Jenkins в конечном итоге ожидает, что Jenkins-Crumb будет предоставлен через POST-запрос на удаление пользователя.
Всякий раз, когда вы хотите Люди> Нажмите Идентификатор пользователя> Удалить пользователя, вы должны подтвердить, что действительно хотите удалить этого пользователя. Помимо этой очевидной кнопки Да есть некоторые скрытые поля формы, одно из которых называется Jenkins-Crumb . При нажатии кнопки Да значение этого поля отправляется с запросом / doDelete POST.
Решением, которое я придумал, является чтение Jenkins-Crumb после GETting https://<your-jenkins-url>/user/<username-to-delete>/delete
, а затем выполнение запроса POST на https://<your-jenkins-url>/user/<username-to-delete>/doDelete
с Jenkins-Crumb, предоставленным в качестве данных формы. Хотя поле формы Jenkins-Crumb заполняется с помощью JavaScript, нет необходимости выполнять JavaScript, поскольку скрипт напрямую включается как <script>crumb.init("Jenkins-Crumb", "jenkins-crumb-value");</script>
в исходный код HTML, где его можно сопоставить через RegEx .
В Python это может выглядеть как
import re, requests, sys
with requests.Session() as s:
s.auth = (ADMIN_USERNAME, ADMIN_APIKEY_OR_PASSWORD)
url = "https://YOUR_JENKINS_URL/user/USER_TO_DELETE/delete"
response = s.get(url)
if not response.ok:
sys.exit("HTTP error {} while accessing Jenkins at {}. Exiting.".format(response.status_code, url))
re_match = re.search(r'<script>crumb\.init\("Jenkins-Crumb", "(\w+)"\);<\/script>', response.text)
if not re_match:
sys.exit("Couldn't get required Jenkins-Crumb. Exiting.")
jenkins_crumb = re_match.group(1)
url = "https://YOUR_JENKINS_URL/user/USER_TO_DELETE/doDelete"
data = { "Jenkins-Crumb": jenkins_crumb }
response = s.post(url, params=data)
if not response.ok:
sys.exit("Couldn't delete user")
s.close()