Отключить работу Дженкинса из другого задания

Есть ли способ в Дженкинсе (Хадсон) отключить работу из другой работы?

В основном у нас есть среда сборки, которая выполняет стандартное построение/тестирование. Мы также используем тот же экземпляр Jenkins, чтобы сделать некоторые другие вещи, такие как автоматическая установка новых версий нашего продукта (что необходимо для некоторых автоматических тестов). Когда мы выполняем некоторые "дополнительные" задания, мы хотим временно отключить "стандартные" задания (а затем автоматически включить их позже).

В идеале на задание будет добавлен дополнительный шаг сборки, чтобы сказать "Отключить задание XYZ". Или, если есть способ через ANT или что-то сказать Дженкинсу, чтобы отключить работу, это тоже сработает.

Update: Похоже, есть пара плагинов, которые предотвратят запуск двух заданий одновременно, но мне действительно нужно:

  • Запустить задание A, которое отключает работу 1
  • Сделайте некоторые вещи за пределами Дженкинса на основе результатов работы A
  • Запустите задание B, которые снова активируют задание 1

Ответ 1

Я нашел один возможный подход, используя jenkins-cli (интерфейс командной строки). Я добавил этот шаг сборки (для меня это была командная команда Windows, хотя я могу сделать ее script или что-то более элегантное):

java -jar C:\my\jenkins\path\jenkins-cli.jar -s %JENKINS_URL% disable-job "Job 1"

Я не смотрел, как получить путь к Дженкинсу, но это не должно быть слишком сложно.

Вот несколько информация о CLI. Вы также можете перейти к http://your-jenkins:8080/cli для некоторых доступных команд.

Ответ 2

Вы можете выполнить Groovy script как шаг предварительной сборки. Я делал это пару раз в своей компании. Вы должны установить плагин Groovy. Затем вы можете добавить шаг предварительной сборки "Выполнить систему Groovy script", и там вы можете выполнить что-то вроде этого:

Jenkins.instance.getItem("jobname").disable()

Для включения заданий после сборки добавьте шаг пост-сборки и выполните

Jenkins.instance.getItem("jobname").enable()

Если вы хотите задание, которое разрешает или отключает другие задания для сборки, вы не выбираете шаги до или после сборки, а обычный шаг сборки с системой Groovy script.

С помощью Groovy скриптов вы можете сделать много других идей. Стоит больше узнать об этом.

Ответ 3

Мы использовали Port Allocator Plugin для этого. Он позволяет вашим задачам "захватывать" порт TCP на время их запуска, а это означает, что никакая другая работа не может захватить этот порт на время, эффективно блокируя параллельное выполнение двух заданий, пытающихся получить один и тот же порт.

Существует также Locks and Latches Plugin, который звучит идеально, но мы обнаружили, что это сложно использовать, и это не кажется поддерживаться больше.

Обновление после выяснения вопроса:

Вы можете удаленно включить/отключить задание с помощью HTTP-приложения Jenkins. Если вы перейдете к любому заданию, затем поместите api в конец URL-адреса, вы увидите инструкции по HTTP-запросам, которые вам нужно сделать для этого. Например: http://ci.jruby.org/job/activerecord-jdbc-master/api (посмотрите на конец этой страницы - в основном POST на <job_url>/disable).

Нельзя просто использовать шаг сборки в задании, чтобы вызвать завиток или подобное с соответствующими данными запроса.

Ответ 4

У меня была эта же проблема и она была решена с помощью ответа dunni, мне нужно указать, что она работала только тогда, когда я выбираю "Execute system Groovy script" как мой шаг сборки, если я выберу "Execute Groovy script", он сообщает об ошибке Арун Сангал: "Пойманный: groovy.lang.MissingPropertyException: Нет такого свойства: Jenkins для класса: hudson8158411085491171644".

Мой Groovy код выглядит следующим образом:

import jenkins.*
import jenkins.model.*

try {
   Jenkins.instance.getItem("jobname").disable()
} catch (Exception ex) {
   printf("Error disabling jobname. " + ex.getMessage())
}

Ответ 6

Это можно сделать с помощью Job DSL Plugin без указания учетных данных.

DSL script для использования будет:

job("jobname"){
    using("jobname")
    disabled(true)
}
  • Это для работы Freestyle. Если вам нужно отключить, например, задание трубопровода, используйте pipelineJob вместо job.
  • Обычно "jobname" должен включать папки, используя корень Jenkins в качестве ссылки.
  • Чтобы повторно использовать задание, используйте disabled(false).

Ответ 7

Последняя версия Jenkins (от 2 и более) меняет имя метода.
Просто замените disable() на setDisabled(boolean)

Обнаружил, что это работает для меня:
Jenkins.instance.getItem("jobname").setDisabled(false)