2017-01-10 19 views
5

Próbuję automatycznie wywoływać indeksowanie gałęzi w usłudze Pipes sieci Multibranch w Jenkins.Indeksowanie gałęzi wyzwalania w sieciach wieloprzedziałowych (Jenkins/Git)

W tej chwili wydaje się, że działa tylko jedna metoda, która polega na odpytywaniu, ale nie jestem w stanie tego zrobić, a sondowanie i tak jest złym rozwiązaniem.

Wtyczka nie obsługuje „Wyzwalanie buduje zdalnie (na przykład ze skryptów)” (opcje nie są zapisywane), więc nie można go wywołać poprzez naciśnięcie na haku internetowej itp

Próbowałem tworzenia "trykot" w stylu freestylowym na repo ale "roszczenia po kompilacji - buduj inne projekty" projekt Multibranch Pipeline nie jest projektem możliwym do zbudowania.

Jeśli odpytywanie jest jedynym sposobem, w jaki mogę to zrobić, to muszę wyłączyć automatyczne wyzwalanie SCM (w przeciwnym razie otrzymamy zduplikowane kompilacje po ponownym indeksowaniu), ponieważ muszę włączyć wyzwalanie przechwytywania haseł w projektach branżowych.

Ale to nie działa, ponieważ konfiguruję hak internetowy za pomocą skryptu potoku w projekcie oddziału i musisz go zbudować co najmniej raz, aby ta właściwość została zarejestrowana.

Kręciłem się w kółko przez jakiś czas, więc mam nadzieję, że właśnie przegapiłem coś oczywistego, ale każda pomoc będzie doceniona.

wyobrażałem sobie jest w stanie wykonać jedną z następujących czynności

  • jakoś wywołać projekt wielobranżowy jako dalszy projektu

  • Poll projekt wielobranżowy, a jedynie zbudować projektów branżowych, które nie został zbudowany przed

Cheers

Odpowiedz

4

Metoda ComputedFolder.scheduleBuild() może zostać wywołana ze skryptu groovy.

Właśnie uruchomiłem indeksowanie gałęzi w jednym projekcie z wieloma potokami z kodu groovy w innym projekcie potoku wieloczęściowego, który uruchamia późniejszą kompilację w tym projekcie.

Kod jest coś takiego:

@NonCPS 
void scanRepo(String downStreamProjectName) { 
    Jenkins.instance.getItemByFullName(downStreamProjectName).scheduleBuild() 
} 
... 
String downStreamProject = 'my-folder/my-multibranch-project' 
String downStreamJob = "${downStreamProject}/${env.BRANCH_NAME}" 
if (Jenkins.instance.getItemByFullName(downStreamJob) == null) { 
    scanRepo(downStreamProject) 
    while (Jenkins.instance.getItemByFullName(downStreamJob) == null) { 
     sleep(1) 
    } 
} 
build([job: downStreamJob, wait: false, quietPeriod: 0]) 

Uwaga, Jenkins.instance.getItemByFullName(downStreamProjectName) jest WorkflowMultiBranchProject który nie jest Serializable, więc niektóre ostrożność należy podjąć.

+0

Dzięki! 'Jenkins.instance.getItemByFullName (downStreamProjectName) .scheduleBuild()' było dokładnie tym, czego szukałem, aby wywołać ponowne skanowanie mojego Pipeline Multibranch –

+0

Czy istnieje sposób oczekiwania na zakończenie tej pracy, zamiast wykonywania "uśpienia (1)" ? –

+0

Jedyną wadą tego podejścia są dość złe uprawnienia, których potrzebuje (poprzez zatwierdzenie skryptu). Krok 'build 'kroku' build-build-step' niestety jeszcze go nie obsługuje ([TODO w kodzie] (https://github.com/jenkinsci/pipeline-build-step-plugin/blob/3ff14391fe27c8ee9ccea9ba1977131fe3b26dbe/src/ main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerStepExecution.java # L66)), co byłoby prawdopodobnie lepszym rozwiązaniem. – StephenKing

0

podstawie odpowiedzi @jjc „s, stworzyliśmy wersję używając krok build również do uruchamiania skanowania:

String downStreamProject = 'my-folder/my-multibranch-project' 
String downStreamJob = "${downStreamProject}/${env.BRANCH_NAME}" 
if (Jenkins.instance.getItemByFullName(downStreamJob) == null) { 
    // we would need "wait: true", which is not possible as of now 
    // https://github.com/jenkinsci/pipeline-build-step-plugin/blob/3ff14391fe27c8ee9ccea9ba1977131fe3b26dbe/src/main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerStepExecution.java#L66 
    build job: downStreamProject, wait: false 
    // continue only once the expected job appears 
    while (Jenkins.instance.getItemByFullName(downStreamJob) == null) { 
     sleep(1) 
    } 
} 
build downStreamJob 

wymaga to następujących podpisów do zatwierdzenia:

  • method jenkins.model.Jenkins getItemByFullName java.lang.String
  • staticMethod jenkins.model.Jenkins getInstance
0

Najłatwiejszą opcją (o której wiem) jest zdalne powiadomienie wtyczki Jenkins Git o nowym zatwierdzeniu dla zdefiniowanego repozytorium. Jednak nie spowoduje to, że Jenkins natychmiast rozpocznie pracę. Co się dzieje, to że wtyczka Git zaczyna (re-) indeksować określone repozytorium. Zadanie Jenkins jest następnie uruchamiane po wykryciu zmian.

ze swojego repozytorium (GitHub, GitLab itp) należy wywołać następujący adres URL:

http://my-jenkins-host/git/[email protected]:group/repository.git&delay=0sec

Wartość url musi pasować URL SCM skonfigurowane w pracy Jenkins (plugin Git) !

Gotcha: może się okazać, że twój Jenkins nie wdrożony w kontekście głównego (/), w którym to przypadku URL byłoby http://my-jenkins-host/context-path/git/...