2014-10-22 8 views
5

Mam scenariusz budowania przepływu podobny do documentation example: dwa zadania, jeden działa po drugim.Jenkins + Build Flow, jak przekazać zmienną z jednego zadania do drugiego

b = build("job1") 
build("job2", param1: b.????) 

My job1 jest skryptem powłoki, która buduje pakiet z pomocą wyrejestrowany git repositoy i wypisuje wersję wbudowanego pakietu.

Potrzebuję wydobyć wersję z job1 (wynik przetwarzania ??) i udostępnić ją jakoś jako parametr do job2. Jak można to osiągnąć? Pamiętaj, że nie mogę poznać wersji przed uruchomieniem job1.

Odpowiedz

9

Problem z prostym użyciem export w kroku kompilacji skryptu powłoki polega na tym, że wyeksportowane zmienne znikają po wyjściu skryptu powłoki, nie są propagowane do tego zadania.

Użyj EnvInject plugin, aby utworzyć zmienne środowiskowe w kompilacji. Jeśli wyłączysz plik właściwości jako część twojej kompilacji, EnvInject może odczytać plik i inject variables as a build step. Plik właściwości posiada prosty KEY=VALUE format:

MY_BUILD_VERSION=some_parsed_value 

Gdy masz zmienną środowiskową ustawić w swojej pracy, w czasie przygotowań przepływu wtyczki można wyodrębnić wartość zmiennej i użyć go w kolejnych miejscach pracy:

def version = build.environment.get("MY_BUILD_VERSION") 
out.println String.format("Parameters: version: %s", version) 
build("My Second Build", MY_BUILD_VERSION: version) 
+0

Czy to działa dla Ciebie? Tworzę plik właściwości 'vars.txt' (zawierające 'MY_BUILD_VERSION = coś') i używając" inject variables "jako następnego kroku kompilacji jako części' job1' .Ale z jakiegoś powodu, w buildflow wersja wychodzi jako 'null', po wywołaniu' job1' (używając twojego przykładu jako kod) – Unknown

+0

Nieważne, odkryłem to. Robiłem 'b = build ('job-1')' i próbowałem 'build.environment.get()'; 'b.environment.get()' działa poprawnie . Dzięki! – Unknown

0

Po uruchomieniu job1 wyeksportuj wersję o nazwie jako właściwości systemowej.

export appVersion="stringOfVersion-123" 

To zależy, czy wiesz, jak długo jest wersja (liczba liczb lub inne znaki). Jeśli wiesz, możesz analizować zmienną od końca w drugiej kompilacji jako nową zmienną i używać jej.

Jak ciąg parse można znaleźć w this question with nice examples.

+0

Czy masz przykład tego, że faktycznie działa? Ponieważ w moich testach wydaje się, że tak nie jest; środowisko nie jest zachowywane z jednego miejsca pracy na drugie. – Unknown

+0

Właściwie nie, używamy Jenkinsa tylko sporadycznie. Ale jeśli uruchamiasz jakiś skrypt Bash jako build1, możesz wyeksportować zmienną jako zmienną systemową, aw drugiej wersji możesz użyć tej zmiennej. Czy możesz dodać więcej informacji na ten temat (zrzuty ekranu z Jenkinsa, kod, ...) na pytanie? –

+0

Zobacz moją konfigurację tutaj. http://imgur.com/a/rT72w – Unknown

0

Jeśli zadanie 2 zawsze powinno uzyskać pewne informacje z zadania 1, można użyć podejścia bez parametrów. job1 może opublikować artefakt z wersją, a job2 użyje tego artefaktu (na przykład Copy Artifact Plugin). Dzięki takiemu podejściu job2 może zostać wykonany również jako samodzielna praca.

0

dla nikogo innego pochodzące od tego, innym rozwiązaniem jest użycie skryptu scriptler, gdzie przechodzą w ścieżce pliku .properties, a skrypt dodać właściwości do listy zmiennych praca:

Properties properties = new Properties() 

FilePath workspace = build.getWorkspace() 
FilePath sourceFile = workspace.child(path) 

properties.load(sourceFile.read()) 

properties.each { key, value -> 
    key = key.replace(".", "_").toUpperCase() 
    Job.setVariable(build, key, value) 

    println "Created Variable: " + key + "=" + value 
} 

Spowoduje to przekształcenie dowolnych kropek w podkreślenia i zamapowanie wszystkich liter. Korzystanie ze skryptu skryptowego zapewnia, że ​​masz metodę, która działa niezależnie od "zupy wtyczki", której używasz.

Powiązane problemy