Как мне динамически запускать нисходящие сборки в jenkins? - PullRequest
13 голосов
/ 16 января 2012

Мы хотим динамически запускать интеграционные тесты в различных последующих сборках в jenkins.У нас есть проект параметризованного интеграционного теста, в котором в качестве параметра используется имя теста.Мы динамически определяем имена наших тестов из репозитория git.

У нас есть родительский проект, который использует jenkins-cli для запуска сборки проекта интеграции для каждого теста, найденного в исходном коде.Родительский проект и проект интеграции связаны через сопоставление отпечатков пальцев.

Проблема этого подхода заключается в том, что сводные результаты испытаний не работают.Я думаю, проблема в том, что «нисходящие» интеграционные тесты запускаются через jenkins-cli, поэтому jenkins не осознает, что они являются нисходящими.

Я посмотрел на многие плагины jenkins, чтобы попытаться заставить это работать.Плагины Join и Parameterized Trigger не помогают, потому что они ожидают создания статического списка проектов.Фабрики параметров, доступные для параметризованного триггера, также не будут работать, потому что нет фабрики для создания произвольного списка параметров.Плагин Log Trigger не будет работать.

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

Ответы [ 6 ]

12 голосов
/ 17 июня 2014
def job = hudson.model.Hudson.instance.getJob("job")
def params = new StringParameterValue('PARAMTEST', "somestring")  
def paramsAction = new ParametersAction(params) 
def cause = new hudson.model.Cause.UpstreamCause(currentBuild)
def causeAction = new hudson.model.CauseAction(cause) 
hudson.model.Hudson.instance.queue.schedule(job, 0, causeAction, paramsAction) 

Это то, что наконец-то сработало для меня.

5 голосов
/ 08 декабря 2012

ПРИМЕЧАНИЕ: Pipeline Plugin должен сделать этот вопрос спорным, но у меня не было возможности обновить нашу инфраструктуру.

Чтобы запустить последующее задание без параметров:

job = manager.hudson.getItem(name)
cause = new hudson.model.Cause.UpstreamCause(manager.build)
causeAction = new hudson.model.CauseAction(cause)
manager.hudson.queue.schedule(job, 0, causeAction)

Чтобы запустить последующее задание с параметрами , необходимо добавить ParametersAction. Предположим, что Job1 имеет параметры A и C, которые по умолчанию равны "B" и "D" соответственно. I.e.:

A == "B"
C == "D"

Предположим, что Job2 имеет те же параметры A и B, но также принимает параметр E, который по умолчанию равен "F". Следующий скрипт посткомпиляции в Job1 скопирует его параметры A и C и установит параметр E для объединения значений A и C:

params = []
val = ''
manager.build.properties.actions.each {
    if (it instanceof hudson.model.ParametersAction) {
        it.parameters.each {
            value = it.createVariableResolver(manager.build).resolve(it.name)
            params += it
            val += value
        }
    }
}

params += new hudson.model.StringParameterValue('E', val)
paramsAction = new hudson.model.ParametersAction(params)

jobName = 'Job2'
job = manager.hudson.getItem(jobName)
cause = new hudson.model.Cause.UpstreamCause(manager.build)
causeAction = new hudson.model.CauseAction(cause)
def waitingItem = manager.hudson.queue.schedule(job, 0, causeAction, paramsAction)
def childFuture = waitingItem.getFuture()
def childBuild = childFuture.get()

hudson.plugins.parameterizedtrigger.BuildInfoExporterAction.addBuildInfoExporterAction(
    manager.build, childProjectName, childBuild.number, childBuild.result
)

Вы должны добавить $JENKINS_HOME/plugins/parameterized-trigger/WEB-INF/classes к плагину Groovy Postbuild Additional groovy classpath.

1 голос
/ 29 ноября 2016

Выполнить этот Groovy скрипт

import hudson.model.*
import jenkins.model.*

def build = Thread.currentThread().executable

def jobPattern = "PUTHEREYOURJOBNAME"     
def matchedJobs = Jenkins.instance.items.findAll { job ->
    job.name =~ /$jobPattern/
}
matchedJobs.each { job ->
    println "Scheduling job name is: ${job.name}"
    job.scheduleBuild(1, new Cause.UpstreamCause(build), new ParametersAction([ new StringParameterValue("PROPERTY1", "PROPERTY1VALUE"),new StringParameterValue("PROPERTY2", "PROPERTY2VALUE")]))
}

Если вам не нужно передавать свойства из одной сборки в другую, просто уберите действие ParametersAction.

Запланированная вами сборка будет иметь ту же «причину», что и ваша первоначальная сборка. Это хороший способ пройти в «Изменения». Если вам это не нужно, просто не используйте новый Cause.UpstreamCause (build) в вызове функции

1 голос
/ 24 июня 2015

Это сработало для меня, используя "Выполнить систему Groovy Сценарий "

import hudson.model.*

def currentBuild = Thread.currentThread().executable

def job = hudson.model.Hudson.instance.getJob("jobname")
def params = new StringParameterValue('paramname', "somestring")  
def paramsAction = new ParametersAction(params) 
def cause = new hudson.model.Cause.UpstreamCause(currentBuild)
def causeAction = new hudson.model.CauseAction(cause) 
hudson.model.Hudson.instance.queue.schedule(job, 0, causeAction, paramsAction)
1 голос
/ 01 марта 2012

Используя плагин Groovy Postbuild, возможно, что-то вроде этого будет работать (не пробовал)

def job = hudson.getItem(jobname)
hudson.queue.schedule(job)

Я действительно удивлен, что если вы дактилоскопируете оба задания (например, с помощью переменной BUILD_TAG родительского задания), агрегированные результаты не будут получены. В моем понимании Дженкинс просто смотрит на md5sums, чтобы связать задания ( Агрегировать результаты тестов в нисходящем направлении и запуск через cli не должен влиять на агрегацию результатов. Каким-то образом происходит что-то дополнительное, чтобы поддерживать отношение вверх / вниз по потоку, которое я не в курсе ...

1 голос
/ 17 января 2012

Поскольку вы уже запускаете нижестоящие задания динамически, как насчет того, чтобы дождаться их завершения и скопировать файлы результатов теста (я бы заархивировал их для последующих заданий, а затем просто загрузил бы артефакты сборки) в родительское рабочее пространство.Вам может потребоваться объединить файлы вручную, в зависимости от того, может ли плагин Test работать с несколькими страницами результатов теста.На этапе пост-сборки родительских заданий настройте соответствующий тестовый плагин.

...