2012-08-07 5 views
7

Próbuję przenieść skrypt Ant, który napisałem, aby budować i wdrażać projekty z poziomu struktury Jenkinsa (zamiast wyzwalać się z haka po zatwierdzeniu SVN, co było celowym sposobem, w jaki początkowo podchodziliśmy do rzeczy). Wszystko jest świetne, z wyjątkiem sytuacji, gdy potrzebuję plików etapów dla kroku wdrażania i chcę wprowadzić je do katalogu "kompilacji", który Jenkins tworzy dla tego zadania (a ponieważ mój plik build.xml znajduje się w lokalizacji innej niż projektowa, $ { basedir} i $ {user.dir} nie wskazują żądanej lokalizacji).Jak określić katalog budujący Jenkinsa z Ant?

w konfiguracji Jenkins, mam ustawić następujące:

[Jenkins] Budowa Record katalog główny: E:/buduje/$ {ITEM_FULLNAME}

[Job-Specific] kompilacji : C: \ vc-tools \ shadow \ build.xml

podczas uruchamiania kompilacji skrypt jest odpowiednio uruchamiany i tworzony jest katalog budowania konkretnego zadania, np.

E: \ buduje \ Test \ 2012-08-07_12-51-21

chcę się w tym katalogu z poziomu skryptu build, ale nie można dowiedzieć się, jak to zrobić. niektóre rzeczy próbowałem:

[echo] ${basedir}: C:\vc-tools\shadow 
[echo] ${user.dir}: C:\vc-tools 
[echo] ${env.workspace}: C:\Program Files (x86)\Jenkins\workspace\Test 
[echo] ${env.build_id}: 2012-08-07_12-51-21 
[echo] ${jenkins_home}: C:\Program Files (x86)\Jenkins 
[echo] ${BuildDir}: E:/builds/${ITEM_FULLNAME} 

Uwaga: W przypadku tego ostatniego, próbowałem przechodzącą w:

BuildDir=E:/builds/${ITEM_FULLNAME} 

jako własność skonfigurowanego z pracy w ciągu Jenkins (wyraźnie $ {} ekspansji nie ma miejsca w tym kontekście).

według documentation istnieją żadne konkretne zmienne środowiskowe, które są ustawione na pełną ścieżkę do katalogu build - Mogę fudge go hardcoding E: \ buduje korzeń i sklejaniu na $ {env.build_id}, ale było mając nadzieję, że łatwiej będzie uzyskać dostęp do pełnej ścieżki z czegoś, co ujawnia Jenkins (albo właściwość Ant i zmienna środowiskowa), aby skrypt był bardziej elastyczny.

Używam wersji Jenkins 1.476.

dzięki

+0

Wygląda na to, że robisz coś bardzo dziwnego, czego nie rozumiem w pełni. Dlaczego plik build.xml nie znajduje się w katalogu głównym projektu, który budujesz? Zazwyczaj po prostu konfigurujesz Jenkinsa wyciągając pliki projektu z systemu SCM, a następnie uruchamiasz kompilację ... Wszystko to dzieje się w "przestrzeni roboczej", którą Jenkins zarządza dla tej pracy. –

+0

Dlaczego potrzebujesz katalogu? Możesz bezpiecznie używać ścieżek względnych –

+0

@ MarkO'Connor: - Mam ogólny skrypt budujący, który można wykorzystać w przypadku kilku projektów (istnieje plik właściwości specyficzny dla projektu, który skrypt usuwa, aby zakwalifikować jego działanie, ale ja nie mogę • zobacz, jak obecnie kopiuje ten sam plik build.xml do wielu podobnych projektów). – rguilbault

Odpowiedz

11

to zawsze dobry pomysł na projekt, aby mieć kopię to budować logiki dołączonego wraz z kodem źródłowym. Sprawia, że ​​twoja kompozycja jest bardziej przenośna na różnych maszynach.

Powiedziawszy, że dość często instaluje się pliki kompilacji zawierające wspólną wspólną logikę budowania. ANT określa następujące zadania wspierać taką działalność:

więc możliwym rozwiązaniem jest przechowywanie prosty plik build.xml, w głównym katalogu projektu:

<project name="my project" default="build"> 

    <include file="C:\vc-tools\shadow\common-build-1.0.xml" as="common"/> 

    <target name="build" depends="common.build"/> 

</project> 

Uwagi:

  • Dobrze jest użyć numeru wersji we wspólnej nazwie pliku kompilacji.Pomaga to w zachowaniu kompatybilności wstecznej z innymi kompilacjami przy użyciu starszej logiki.

Aktualizacja

Jenkins Kiedy skończy zadanie to ustawia liczbę environment variables.

Poniższy ANT logika wypisze lokalizację katalogu obszaru roboczego Jenkins:

<property environment="env"/> 

<target name="run"> 
    <echo message="Jenkins workspace: ${env.WORKSPACE}"/> 
    <echo message="Job directory: ${env.WORKSPACE}../../jobs/${env.JOB_NAME}"/> 
    <echo message="Build data: ${env.WORKSPACE}../../jobs/${env.JOB_NAME}/build/${env.BUILD_ID}"/> 
</target> 
+0

to wygląda na bardzo pomocne. w rzeczywistości stwarza dodatkowe korzyści wykraczające poza zakres mojego pierwotnego pytania - dzięki za wskazówkę! Przyjmuję to jako odpowiedź, gdy tylko będę miał okazję przetestować, że robi to, co przewiduję (tylko pytanie, czy $ {envisionir} lub $ {user.dir} będzie równe $ {env.WORKSPACE} lub prawdziwy folder "kompilacji", który tworzy Jenkins) ... – rguilbault

+0

ok, więc nadal nie mogę uzyskać odniesienia do katalogu kompilacji, ale zdarza mi się teraz, że nie muszę się do niego odwoływać (zawiera informacje o konstrukcji, na której zależy Jenkins, nie musi to być celem mojego zbudowanego projektu). Powiedział, że byłoby to wygodne do wykorzystania jako obszar przemieszczania (pełny zakres tego, co muszę zrobić, ze względu na dziedzictwo, jest kasowanie/aktualizowanie obszaru roboczego z SVN, poszukiwanie ostatnio zmienionych plików i wywołanie tłumacza przeciwko nim w celu wygenerowania pliki obiektowe - wynikowe pliki źródłowe i obiektowe muszą następnie zostać wysłane do lokalizacji dostępnej dla SMB). – rguilbault

+0

... Lokalizacja obszaru roboczego to miejsce, w którym odbywa się kasowanie/aktualizacja, więc nie chcę sully to z przemieszczaniem plików (które, przy okazji, zapomniałem wspomnieć, że muszę umieścić w innej strukturze drzewa z tego, w jaki sposób przebywają w kontroli źródła). Mogę utworzyć niezależną hierarchię (i być może) lubię E: \ staging \ $ {env.BUILD_TAG}, ale Jenkins nie oczyści go automatycznie, tak jak zrobiłby to katalog kompilacji, który zarządza (miałem nadzieję, że utworzę podkatalog .staging w nim, który przywraca mnie do mojego pierwotnego pytania/posta). – rguilbault

5

Te dni (. Jenkins v 1.484) 'Uruchom' cel z odpowiedzi powyżej powinien wyglądać następująco:

<target name="run"> 
    <echo message="Jenkins workspace: ${env.WORKSPACE}"/> 
    <echo message="Job directory: ${env.WORKSPACE}/../../${env.JOB_NAME}"/> 
    <echo message="Build data: ${env.WORKSPACE}/../../${env.JOB_NAME}/builds/${env.BUILD_ID}"/> 
</target>