Jak mogę wyzwolić kolejne zadanie z potoku Jenkinsa (plik jenkins) za pomocą wtyczki GitHub Org?

142

Jak mogę wyzwolić kompilację innego zadania z poziomu Jenkinsfile?

Zakładam, że to zadanie to kolejne repozytorium w tej samej organizacji github , które ma już własny plik Jenkins.

Chcę to również zrobić tylko wtedy, gdy nazwa gałęzi to master, ponieważ nie ma sensu wywoływać kolejnych kompilacji jakichkolwiek gałęzi lokalnych.

Aktualizacja:

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

Mimo to po uruchomieniu pojawia się błąd

Nie znaleziono sparametryzowanego zadania o nazwie nazwa-zadania-downtream

Jestem pewien, że ta praca istnieje w Jenkins i znajduje się w tym samym folderze organizacji, co bieżąca. To kolejna praca, która ma swoją własną Jenkinsfile.

Należy pamiętać, że to pytanie jest specyficzne dla wtyczki GitHub Organization, która automatycznie tworzy i utrzymuje zadania dla każdego repozytorium i gałęzi z Twojej organizacji GitHub.

sorin
źródło

Odpowiedzi:

131

Przede wszystkim jest to marnowanie slotu executora na zawijanie buildkroku node. Twój główny executor będzie siedział bezczynnie bez powodu.

Po drugie, w projekcie wielobranżowym można użyć zmiennej środowiskowej, BRANCH_NAMEaby uzależnić logikę od bieżącej gałęzi.

Po trzecie, jobparametr przyjmuje bezwzględną lub względną nazwę zadania. Jeśli podasz nazwę bez określenia ścieżki, oznaczałoby to inne zadanie w tym samym folderze, co w przypadku projektu wielobranżowego oznaczałoby inną gałąź tego samego repozytorium.

Tak więc prawdopodobnie miałeś na myśli napisanie

if (env.BRANCH_NAME == 'master') {
    build '../other-repo/master'
}
Jesse Glick
źródło
2
Dzięki! Jeśli przy jakiejkolwiek zmianie wiesz również, jak uruchomić tę kompilację bez czekania na jej zakończenie, byłoby to podwójnie niesamowite :)
sorin
48
Sprawdź generator fragmentów :build job: '../other-repo/master', wait: false
Jesse Glick
3
Czy istnieje sposób na wywołanie kroku kompilacji z dynamiczną nazwą gałęzi? Coś na przykład, build job: '../other-repo/$BRANCH_NAME'gdzie $BRANCH_NAMEjest zmienna środowiskowa Jenkins odnosząca się do gałęzi, w której działa projekt Multibranch?
msteppe91
2
jeśli ${BRANCH_NAME}jest dostępna jako zmienna środowiskowa, wystarczy proste podstawienie łańcucha. Pamiętaj tylko, aby przełączyć się na "z, 'aby cytować swój ciąg. np.build job: "../other-repo/${BRANCH_NAME}"
Cinderhaze
3
Link do API dla build job: jenkins.io/doc/pipeline/steps/pipeline-build-step
Katie
123

Oprócz wyżej wymienionych odpowiedzi: Chciałem rozpocząć zadanie z prostym parametrem przekazanym do drugiego potoku i znalazłem odpowiedź na https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflow .

Więc użyłem:

stage ('Starting ART job') {
    build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]]
}
FrankIJ
źródło
11
Kompilacja
5
Czy BUILD_NUMBER zadania Jenkins wywołanego przez buildpolecenie zostało zwrócone? Jak uzyskać dostęp do BUILD_NUMBER w jednym z następujących etapów? Czy ktoś wie, gdzie udokumentowano to polecenie?
user909481
4
Jest build job: 'freestyle', parameters: [ string(name: 'param1', value:'test_param'), string(name:'dummy', value: "${index}")]teraz, od jenkins.io/doc/pipeline/examples/#jobs-in-parallel
BartBiczBoży
Ale jak korzystać z tych parametrów przekazanych w 2. zadaniu
Gentle
2
Co ciekawe, build job: 'RunArtInTest', parameters: [[$class: 'StringParameterValue', name: 'systemname', value: systemname]] dla mnie nie działało, ale: build job: 'RunArtInTest', parameters: [string(name: 'systemname', value: "${VALUE}")] działało
Alberto C
24

