Як я можу запустити іншу роботу з трубопроводу jenkins (jenkinsfile) за допомогою плагін GitHub Org?


142

Як я можу викликати побудову іншої роботи зсередини Jenkinsfile?

Я припускаю, що це завдання - це ще одне сховище в тій же організації github , яке вже має власний файл Jenkins.

Я також хочу це зробити лише в тому випадку, якщо ім'я гілки є головним, оскільки не має сенсу запускати наступні версії будь-яких локальних гілок.

Оновлення:

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

Все-таки при виконанні я отримую помилку

Не знайдено параметризованого завдання з назвою деякого імені-випускного завдання

Я впевнений, що ця робота існує в дженкінсах і знаходиться в тій же папці організації, що і в поточній. Це ще одна робота, яка має свою власну Jenkinsfile.

Зауважте, що це питання стосується плагіну GitHub Organisation, який автоматично створює та підтримує завдання для кожного сховища та відділення вашої організації 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мінлива середовище Дженкінса стосується гілки, що працює за проектом "Багатогалузевий"?
msteppe91

2
якщо ${BRANCH_NAME}він доступний як змінна середовище, буде виконана проста підміна рядків. Просто не забудьте перейти до "з 'для цитування рядків. наприкладbuild job: "../other-repo/${BRANCH_NAME}"
Cinderhaze

3
API-посилання для build job: jenkins.io/doc/pipeline/steps/pipeline-build-step
Katie

123

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

Тому я використав:

stage ('Starting ART job') {
    build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}

11
Завдання збірки потрібно вкласти в крок (починаючи з версії 0.5)
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
Досить цікаво, build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]] що для мене не вийшло, але: build job: 'RunArtInTest', parameters: [string(name: 'systemname', value: "${VALUE}")] працював
Альберто C

24

Команда buildв конвеєрі існує для запуску інших завдань у джинкінах.

Приклад на github

Робота повинна існувати у Дженкінса і може бути параметризована. Щодо гілки, я думаю, ви можете прочитати її з git


3
Я спробував додати, build job: 'jobnameале я отримую цю помилку, No parameterized job named jobname foundі я можу запевнити вас, що в папці організації є робота з цим ім'ям на одному рівні.
sorin

1
Так, є робота, але ця робота не параметризована. Я намагаюся зрозуміти, як параметризувати роботу, створену плагіном організації GitHub, хоча
yiwen

6
Формат назви роботи:build job: "${ORGANISATION_NAME}/${REPO_NAME}/master"
Сахіл Ахуджа

2
@SahilAhuja Це абсолютно довільно і базується на вашій схемі Дженкінса, і якщо ви хочете використовувати абсолютний шлях, вам потрібно почати з а /. Відносні шляхи тонкі; Проблема Соріна, ймовірно, buildполягала в тому, що виклик на роботу був багатогалузевою роботою, що означає шлях, як jobnameспробувати створити гілку jobnameтієї самої роботи; це потрібно ../jobname/branchnameзамість цього
Майкл Мрозек

Це добре, але що трапиться, якщо вказана галузь не існує?
Хайме Алькантара Арнела,

17

Ви можете використовувати build jobкрок від трубопроводу Дженкінса (Мінімальна вимога Дженкінса: 2.130).

Ось повний API для цього buildкроку: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

Як користуватися build:

  • job: Назва завдання для подальшого створення. Можливо, це ще одна трубопровідна робота, але частіше фрістайл чи інший проект.
    • Використовуйте просте ім'я, якщо завдання знаходиться в тій самій папці, що і ця робота в поточному трубопроводі;
    • Замість цього ви можете використовувати відносні шляхи , як../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')
     ]
    }
}

Але як приймати та використовувати параметри у другій роботі
Ніжний

2
@ Ніжно. Ви можете отримати доступ до переданого параметра як params.systemname
Pankaj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.