Как я могу запустить другую работу из конвейера jenkins (jenkinsfile) с помощью плагина GitHub Org?

142

Как я могу запустить сборку другой работы изнутри Jenkinsfile?

Я предполагаю, что эта работа - еще один репозиторий в той же организации github , в которой уже есть собственный файл Jenkins.

Я также хочу сделать это только в том случае, если имя ветки master, так как нет смысла запускать нисходящие сборки любых локальных веток.

Обновить:

stage 'test-downstream'
node {
     def job = build job: 'some-downtream-job-name'
}

Тем не менее, при выполнении я получаю ошибку

Не найдено параметризованного задания с именем some-downtream-job-name

Я уверен, что это задание существует в jenkins и находится в той же папке организации, что и текущая. Это другая работа, которая имеет свою Jenkinsfile.

Обратите внимание, что этот вопрос относится к подключаемому модулю GitHub Organization, который автоматически создает и поддерживает задания для каждого репозитория и ветви из вашей организации GitHub.

Сорин
источник

Ответы:

131

Прежде всего, это пустая трата слота исполнителя, чтобы обернуть buildшаг node. Ваш вышестоящий исполнитель просто бездействует без причины.

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

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

Таким образом, то, что вы хотели написать, вероятно,

if (env.BRANCH_NAME == 'master') {
    build '../other-repo/master'
}
Джесси Глик
источник
2
Спасибо! Если по каким-либо изменениям вы также знаете, как запустить эту сборку, не дожидаясь ее завершения, это будет потрясающе :)
sorin
48
Проверьте генератор фрагментов :build job: '../other-repo/master', wait: false
Джесси Глик
3
Есть ли способ вызвать шаг сборки с динамическим именем ветви? Что-то вроде того, build job: '../other-repo/$BRANCH_NAME'где $BRANCH_NAMEнаходится переменная среды Jenkins, относящаяся к ветви, выполняющей проект Multibranch?
msteppe91
2
если ${BRANCH_NAME}доступно как переменная окружения, подойдет простая подстановка строк. Просто не забудьте переключиться "с, 'чтобы процитировать вашу строку. напримерbuild job: "../other-repo/${BRANCH_NAME}"
Cinderhaze
3
Ссылка API для build job: jenkins.io/doc/pipeline/steps/pipeline-build-step
Кэти
123

В дополнение к вышеупомянутым ответам: я хотел начать работу с простого параметра, переданного во второй конвейер, и нашел ответ по адресу https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflow .

Так что я использовал:

stage ('Starting ART job') {
    build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}
FrankIJ
источник
11
rhoerbe
5
Возвращено ли BUILD_NUMBER задания Jenkins, вызванного buildкомандой? Как получить доступ к BUILD_NUMBER на одном из следующих этапов? Кто-нибудь знает, где эта команда задокументирована?
user909481
4
Это в build job: 'freestyle', parameters: [ string(name: 'param1', value:'test_param'), string(name:'dummy', value: "${index}")]настоящее время, из jenkins.io/doc/pipeline/examples/#jobs-in-parallel
BartBiczBoży
Но как использовать эти параметры, переданные во 2-м задании
Gentle
2
Интересно, build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]] что у меня не получилось, но: build job: 'RunArtInTest', parameters: [string(name: 'systemname', value: "${VALUE}")] сработало
Alberto C
24

Команда buildв pipe предназначена для запуска других заданий в jenkins.

Пример на github

Работа должна существовать в Jenkins и может быть параметризована. Что касается ветки, я думаю, вы можете прочитать это из Git

Фло
источник
3
Я попытался добавить, build job: 'jobnameно я получаю эту ошибку, No parameterized job named jobname foundи я могу заверить вас, что в папке организации есть работа с таким именем на том же уровне.
сорин
1
Да, есть работа, но эта работа не параметризована. Я пытаюсь понять, как параметризовать работу, созданную плагином организации GitHub, хотя
yiwen
6
Формат названия работы:build job: "${ORGANISATION_NAME}/${REPO_NAME}/master"
Сахил
2
@SahilAhuja Это совершенно произвольно и основано на вашем макете Jenkins, и если вы хотите использовать абсолютный путь, вам нужно начать с a /. Относительные пути в порядке; Проблема Сорина состояла, вероятно, в том, что вызов работы buildбыл многоотраслевым, что означает, что путь, подобный тому, jobnameбудет пытаться построить ветку jobnameтой же самой работы; это должно быть ../jobname/branchnameвместо этого
Майкл Мрозек
Это хорошо работает, но что произойдет, если указанная ветвь не существует?
Хайме Алькантара Арнела
17

