{"id":10525,"date":"2021-05-25T12:49:41","date_gmt":"2021-05-25T10:49:41","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=10525"},"modified":"2023-10-25T12:51:56","modified_gmt":"2023-10-25T10:51:56","slug":"wprowadzenie-do-jib","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/wprowadzenie-do-jib\/","title":{"rendered":"Wprowadzenie do JIB"},"content":{"rendered":"\n<p>Docker jest narz\u0119dziem na tyle powszechnym, \u017ce mo\u017cna si\u0119 z nim spotka\u0107 w ogromnej liczbie projekt\u00f3w, co z kolei niejako wymusza na nas, programistach, zapoznanie si\u0119 z ow\u0105 technologi\u0105 w mniej lub bardziej dok\u0142adny spos\u00f3b \u2013 zale\u017cnie od potrzeb.<\/p>\n\n\n\n<p> Niekt\u00f3rzy z nas zatrzymali si\u0119 na etapie uruchomienia aplikacji, inni za\u015b wczytali si\u0119 g\u0142\u0119biej w dokumentacj\u0119, poznaj\u0105c zaawansowane zagadnienia Dockera. Niezale\u017cnie od tego, do kt\u00f3rej z grup nale\u017cysz, Jib pomo\u017ce Ci znacznie zautomatyzowa\u0107 codzienn\u0105 prac\u0119 z wy\u017cej wymienionym narz\u0119dziem.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Czym jest Jib?<\/h2>\n\n\n\n<p>Jib jest opensource&#8217;owym, napisanym w j\u0119zyku JAVA, narz\u0119dziem dost\u0119pnym w postaci pluginu (zar\u00f3wno Mavenowego jak i Gradle&#8217;owego), kt\u00f3rego zadaniem jest uproszczenie procesu budowania obraz\u00f3w dockerowych w mo\u017cliwie najwi\u0119kszym stopniu. Dodaj\u0105c ten plugin do konfiguracji projektu, mo\u017cemy zapomnie\u0107 o kilku rzeczach, kt\u00f3re do tej pory mog\u0142y sprawia\u0107 problem lub przynajmniej irytowa\u0107 ze wzgl\u0119du na swoj\u0105 powtarzalno\u015b\u0107. Jako \u017ce jest on \u015bci\u015ble zwi\u0105zany z sam\u0105 aplikacj\u0105, jest w stanie spakowa\u0107 j\u0105 do postaci obrazu w spos\u00f3b optymalny, tzn. z odpowiednim podzia\u0142em na warstwy oraz z zachowaniem mo\u017cliwie najmniejszego rozmiaru i czasu budowania. Pisanie plik\u00f3w Dockerfile, wklepywanie w konsol\u0119 wci\u0105\u017c tych samych polece\u0144, a nawet instalacja Dockera \u2013 s\u0105 to rzeczy, o kt\u00f3rych Jib pozwala zapomnie\u0107.<\/p>\n\n\n\n<p>Jedn\u0105 z zalet Jiba, o kt\u00f3rej nale\u017cy wspomnie\u0107, jest fakt, \u017ce <strong>buduje on obraz w oparciu o warstwy.<\/strong> Ka\u017cdy z element\u00f3w aplikacji (klasy, zasoby, zale\u017cno\u015bci, dodatkowe zasoby) umieszczony zostaje w osobnej warstwie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Proces<\/h2>\n\n\n\n<p>Ka\u017cdorazowe budowanie obrazu opiera si\u0119 o szereg czynno\u015bci, z kt\u00f3rych cz\u0119\u015b\u0107 jest jednorazowa, jak np. napisanie Dockerfile\u2019a, inne za\u015b s\u0105 powtarzalne, np. uruchomienie budowania poprzez odpowiednie polecenie. Standardowy przebieg tego procesu wygl\u0105da w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><u>Instalacja Dockera<br><\/u>O ile punkt ten jest raczej jasny i nie trzeba go t\u0142umaczy\u0107, to warto doda\u0107, \u017ce na systemach z rodziny Windows mo\u017ce on sprawia\u0107 trudno\u015bci, gdy\u017c Docker wspiera ten system dopiero od wersji 10.<\/li>\n\n\n\n<li><u>Napisanie Dockerfile\u2019a<\/u><br>Dockerfile dockerfile\u2019owi nier\u00f3wny. Samo utworzenie tej konfiguracji jest rzecz\u0105 jednorazow\u0105 i wzgl\u0119dnie prost\u0105, jednak mo\u017cna to zrobi\u0107 w poprawny lub optymalny spos\u00f3b.<\/li>\n\n\n\n<li><u><u><u>Zbudowanie projektu<\/u><\/u><\/u><\/li>\n\n\n\n<li><u>Utworzenie obrazu aplikacji<\/u><br>Jest to najbardziej powtarzalna z czynno\u015bci, kt\u00f3ra polega na wywo\u0142aniu polecenia <em>\u201edocker build\u201d<\/em>. Problematyczno\u015b\u0107 mo\u017ce powsta\u0107 w przypadku, gdy nasz projekt si\u0119 rozrasta, a wraz z nim ro\u015bnie poziom zaawansowania aplikacji. W takim przypadku owe polecenie z wersji podstawowej r\u00f3wnie\u017c mo\u017ce si\u0119 rozrosn\u0105\u0107 o zestaw dodatkowych opcji. I o ile samo to nie jest problemem, to w przypadku, gdy za kt\u00f3r\u0105\u015b iteracj\u0105 zapomnimy o jednym z nich mo\u017ce doj\u015b\u0107 do utraty kilku godzin czasu pracy i zyskaniu kilku nowych siwych w\u0142os\u00f3w.<\/li>\n\n\n\n<li><u>Wypchni\u0119cie projektu<\/u><br>Nie jest to cz\u0119\u015b\u0107 budowania obrazu, gdy\u017c takowy mamy ju\u017c po wykonaniu punktu 4 (o ile nie pope\u0142nili\u015bmy jakiego\u015b b\u0142\u0119du po drodze), jednak bardzo cz\u0119sto zachodzi r\u00f3wnie\u017c potrzeba umieszczenia go z kontenerze obraz\u00f3w.<\/li>\n<\/ol>\n\n\n\n<p>Ka\u017cdy z wy\u017cej wymienionych punkt\u00f3w mo\u017ce sprawia\u0107 problemy lub po prostu sprawia\u0107 k\u0142opot swoim istnieniem. Jib pozwala zniwelowa\u0107 te problemy praktycznie do zera, a powy\u017csz\u0105 list\u0119 skr\u00f3ci\u0107 do zaledwie jednego punktu, kt\u00f3rym jest zbudowanie projektu. Skoro mamy ju\u017c odpowied\u017a na pytanie &#8222;Po co?&#8221;, sprawd\u017amy teraz jak brzmi odpowied\u017a na pytanie &#8222;Jak?&#8221;.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Nieco praktyki<\/h2>\n\n\n\n<p>Program, kt\u00f3ry b\u0119dziemy pr\u00f3bowali uruchomi\u0107 to prosta aplikacja oparta o Spring Boot, zawieraj\u0105ca jeden endpoint zwracaj\u0105cy \u201eHello World!\u201d.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\npackage com.jibintroduction;\n \nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n \n@RestController\n@SpringBootApplication\npublic class JibIntroductionApplication {\n \n    public static void main(String&#x5B;] args) {\n        SpringApplication.run(JibIntroductionApplication.class, args);\n     }\n \n     @GetMapping(\"\/say\/hello\")\n     String sayHello() {\n          return \"Hello World!\";\n     }\n}\n<\/pre><\/div>\n\n\n<p>Pierwszym krokiem jest dodanie odpowiedniego pluginu. Zar\u00f3wno w przypadku korzystania z Gradle, jak i Mavena konfiguracja wygl\u0105da analogicznie, tj. nazwy p\u00f3l i mo\u017cliwe warto\u015bci s\u0105 takie same. Jedyna r\u00f3\u017cnica wyst\u0119puje w nazwach goali, jednak o tym opowiem p\u00f3\u017aniej. Prezentowany przyk\u0142ad wykorzystywa\u0142 b\u0119dzie narz\u0119dzie Gradle.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nplugins {\n     id 'org.springframework.boot' version '2.4.4'\n     id 'io.spring.dependency-management' version '1.0.11.RELEASE'\n     id 'java'\n     id 'com.google.cloud.tools.jib' version '2.8.0'\n}\n<\/pre><\/div>\n\n\n<p>Aby plugin ten m\u00f3g\u0142 poprawnie wykonywa\u0107 swoje zadanie potrzebuje przynajmniej minimalnej konfiguracji. Nale\u017cy zdefiniowa\u0107, kt\u00f3ry obraz ma by\u0107 obrazem bazowym dla naszej aplikacji (<em>FROM<\/em>) oraz jak ma si\u0119 nazywa\u0107 obraz wynikowy (<em>TO<\/em>).<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\njib {\n    from {\n         image = 'openjdk:alpine'\n     }\n     to {\n         image = 'repositoryName\/jib-introduction'\n     }\n}\n<\/pre><\/div>\n\n\n<p>Aplikacja, kt\u00f3r\u0105 utworzona na potrzeby tego artyku\u0142u b\u0119dzie domy\u015blnie nas\u0142uchiwa\u0142a na ruch na porcie 8080, dlatego nale\u017cy ten port aktywowa\u0107 (odpowiednik EXPOSE 8080 w dockerfile). Lista opcji, kt\u00f3re mo\u017cna ustawi\u0107 w tym miejscu jest naprawd\u0119 du\u017ca. Dla przyk\u0142adu mo\u017cna doda\u0107 list\u0119 argument\u00f3w, z kt\u00f3rymi zostanie uruchomiona nasza aplikacja.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\ncontainer {\njvmFlags = &#x5B;'-Xms1024m', '-Xdebug']\nargs = &#x5B;'some', 'random', 'input', 'text']\nports = &#x5B;'8080']\n}\n<\/pre><\/div>\n\n\n<p>Konfiguracja konieczna do utworzenia prostego obrazu jest gotowa, jednak to nie wszystko. Pozostaje nam jeszcze skonfigurowanie dost\u0119pu do rejestru obraz\u00f3w. Mowa konkretnie o autoryzacji.<br>Sposob\u00f3w jest kilka, a to, kt\u00f3ry nale\u017cy u\u017cy\u0107 zale\u017cy od rejestru, kt\u00f3ry wykorzystujemy. Opis tego zagadnienia to materia\u0142 na kolejny artyku\u0142, dlatego tym razem skupimy si\u0119 na rejestrze dockerhuba. W tym przypadku nale\u017cy jedynie poda\u0107 nazw\u0119 u\u017cytkownika oraz has\u0142o (warto\u015bci USERNAME oraz PASSWORD ustawione zosta\u0142y w pliku gradle.properties).<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\njib {\n    from {\n         image = 'openjdk:alpine'\n    }\n   to {\n       image = 'repositoryName\/jib-introduction'\n       tags = &#x5B;'latest', '1.0.0']\n       auth {\n            username = USERNAME\n            password = PASSWORD\n       }\n   }\n}\n<\/pre><\/div>\n\n\n<p>Nast\u0119pnym krokiem jest uruchomienie pluginu oraz sprawdzenie, czy obraz trafi\u0142 do rejestru. Goale, z kt\u00f3rych nale\u017cy skorzysta\u0107 wygl\u0105daj\u0105 nast\u0119puj\u0105co: Zbudowanie i umieszczenie w Docker deamon:\u00a0<em>jibDockerBuild (Gradle)<\/em>,\u00a0<em>dockerBuild (Maven).<br><\/em>Zbudowanie i umieszczenie w zewn\u0119trznym rejestrze obraz\u00f3w:\u00a0<em>build (Gradle \/ Maven).\u00a0<\/em>Przyk\u0142adowy wynik, kt\u00f3ry mo\u017cemy otrzyma\u0107 po umieszczeniu obrazu w Dockerhub:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/jib-ostatni-1-1024x562-1.png\"><img decoding=\"async\" width=\"1024\" height=\"562\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/jib-ostatni-1-1024x562-1.png\" alt=\"\" class=\"wp-image-25225\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/jib-ostatni-1-1024x562-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/jib-ostatni-1-1024x562-1-300x165.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/10\/jib-ostatni-1-1024x562-1-768x422.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Powy\u017csza konfiguracja jest wystarczaj\u0105ca, by uruchomi\u0107 przyk\u0142adow\u0105 aplikacj\u0119. Istnieje jednak szereg parametr\u00f3w, kt\u00f3re mog\u0105 dosta\u0107 skonfigurowane. Umo\u017cliwiaj\u0105 m.in. zdefiniowanie bardziej skomplikowanego punktu wej\u015bcia\/ uruchomienia aplikacji, dodanie wolumen\u00f3w i wiele innych rzeczy. Zach\u0119cam do zapoznania si\u0119 z nimi. Mo\u017cna je bez problemu znale\u017a\u0107 w dokumentacji Jiba.<\/p>\n\n\n\n<p>Po pobraniu obrazu z repozytorium Dockerhub i uruchomieniu kontenera powinni\u015bmy zobaczy\u0107 standardowe logi Spring Boota (o ile nie u\u017cyli\u015bmy flagi <strong><em>-d<\/em><\/strong>). Nast\u0119pnie mo\u017cna przej\u015b\u0107 do sprawdzenia, czy wszystko dzia\u0142a. Po wywo\u0142aniu polecenia&nbsp;<em>curl&nbsp;<\/em><a href=\"http:\/\/localhost:8080\/say\/hello\" rel=\"nofollow\" ><em>http:\/\/localhost:8080\/say\/hello<\/em><\/a>&nbsp;naszym oczom powinien ukaza\u0107 si\u0119 napis &#8222;Hello World!&#8221;.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p>Zadaniem Jiba jest zautomatyzowanie pracy developera oraz zniwelowanie szansy na b\u0142\u0119dy natury ludzkiej spowodowanych m.in. powtarzalno\u015bci\u0105 dzia\u0142a\u0144, niedoinformowaniem lub brakiem do\u015bwiadczenia. Na powy\u017cszym przyk\u0142adzie wida\u0107, \u017ce doskonale radzi sobie ze swoim zadaniem. W dodatku jest narz\u0119dziem o bardzo niskim progu wej\u015bcia i nie wymaga kl\u0119czenia nad dokumentacj\u0105, a niniejszy artyku\u0142 powinien wystarczy\u0107, by m\u00f3c rozpocz\u0105\u0107 prac\u0119 z owym pluginem. Gor\u0105co zach\u0119cam do samodzielnego przetestowania Jiba i zag\u0142\u0119bienia si\u0119 w dokumentacj\u0119. ?<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;10525&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;3&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 3)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Wprowadzenie do JIB&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 3)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Docker jest narz\u0119dziem na tyle powszechnym, \u017ce mo\u017cna si\u0119 z nim spotka\u0107 w ogromnej liczbie projekt\u00f3w, co z kolei niejako &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/wprowadzenie-do-jib\/\">Continued<\/a><\/p>\n","protected":false},"author":278,"featured_media":10544,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[153,1035,1032,1034,55,1033],"class_list":["post-10525","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-docker","tag-automatisation","tag-case-study","tag-jib","tag-nowosci","tag-spring"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2021\/05\/ionic.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/10525"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/278"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=10525"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/10525\/revisions"}],"predecessor-version":[{"id":25227,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/10525\/revisions\/25227"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/10544"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=10525"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=10525"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=10525"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}