Polecenie buildw potoku ma wywołać inne zadania w Jenkins.

Przykład na github

Zadanie musi istnieć w Jenkins i może być sparametryzowane. Jeśli chodzi o gałąź, to chyba można to przeczytać z gita

Flo
źródło
3
Próbowałem dodać, build job: 'jobnameale No parameterized job named jobname foundpojawia się ten błąd i zapewniam, że w folderze organizacji jest zadanie o tej nazwie na tym samym poziomie.
sorin
1
Tak, istnieje zadanie, ale nie jest ono sparametryzowane. Próbuję jednak zrozumieć, jak sparametryzować zadanie utworzone przez wtyczkę organizacji GitHub
yiwen
6
Format nazwy stanowiska to:build job: "${ORGANISATION_NAME}/${REPO_NAME}/master"
Sahil Ahuja
2
@SahilAhuja To całkowicie arbitralne i oparte na układzie Jenkinsa, a jeśli chcesz użyć bezwzględnej ścieżki, musisz zacząć od pliku /. Względne ścieżki są w porządku; Problem sorina polegał prawdopodobnie na tym, że powołanie do pracy buildbyło pracą wielobranżową, co oznacza, że ​​ścieżka podobna jobnamedo próby zbudowania gałęzi jobnametej samej pracy; musi być ../jobname/branchnamezamiast tego
Michał Mrozek
To działa dobrze, ale co się stanie, jeśli określona gałąź nie istnieje?
Jaime Alcántara Arnela
17

Możesz użyć build jobkroku z Jenkins Pipeline (minimalne wymaganie Jenkinsa: 2.130).

Oto pełne API dla tego buildkroku: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/

Jak używać build:

  • job: Nazwa kolejnego zadania do zbudowania. Może to być kolejna praca w Pipeline, ale częściej projekt dowolny lub inny.
    • Użyj prostej nazwy, jeśli zadanie znajduje się w tym samym folderze, co to zadanie potoku nadrzędnego;
    • Zamiast tego możesz użyć ścieżek względnych, takich jak../sister-folder/downstream
    • Lub możesz użyć ścieżek bezwzględnych, takich jak/top-level-folder/nested-folder/downstream

Uruchom kolejne zadanie, używając rozgałęzienia jako parametru

W mojej firmie wiele naszych oddziałów zawiera „/”. Musisz zamienić wszystkie wystąpienia „/” na „% 2F” (tak jak pojawia się w adresie URL zadania).

W tym przykładzie używamy ścieżek względnych

    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
            }
        }
    }

Uruchom kolejne zadanie, używając numeru kompilacji jako parametru

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))
    ]

Wyzwalaj wiele zadań równolegle

Źródło: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/

Więcej informacji na temat Parallel tutaj: 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)
        }
    }

Lub alternatywnie:

    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
                    }
                }
            }
    }
Katie
źródło
3

Użyj wtyczki tworzenia zadań do tego zadania, aby uruchomić inne zadania z pliku jenkins. Możesz dodać różne logiki do wykonania, takie jak opcje równoległe, węzłowe i agentów oraz kroki wyzwalania zadań zewnętrznych. Podałem na to przykład łatwej do czytania książki kucharskiej.

1. przykład wyzwalania zewnętrznego zadania z pliku jenkins z warunkowym przykładem:

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

2. przykład wyzwalania wielu zadań z pliku Jenkinsa z przykładami warunkowymi:

 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
źródło
Ale jak odebrać i wykorzystać parametry w drugiej pracy
Gentle
2
@Delikatny. Możesz uzyskać dostęp do przekazanego parametru jako params.systemname
Pankaj Shinde