create account

O Continuous Integration by piotr-galas

View this thread on: hive.blogpeakd.comecency.com
· @piotr-galas ·
$11.28
O Continuous Integration
![](https://steemitimages.com/DQmdaaRDxd8zWUvjjCi7s95JA4xCxJcTayadcAgXkiYQw9R/image.png)

## Wstęp

Chciałem napisać artykuł o konkretnej implementacji CI. Zacząłem pisać wstęp i tak wyszedł właściwie osobny post. 
Chyba każdy, kto już chwilę programuje konfigurował środowisko tak, aby automatyzować pewne procesy.  Na początku kariery, nie jest to jednak proste. Pamiętam, że była to dla mnie czarna magia.  Sam efekt nie był skomplikowany, bo widziałem, że testy przeszły, lub nie. Ale jak to się działo w środku? Co odpalało te testy, gdzie się to odpalało? Skąd github o tym wiedział. Tego nie rozumiałem. 

## Co to jest Continuous Integration?

Aby nie wchodzić w definicje, w skrócie można powiedzieć, że jest to automatyzowanie pewnych powtarzalnych czynności, które występują w projekcie. Sprowadza się to do tego, że kiedy dostarczamy jakąś funkcjonalność, automatycznie wykonywane jest sprawdzenie kodu (składnia, testy, błędy itp). Często automatyzuje się również deploy na serwery testowe, oraz wspomaga deploy na produkcje. (Przez wspomaganie rozumiem, sprowadzenie deploy-u produkcyjnego do kliknięcia w jeden przycisk)

## Jak to działa?

Aby mówić o CI, musimy mieć jakiś serwer, na którym będzie stało odpowiednie oprogramowanie (np [Jenkins](https://jenkins-ci.org/)). Często nazywa się to po prostu “serwerem CI”. Powinna to być oddzielna maszyna, ponieważ proces buildu pochłania zwykle sporo zasobów.
W oprogramowaniu tym, wykonywane są po kolei komendy związane z instalacją i uruchomieniem testów na aplikacji. Generalnie są to te same komendy, które pozwalają nam odpalić testy aplikacji w środowisku lokalnym. Serwer CI współpracuje z odpowiednim pluginem w repozytorium.  Zarówno  github, bitbucket, czy gitlab, mają takie pluginy.
W github-ie  wygląda to tak:

![Peek 2018-01-04 00-56.gif](https://steemitimages.com/DQmQwAwcS1WhDWDhMe33fRpgRNJE5bMf4HRKGEyNcViypsM/Peek%202018-01-04%2000-56.gif)

Plugin w repozytorium służy do wyświetlania tego co zrobił CI, oraz do komunikowania się z nim. Trzeba więc zainstalować i skonfigurować plugin w repozytorium, oraz aplikacje CI na serwerze.
Najczęściej konfiguracja sprowadza się to do określenia, kiedy ma się wykonać jakiś proces/build w CI. Oczywiście dla jednego projektu może być kilka różnych procesów / buildów. Ja zwykle robię dwa:

* odpalenie buildów przy każdym stworzonym pull-requeście
* odpalenie deploy-u na serwer testowy przy każdym zmergowaniu feature-a do gałęzi dev

![Selection_017.png](https://steemitimages.com/DQmP813oh2DKAK6XEUYz1pbtWNP2W3h2wRzX2Y21NAJvBNX/Selection_017.png)

<sup>Przykładowy widok buildów dla poszczególnych gałęzi w bitbucket.com</sup>

## Jak dokładnie wyglądają polecenia buildu?    
----
`zainstaluj aplikacje` czyli zbiór poleceń w typu `apt-get install nodejs` 
`bundle exec rspec` - odpalenie testów
`bundle exec rubocop` sprawdzenie składni i formatowania kodu
`bundle exec reek` sprawdzenie jakości kodu

Powyższe komendy są używane do aplikacji napisanej w Ruby.
W zależności od tego, w jakim języku i frameworku napisany jest nasz projekt, polecenia  oczywiście będą inne. Ilość poleceń zależy od tego jak dużo narzędzi wykorzystujemy. 
 
## Dostępne CI

Na rynku dostępnych jest bardzo dużo różnych CI. Zwykle mają plik konfiguracyjny wg. którego wykonywane są polecenia. Opiszę tylko te narzędzia, które samodzielnie konfigurowałem.

_____

**[Jenkins](https://jenkins-ci.org/)**
Działa w taki sposób, że instalujemy na własnym serwerze aplikacje Jenkins. Następnie w interface graficznym konfigurujemy projekt. Określamy kiedy build ma się wykonać, podajemy adres repozytorium, klucze autentykacyjne itp. Na koniec w okienku wpisujemy komendy bash-owe które wykonają build. Jenkins ma stosunkowo wysoki próg wejścia. Jak dla mnie jest trochę reliktem przeszłości. Dziś są dostępne dużo łatwiejsze rozwiązania.

**[Travis](https://travis-ci.org/)**
Aby korzystać z Travisa trzeba dodać w repozytorium (testowalem tylko z github) w katalogu głównym  plik .travis.yml. W tym pliku wykonujemy komendy jakie mają się wykonać.
Używam travisa kiedy tworzę biblioteki do ruby, ponieważ podczas tworzenia takiej biblioteki automatycznie generuje  się plik konfiguracyjny do niego. Dla Open-sourcowych projektów jego używanie jest darmowe. Dodatkowo w pliku readme możemy dodać sexi button(build passing).
![Selection_018.png](https://steemitimages.com/DQmSbdX8yyMBhmZLZcpdfmVvLZp7jDAjoQhkpHTpitUmvdt/Selection_018.png)

Przykładowy plik konfiguracyjny dla Travis:

![Selection_019.png](https://steemitimages.com/DQmZnS9BHmvd76TnKKe2qUqRNDfhipSaXsRPnuu96dPwcFm/Selection_019.png)

**[GitLab CI](https://about.gitlab.com/features/gitlab-ci-cd/)**
Aby korzystać z CI gitlaba, trzeba mieć własnego hostowanego gitlab-a na jednym serwerze, oraz zainstalować na drugim aplikacje do CI. Instalacja jest łatwa, ale trzeba mieć dwa osobne serwery. Później podobnie jak w przypadku Travis-a mamy plik konfiguracyjny, który dodajemy do głównego katalogu aplikacji. Jego nazwa to  `.gitlab-ci.yml`.
Reszta dzieje się już automagicznie, w zależności od tego co mamy w pliku konfiguracyjnym.
Trzeba wspomnieć, że ma on naprawdę duże możliwości. Poniżej wklejam  screen z dokumentacji gitlab . Znajduje się on na stronie: [GitLab Documentation](https://docs.gitlab.com/ce/ci/yaml/README.html). GitLab CI jest oparty na Dockerze.

![Selection_020.png](https://steemitimages.com/DQmXnKdPNP5cWM6ydjJuRCo1Yv7cniwKH6cjjCGA53BQNay/Selection_020.png)


**[Bitbucket Pipelines ](https://bitbucket.org/product/features/pipelines)**
I wreszcie CI któremu chciałem poświęcić ten post,  jednak ze względu na przydługawy wstęp napiszę o nim w następnej części. Teraz wspomnę tylko, że dla małych projektów jest darmowy i nic nie trzeba instalować.



<sub>Zdjęcie tytułowe pochodzi z https://www.pexels.com </sub>
👍  , , , , , , , , , , , , , , , , , , , , , , , , , , ,
properties (23)
authorpiotr-galas
permlinko-continuous-integration
categorypolish
json_metadata{"tags":["polish","pl-artykuly","pl-ruby","programowanie","pl-ci"],"image":["https://steemitimages.com/DQmdaaRDxd8zWUvjjCi7s95JA4xCxJcTayadcAgXkiYQw9R/image.png","https://steemitimages.com/DQmQwAwcS1WhDWDhMe33fRpgRNJE5bMf4HRKGEyNcViypsM/Peek%202018-01-04%2000-56.gif","https://steemitimages.com/DQmP813oh2DKAK6XEUYz1pbtWNP2W3h2wRzX2Y21NAJvBNX/Selection_017.png","https://steemitimages.com/DQmSbdX8yyMBhmZLZcpdfmVvLZp7jDAjoQhkpHTpitUmvdt/Selection_018.png","https://steemitimages.com/DQmZnS9BHmvd76TnKKe2qUqRNDfhipSaXsRPnuu96dPwcFm/Selection_019.png","https://steemitimages.com/DQmXnKdPNP5cWM6ydjJuRCo1Yv7cniwKH6cjjCGA53BQNay/Selection_020.png"],"links":["https://jenkins-ci.org/","https://travis-ci.org/","https://about.gitlab.com/features/gitlab-ci-cd/","https://docs.gitlab.com/ce/ci/yaml/README.html","https://bitbucket.org/product/features/pipelines","https://www.pexels.com"],"app":"steemit/0.1","format":"markdown"}
created2018-01-05 07:54:33
last_update2018-01-05 07:54:33
depth0
children8
last_payout2018-01-12 07:54:33
cashout_time1969-12-31 23:59:59
total_payout_value8.857 HBD
curator_payout_value2.427 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length5,809
author_reputation367,232,102,431
root_title"O Continuous Integration"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id27,223,059
net_rshares1,143,788,403,678
author_curate_reward""
vote details (28)
@grzesiekb ·
$0.43
Wydaje się, że dzisiaj nie da się bez CI prowadzić projektu bardzo fajny artykuł. Od siebie dodam, że na Travis CI wersji open-source (darmowej) możemy generować doker-a, gdzie  możemy sprawdzić czy projekt działa, lub dużo łatwiej i bezpieczniej go wdrażać u klienta.
👍  ,
properties (23)
authorgrzesiekb
permlinkre-piotr-galas-o-continuous-integration-20180107t162744472z
categorypolish
json_metadata{"tags":["polish"],"app":"steemit/0.1"}
created2018-01-07 16:27:45
last_update2018-01-07 16:27:45
depth1
children0
last_payout2018-01-14 16:27:45
cashout_time1969-12-31 23:59:59
total_payout_value0.434 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length268
author_reputation2,800,305,353,550
root_title"O Continuous Integration"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id27,795,373
net_rshares43,200,488,913
author_curate_reward""
vote details (2)
@piotr42 ·
$0.02
Cześć @piotr-galas, przydatny post, dzięki! Sam korzystam (w mniejszym lub większym stopniu) z Jenkins i zaciekawiło mnie stwierdzenie, że Jenkins jest reliktem przeszłości. Rozwiniesz? :)

Pozdrawiam
👍  
properties (23)
authorpiotr42
permlinkre-piotr-galas-o-continuous-integration-20180105t115058320z
categorypolish
json_metadata{"tags":["polish"],"users":["piotr-galas"],"app":"steemit/0.1"}
created2018-01-05 11:50:57
last_update2018-01-05 11:50:57
depth1
children5
last_payout2018-01-12 11:50:57
cashout_time1969-12-31 23:59:59
total_payout_value0.015 HBD
curator_payout_value0.005 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length200
author_reputation2,999,610,276,061
root_title"O Continuous Integration"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id27,263,518
net_rshares2,540,614,600
author_curate_reward""
vote details (1)
@piotr-galas ·
$0.05
Dobre pytanie, zmusiło mnie do tego aby zrobić mały research. Projekt powstał w 2011, więc nie jest jeszcze taki stary, choć jego początek sięga  projektu Hudson i roku 2005. Patrząc w internecie jest jednym z najpopularniejszych CI. Ma też pluginy które właściwie rozszerzają jego funkcjonalność w dowolny sposób. 

--------

Moja opinia wynika z tego,  że dziś takie rzeczy można zrobić naprawdę dużo prościej.  Nie trzeba mieć własnego serwera,  konfugurować go,  dbać o jego bezpieczeństwo. Moje doświadczenia z Jenkinsem nie są zbyt dobre. Generalnie przynajmniej kilka razy w tygodniu coś się psuło, przez co zamiast pracować rozwiązywałem problemy z bulidami kolegów. Był moment, że jak słyszałem "Piotrek... build mi niprzeszedł. Chyba Jenkins nie działa" robiłem się czerwony.

----

Myślę, że zdecydowanie łatwiej jest wrzucić do repozytorium plik konfuguracyjny (łatwy i intuicyjny), oparty o DSL zbliżony do Dockera. Reszta dzieje się sama.  Zarówno na Bitbucket Pipelines jak i  na GitLab CI na których ostatnio pracuje, błędy związane z konfiguracją zdarzają się bardzo rzadko. Wydaje mi się, że w dzisiejszych czasach lepiej jest zapłacić za CI i nie poświęcać czasu na konfigurowanie go.
Jeśli jednak ktoś potrzebuje jakiejś bardzo specyficznej rzeczy, to pewnie Jenkins się przyda. 
Innym aspektem jest to, że w swojej karierze widziałem tylko jeden projekt oparty o Jenkinsa, który zresztą sam konfigurowałem i zaczynałem. Taka była decyzja naszego teemu. Wszyskie inne projekty korzystały z rozwiazań  typu SAAS. 

----

Chciałem też podkreślić, że jest to moja prywatna opinia i nie chciałem nią nikogo urazić. Post kierowany był raczej do osób które zaczynają przygodę z programowaniem. Weźmy np programistę JS który ma 1 rok doświadczenia. Czy będzie on w stanie postawić CI Jenkinsa? Pewnie miałby z tym problem. A czy byłby w stanie postawić CI oprate np o Bitbucket Pipelines, albo Travisa? Myślę że bez problemu
👍  , ,
properties (23)
authorpiotr-galas
permlinkre-piotr42-re-piotr-galas-o-continuous-integration-20180105t203939772z
categorypolish
json_metadata{"tags":["polish"],"app":"steemit/0.1"}
created2018-01-05 20:39:39
last_update2018-01-05 20:39:39
depth2
children3
last_payout2018-01-12 20:39:39
cashout_time1969-12-31 23:59:59
total_payout_value0.046 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length1,937
author_reputation367,232,102,431
root_title"O Continuous Integration"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id27,365,982
net_rshares4,983,838,657
author_curate_reward""
vote details (3)
@piotr42 ·
$0.03
Cześć @piotr-galas, interesujący i wyczerpujący komentarz :) Dzięki!

Muszę się zgodzić w 100% w kwestii instalacji i konfiguracji Jenkins'a, może to być mozolny proces. Zaczynając z Jenkinsem niejednokrotnie potrzebowałem pomocy administratora, mnóstwo czasu poświęciłem na poszukiwania, instalację i konfigurację wtyczek, a i tak koniec końców pojawiały się problemy. Raz zdarzyło się nawet, że ktoś dostał się do naszego serwera produkcyjnego właśnie poprzez Jenkins'a (build'y były deploy'owane przez SSH-plugin, a Jenkins dostępny z zewnątrz) i odpalił tam sobie algorytm do kopania krytowalut :)

> Wydaje mi się, że w dzisiejszych czasach lepiej jest zapłacić za CI i nie poświęcać czasu na konfigurowanie go.

Zgadzam się, natomiast dodałbym od siebie, że niekoniecznie musi to być najlepsza decyzja, gdy potrzebujemy rozwiązania 'szytego na miarę', choćby ze względu na niezliczoną ilość wtyczek do Jenkins, o których wspomniałeś. W przypadku małego zespołu, trafiłeś w sedno.

Powiem szczerze, że po przeczytaniu Twojego komentarza, zaczynam się poważnie zastanawiać nad przetestowaniem Pipelines. Chodziło mi to po głowie od jakiegoś czasu, choćby ze względu na to, że w zespole korzystamy z BitBucket'a - brakowało mi jednak wystarczającego bodźca :)

P.S.: Skoro jesteśmy już przy temacie CI, to czy może ktoś słyszał/korzystał z TeamCity (od JetBrains)?
👍  
properties (23)
authorpiotr42
permlinkre-piotr-galas-re-piotr42-re-piotr-galas-o-continuous-integration-20180106t140631236z
categorypolish
json_metadata{"tags":["polish"],"users":["piotr-galas"],"app":"steemit/0.1"}
created2018-01-06 14:06:30
last_update2018-01-06 14:06:30
depth3
children2
last_payout2018-01-13 14:06:30
cashout_time1969-12-31 23:59:59
total_payout_value0.020 HBD
curator_payout_value0.005 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length1,367
author_reputation2,999,610,276,061
root_title"O Continuous Integration"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id27,531,533
net_rshares2,839,085,259
author_curate_reward""
vote details (1)
@whitas ·
He he :) też na to zwróciłem uwagę, sam używam tego kombajnu i ciekawy jestem co Piotr miał na myśli :)
properties (22)
authorwhitas
permlinkre-piotr42-re-piotr-galas-o-continuous-integration-20180105t161718044z
categorypolish
json_metadata{"tags":["polish"],"app":"steemit/0.1"}
created2018-01-05 16:17:18
last_update2018-01-05 16:17:18
depth2
children0
last_payout2018-01-12 16:17:18
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length103
author_reputation524,713,443,817
root_title"O Continuous Integration"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id27,318,035
net_rshares0
@piotras ·
$0.36
pomocna tresc
👍  
properties (23)
authorpiotras
permlinkre-piotr-galas-o-continuous-integration-20180105t080050735z
categorypolish
json_metadata{"tags":["polish"],"app":"steemit/0.1"}
created2018-01-05 08:00:51
last_update2018-01-05 08:00:51
depth1
children0
last_payout2018-01-12 08:00:51
cashout_time1969-12-31 23:59:59
total_payout_value0.358 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length13
author_reputation434,677,846,131
root_title"O Continuous Integration"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id27,224,093
net_rshares36,453,066,606
author_curate_reward""
vote details (1)