Отключить задание Jenkins из другого задания

есть ли способ в Jenkins (Hudson) отключить работу от другой работы?

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

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

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

  1. выполнить задание A, которое отключает задание 1
  2. сделайте некоторые вещи вне Дженкинса на основе вывода работа A
  3. выполнить задание B, которое снова включает задание 1

6 ответов


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

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

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

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

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

Вы можете сделать еще много мыслей с Groovy скриптами. Стоит почитать об этом подробнее.


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

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

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

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


мы использовали Плагин Распределителя Портов для этого. Это позволяет вашим заданиям "захватить" TCP-порт на время их выполнения, что означает, что никакое другое задание не может захватить этот порт на время, эффективно блокируя параллельное выполнение двух заданий, которые пытаются получить тот же порт.

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

обновление после уточнения вопроса:

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

это должно быть простым делом, чтобы использовать создайте шаг в задании, чтобы вызвать curl или аналогичный с соответствующими данными запроса.


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

мой код Groovy выглядит так:

import jenkins.*
import jenkins.model.*

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

вы можете попробовать build blocker plugin https://wiki.jenkins-ci.org/display/JENKINS/Build + Blocker + плагин


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

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

job("jobname"){
    using("jobname")
    disabled(true)
}
  1. это для фристайл рабочих мест. Если вам нужно отключить, например, задание конвейера, используйте pipelineJob вместо job.
  2. как правило, "jobname" необходимо включить папки, используя корень Дженкинса в качестве ссылки.
  3. чтобы восстановить работу, используйте disabled(false).