Czas na część drugą
Warto znać, warto mieć:
Git + np: GitHub – poziom podstawowy
Projekt: java + maven – w poście jest link do testowegej apki więc nawet bez projektu się da 🙂
Mamy projekcik i warto by było go wrzucić na Openshift. To zostało opisane w poprzednim poście http://przemek.yum.pl/openshift-pt1-stawianie-javowej-apki-w-chmurze/ więc cóż więcej można na tej chmurze robić?
Ciągła Integracja jest na to odpowiedzią. Można to opisać w kilku prostych krokach. Zakładam jakąś podstawową znajomość systemu kontroli wersji GIT:
- Posiadam kod na zewnętrznym repo np: GitHub
- Gdy coś zmienię w kodzie i robię commit a następnie push zewnętrzne repo zostaje zaktualizowane
- Na Openshift postawiony jest sprytny tool Jenkins – narzędzie do ciągłej integrajcji które nasłuchuje zmiany na repo zewnętrznym
- Gdy takie się pojawią Jenkins buduje zaktualizowany kod, wykonuje testy i jeszcze inne cuda co sobie zażyczymy stawiając testową aplikacje
- I jeśli wg zdefiniowanych kryteriów build się powiódł Jenkins robi deploy na instancję np. testową/pre-produkcyjną.
- Dzięki temu procesowi działająca apka z nowymi feature’ami jest dostępna od razu po wprowadzeniu i push’nięciu zmian (o ile testy się nie sypły 🙂 ).
Brzmi nieźle – But how???
- Tworzymy testową apkę na openshift
$ rhc app create calculator jbossas-7
Przykładowy wynik
Application Options ------------------- Namespace: chmura Cartridges: jbossas-7 Gear Size: default Scaling: no Creating application 'calculator' ... done Waiting for your DNS name to be available ... done Downloading the application Git repository ... Cloning into 'calculator'... The authenticity of host 'calculator-chmura.rhcloud.com (107.20.34.166)' can't be established. RSA key fingerprint is aa:aa:aa:aa:aa:aa:aa. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'calculator-chmura.rhcloud.com,107.20.34.166' (RSA) to the list of known hosts. remote: Counting objects: 32, done. remote: Compressing objects: 100% (23/23), done. remote: Total 32 (delta 0), reused 32 (delta 0) Receiving objects: 100% (32/32), 16.27 KiB, done. Your application code is now in 'calculator' calculator @ http://calculator-chmura.rhcloud.com/ (uuid: 000000000000000000) ----------------------------------------------------------------------------------- Created: 8:48 PM Gears: 1 (defaults to small) Git URL: ssh://0000000000000@calculator-chmura.rhcloud.com/~/git/calculator.git/ SSH: 00000000000000@calculator-chmura.rhcloud.com jbossas-7 (JBoss Application Server 7) -------------------------------------- Gears: 1 small RESULT: Application calculator was created. Artifacts deployed: ./ROOT.war
mam loklane repo z aplikacją na openshift Yupii 😀
- To repo przyda się jak będziemy chcieli coś wrzucić bezpośrednio do naszej aplikacji ale mamy chrapkę na CI więc na razie możemy je zignorować i w każdym innym miejscu na naszym kompie rozpocząć developowanie apki gdyż tak naprawdę Jenkins będzie nasłuchiwał zewnętrznego repozytorium z GitHub (zob. obrazek na końcu postu).
- Dlaczego? Bo raczej nieeleganckie będzie utrzymywanie głównego repo na Openshift – ze względu na jego marne możliwości jeśli chodzi o funkcje które dostaniemy na GitHub czy BitBucket jeśli chodzi o np Code Review, czy dzielenie się dostępem do kodziku.
- Jeśli nie masz gotowego projektu maven’owego możesz zrobić Fork’a z repozytorium GitHub – projektu https://github.com/AdupTeam/Jbehave oraz stworzyć lokalne repo fork’owanego projektu na kompie. Jeśli posiadasz projekt dodaj do niego folder z .openshift, z folderu repo aplikacji Openshift z punktu 2 (folderek jest wymagany podczas transferu plików pomiędzy aplikacją testową a finalną) oraz dodać profil do pom.xml (patrz poprzedni post)
- Dalej w tej samej lokacji tworzę instancję Jenkins’a
$ rhc app create jenkins jenkins-1
Przykładowy wynik
Application Options ------------------- Namespace: chmura Cartridges: jenkins-1 Gear Size: default Scaling: no Creating application 'jenkins' ... done Waiting for your DNS name to be available ... done Downloading the application Git repository ... Cloning into 'jenkins'... remote: Counting objects: 8, done. remote: Compressing objects: 100% (5/5), done. rRemote: Total 8 (delta 0), reused 8 (delta 0) Receiving objects: 100% (8/8), 722 bytes, done. Your application code is now in 'jenkins' jenkins @ http://jenkins-chmura.rhcloud.com/ (uuid: 00000000000000000000000000) ----------------------------------------------------------------------------- Created: 10:59 PM Gears: 1 (defaults to small) Git URL: ssh://00000000000000000000@jenkins-chmura.rhcloud.com/~/git/jenkins.git/ SSH: 000000000000000000000@jenkins-chmura.rhcloud.com jenkins-1 (Jenkins Server) -------------------------- Gears: 1 small RESULT: Application jenkins was created. Jenkins created successfully. Please make note of these credentials: User: admin Password: 00000000000 Note: You can change your password at: https://jenkins-chmura.rhcloud.com/me/configure
W ostatnich linijkach mam link do działającego Jenkins’a oraz passy aby się zalogować.
- Teraz czas powiązać aplikacje Openshift z Jenkins’em – w punkcie 1 stworzyłem appke calculator i to jej użyjemy. No i tu zaczyna się trochę tricky part. Normalnie Jenkins buduje lokalnie aplikacje i deploy’uje pod wskazane miejsce – na Openshift jest inaczej – Jenkins potrzebuje tzn workspace do budowania apki – dlatego potrzebne jest stworzenie instancji aplikacji specjalnie dla Jenkins’a. Ta przestrzeń będzie wykorzystana do próbnego build’a.
$ rhc cartridge add jenkins-client -a calculator
Przykładowy wynik
Using jenkins-client-1 (Jenkins Client) for 'jenkins-client' Adding jenkins-client-1 to application 'calculator' ... Success jenkins-client-1 (Jenkins Client) --------------------------------- Gears: Located with jbossas-7 Job URL: https://jenkins-chmura.rhcloud.com/job/calculator-build/ RESULT: Added jenkins-client-1 to application calculator Associated with job 'calculator-build' in Jenkins server.
- Loguję się do Jenkins’a. Job automatycznie został skonfigurowany i dodany jako calculator-build. Można go spokojnie odpalić za pomocą opcji Schedule Build (zegarek po prawej) no i zbuduje się default’owa apka – ale potrzeba naszego kodu. Wchodzę do joba u mnie https://jenkins-chmura.rhcloud.com/job/calculator-build/ i klikam Configure po lewej stronie.
- Od razu zmieniam Max # of builds to keep na 5 aby nie zapychać pamięci skromnej maszynki, ale gwoździem programu jest zmiana repo – zmieniam link z repozytorium z Openshift na to z GitHub (kontrolka HTTPS clone URL na GitHub’ie) i zachowuję zmiany.
Dodatkowo zaznaczam w Build Triggers opcje Poll SCM i w polu Shedule dodaje * * * * * co oznacza, że CI będzie co minutę sprawdzał czy nie zaszły zmiany na GitHub repo. Więcej o tej funkcji i tajemniczych gwiazdkach można poczytać w klikając pytajnik obok okna w które wpisaliście gwiazdki albo wyszukując w necie informacje na temat cron np tu http://www.wiki.mydevil.net/Cron - Zapisuję i wystarczy teraz odpalić builda i TADAAA
https://calculator-chmura.rhcloud.com/
aplikacja została zbudowana z naszego repo na GitHub - Za każdym razem kiedy coś push’niemy Jenkins automatycznie wykona akcję Run Build na CI, który zbuduje (o ile jest zbudowywalna 😀 ) naszą apke 🙂 A oto ścieżka jaką przemierza nasz kodzik
- A co się stanie jak apka się nie zbuduje – NIC i to jest cała magia – brzydki kodzik nie trafi na produkcję a użytkownicy naszego kalkulatora dalej będą się cieszyć działającym softem 😀
Warto wiedzieć
- Czas naszej maszynki niestety będzie się różnić od czasu lokalnego więc należy przygotować sie na to, że jakiś stały zamorski interwał będzie dzielić nasze strefy
- Openshift usypia nieużywane maszynki – więc taka maszynka potrzebuje chwilę aby wstać
W kolejnej części bardziej szczegółowo omówię konfiguracje Jenkins’a. Będą ciekawe przykłady pracy Jenkins’a w kontekście testowania aplikacji… http://przemek.yum.pl/openshift-pt3-testy-w-chmurze-na-jenkins-ci/