Вы можете использовать build jobшаг из Jenkins Pipeline (минимальное требование Jenkins: 2.130).

Вот полный API для этого buildшага: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

Как использовать build:

  • job: Имя последующей работы для создания. Может быть другая работа Pipeline, но чаще это фристайл или другой проект.
    • Используйте простое имя, если задание находится в той же папке, что и задание восходящего конвейера;
    • Вместо этого вы можете использовать относительные пути, такие как../sister-folder/downstream
    • Или вы можете использовать абсолютные пути, такие как/top-level-folder/nested-folder/downstream

Запустить другую работу, используя ветку в качестве параметра

В моей компании многие наши филиалы включают "/". Вы должны заменить любые экземпляры "/" на "% 2F" (как это указано в URL-адресе задания).

В этом примере мы используем относительные пути

    stage('Trigger Branch Build') {
        steps {
            script {
                    echo "Triggering job for branch ${env.BRANCH_NAME}"
                    BRANCH_TO_TAG=env.BRANCH_NAME.replace("/","%2F")
                    build job: "../my-relative-job/${BRANCH_TO_TAG}", wait: false
            }
        }
    }

Запустить другую работу, используя номер сборки в качестве параметра

build job: 'your-job-name', 
    parameters: [
        string(name: 'passed_build_number_param', value: String.valueOf(BUILD_NUMBER)),
        string(name: 'complex_param', value: 'prefix-' + String.valueOf(BUILD_NUMBER))
    ]

Запускать много рабочих мест параллельно

Источник: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/

Больше информации о Parallel здесь: https://jenkins.io/doc/book/pipeline/syntax/#parallel

    stage ('Trigger Builds In Parallel') {
        steps {
            // Freestyle build trigger calls a list of jobs
            // Pipeline build() step only calls one job
            // To run all three jobs in parallel, we use "parallel" step
            // https://jenkins.io/doc/pipeline/examples/#jobs-in-parallel
            parallel (
                linux: {
                    build job: 'full-build-linux', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                mac: {
                    build job: 'full-build-mac', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                windows: {
                    build job: 'full-build-windows', parameters: [string(name: 'GIT_BRANCH_NAME', value: env.BRANCH_NAME)]
                },
                failFast: false)
        }
    }

Или в качестве альтернативы:

    stage('Build A and B') {
            failFast true
            parallel {
                stage('Build A') {
                    steps {
                            build job: "/project/A/${env.BRANCH}", wait: true
                    }
                }
                stage('Build B') {
                    steps {
                            build job: "/project/B/${env.BRANCH}", wait: true
                    }
                }
            }
    }
Кэти
источник
3

Используйте плагин сборки задания для этой задачи, чтобы запускать другие задания из файла jenkins. Вы можете добавить разнообразную логику к своему исполнению, такую ​​как параметры параллели, узла и агентов и шаги для запуска внешних заданий. Для этого я привел несколько легко читаемых примеров поваренной книги.

1. Пример запуска внешнего задания из файла jenkins с условным примером:

if (env.BRANCH_NAME == 'master') {
  build job:'exactJobName' , parameters:[
    string(name: 'keyNameOfParam1',value: 'valueOfParam1')
    booleanParam(name: 'keyNameOfParam2',value:'valueOfParam2')
 ]
}

2. Пример запуска нескольких заданий из файла jenkins с примером условия:

 def jobs =[
    'job1Title'{
    if (env.BRANCH_NAME == 'master') {
      build job:'exactJobName' , parameters:[
        string(name: 'keyNameOfParam1',value: 'valueNameOfParam1')
        booleanParam(name: 'keyNameOfParam2',value:'valueNameOfParam2')
     ]
    }
},
    'job2Title'{
    if (env.GIT_COMMIT == 'someCommitHashToPerformAdditionalTest') {
      build job:'exactJobName' , parameters:[
        string(name: 'keyNameOfParam3',value: 'valueOfParam3')
        booleanParam(name: 'keyNameOfParam4',value:'valueNameOfParam4')
        booleanParam(name: 'keyNameOfParam5',value:'valueNameOfParam5')
     ]
    }
}
avivamg
источник
Но как получить и использовать параметры во 2 - й работы
Нежная
2
@Gentle. Вы можете получить доступ к переданному параметру как params.systemname
Pankaj