Как данные об аутентификации пользователей Jenkins "передаются" в script, который использует Jenkins API для создания заданий?

У меня есть script, который удаляет и повторно создает задания через завитые HTTP-вызовы, и я хочу избавиться от любого жестко заданного "имени пользователя: пароль". Например. curl -X POST $url --user username:password

Вопросы:

  • CLI Jenkins (возможно, не вариант). Нужно иметь то же самое с CLI, что и с Jenkins API (создание заданий и т.д.), Но насколько я понимаю, CLI Jenkins не является хорошей альтернативой для меня, поскольку созданные задания будут появляться только в Jenkins после перезапуска или "перезагрузить" Конфигурация с диска ", и это приведет к отмене любых других рабочих заданий.

  • API-маркер. Не удается узнать, как получить токен пользователя, а затем передать его как параметр для script, но это может быть решение.

Ответ 1

Попробуйте этот способ: (например, удалите задание)

curl --silent --show-error http://<username>:<api-token>@<jenkins-server>/job/<job-name>/doDelete

Апи-токен можно получить из http://<jenkins-server>/user/<username>/configure.

Ответ 2

Это сработало для меня:

curl -u $username:$api_token -FSubmit=Build 'http://<jenkins-server>/job/<job-name>/buildWithParameteres?environment='

Маркер API может быть получен из пользовательской конфигурации Jenkins.

Ответ 3

  • С CLI Jenkins вам не нужно перезагружать все - вы можете загрузить задание (команда update-job). Вы не можете использовать токены с CLI, AFAIK - вам нужно использовать пароль или файл паролей.

  • Имя токена для пользователя можно получить через http://<jenkins-server>/user/<username>/configure - нажать кнопку "Показать API-маркер".

  • Здесь ссылка о том, как использовать маркеры API (она использует wget, но curl очень похожа).

Ответ 4

Мне нужно было явно добавить POST в команду CURL:

curl -X POST http://<user>:<token>@<server>/safeRestart

У меня также есть плагин SafeRestart, если это имеет значение.

Ответ 5

Если вы хотите написать script для автоматизации создания заданий с помощью Jenkins API, вы можете использовать один из клиентов API для этого. Рубиновый клиент для Jenkins доступен по адресу https://github.com/arangamani/jenkins_api_client

gem install jenkins_api_client

require "rubygems"
require "jenkins_api_client"

# Initialize the client by passing in the server information
# and credentials to communicate with the server
client = JenkinsApi::Client.new(
  :server_ip => "127.0.0.1",
  :username => "awesomeuser",
  :password => "awesomepassword"
)

# The following block will create 10 jobs in Jenkins
# test_job_0, test_job_1, test_job_2, ...
10.times do |num|
  client.job.create_freestyle(:name => "test_job_#{num}")
end

# The jobs in Jenkins can be listed using
client.job.list_all

Клиент API может использоваться для выполнения большого количества операций.

Ответ 6

API-токен совпадает с паролем с точки зрения API, см. исходный код использует токен вместо паролей для API.

См. соответствующий ответ от @coffeebreaks в моем вопросе python-jenkins или jenkinsapi для API удаленного доступа jenkins в python

Другие описаны в doc для использования http базовой модели аутентификации

Ответ 7

Чтобы использовать маркеры API, пользователям необходимо будет получить свои собственные токены, каждый из которых находится от https://<jenkins-server>/me/configure или https://<jenkins-server>/user/<user-name>/configure. Вы, как автор script, должны определить, как пользователи подают токен на script. Например, в оболочке Bourne script, выполняющейся интерактивно внутри репозитория Git, где .gitignore содержит /.jenkins_api_token, вы можете сделать что-то вроде:

api_token_file="$(git rev-parse --show-cdup).jenkins_api_token"
api_token=$(cat "$api_token_file" || true)
if [ -z "$api_token" ]; then
    echo
    echo "Obtain your API token from $JENKINS_URL/user/$user/configure"
    echo "After entering here, it will be saved in $api_token_file; keep it safe!"
    read -p "Enter your Jenkins API token: " api_token
    echo $api_token > "$api_token_file"
fi
curl -u $user:$api_token $JENKINS_URL/someCommand