Получить статус сборки на заданном рабочем узле Jenkins - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь настроить автоматизацию для постепенного удаления рабочего узла в Jenkins. В настоящее время я могу сделать следующее, чтобы узел прекратил принимать новые задания:

  JENKINS_CRUMB=$(curl -v -c /tmp/cookie -u "$user:$pass" "$JENKINS_URL/crumbIssuer/api/json" | jq -r '.crumb')
  echo "CSFR Token: $JENKINS_CRUMB"
  echo "Disabling Node $NODE_NAME"
  curl -v -b /tmp/cookie -u "$user:$pass" "$JENKINS_URL/computer/$NODE_NAME/toggleOffline"

  echo "Waiting for Jobs to Finish"
  ???

Но после этого я хочу дождаться завершения существующих работ, прежде чем скрипт завершится. Я просмотрел конечную точку /api/computer/, и она, кажется, перечисляет только имена узлов, но не указывает количество запущенных заданий. Я пробовал /computer/<worker name>/api/json и xml, и они показывают кучу атрибутов executor, но, похоже, они не заполнены метаданными при выполнении заданий. Они всегда пусты.

Это работает на AWS, и я в конечном итоге хочу вызвать его из Агента SSM (через ловушку жизненного цикла), срабатывающего всякий раз, когда групповая политика автоматического масштабирования хочет уменьшить узел , Моя цель - чистое завершение работы, ожидание завершения заданий sh, поэтому я не убиваю узел, пока у разработчика есть работа.

1 Ответ

0 голосов
/ 08 мая 2020

Я не смог найти способ сделать все через API Jenkins, но если вы используете имя пользователя и пароль и получаете токен CSFR, вы можете ввести команды для toggleOffline, которые будут устанавливать узел для новых заданий не будет работать, но существующие задания будут завершены sh. Затем вы можете запросить /computer/<NODE_NAME>/api/json (это вызов API, поэтому вам не нужен токен CSFR) и проверить параметр idle. Когда узел находится в режиме ожидания, вы можете вызвать doDelete

. В следующем фрагменте предполагается, что имя узла хранится в /node_name, а для $JENKINS_URL установлено значение http://yourjenkinshostname. $cookie - это просто расположение файла, поэтому вы можете установить его на /tmp/something, и, конечно, вам нужно указать имя пользователя и пароль.

  echo "Getting Jenkins CSFR Token"

  JENKINS_CRUMB=$(curl -c $cookie -u "$user:$pass" "$JENKINS_URL/crumbIssuer/api/json" | jq -r '.crumb')
  echo "CSFR Token: $JENKINS_CRUMB"

NODE_NAME=$(cat /node_name)

echo "Disabling Node $NODE_NAME"
curl -H "Jenkins-Crumb:$JENKINS_CRUMB" -X POST \
     -b $cookie -u "$user:$pass" "$JENKINS_URL/computer/$NODE_NAME/toggleOffline"

echo "Waiting for Jobs to Finish"

while true; do
  idle=$(curl -b $cookie -u "$user:$pass" "$JENKINS_URL/computer/$NODE_NAME/api/json" | jq ".idle")
  echo "Node Idle State: $idle"
  if [ "$idle" == "true" ]; then
    echo "Node is idle. Removing Node"
    curl -H "Jenkins-Crumb:$JENKINS_CRUMB" -X POST \
         -b $cookie -u "$user:$pass" "$JENKINS_URL/computer/$NODE_NAME/doDelete"
    exit 0
  else
    echo "Node is Still Busy. Waiting 30s..."
    sleep 30
  fi
done
...