CI oraz CD w złożonym projekcie o małym budżecie

255 views 1 download

Transcript of CI oraz CD w złożonym projekcie o małym budżecie

Potrzeba Założenia Technologie Projekt Realizacja EOP

CI oraz CD w złożonym projekcie o małymbudżecie

Historia oparta na faktach

G. Godlewski

28 lutego 2016

Potrzeba Założenia Technologie Projekt Realizacja EOP

O autorze

W wolnym czasie programuję pracując nad swoimi pomysłami,trenuję karate, muzykuję i param się serowarstwem.

Potrzeba Założenia Technologie Projekt Realizacja EOP

Podstawowe problemy

Zawsze brakuje:

Pieniędzy

Ludzi

Czasu

Wiedzy

Doświadczenia

Ludzie posiadają ograniczone możliwości uczenia się i pojmowaniawiedzy. Zrób jak najlepiej za pierwszym razem, nie będzie trzebado tego wracać.

Potrzeba Założenia Technologie Projekt Realizacja EOP

Potrzeba Założenia Technologie Projekt Realizacja EOP

Potrzeba Założenia Technologie Projekt Realizacja EOP

Zakres do automatyzacji

Testy jednostkowe (co piszę)

Testy funkcjonalne (co klikam)

Składniki jakościowe (nightly build, code coverage, phpmd,phpcs, jshint, jslint, ...)

Przygotowanie aplikacji do testów (deployment itp)

Wszystko co powtarzalne i wykonywane często!

Miejsc do szukania oszczędności czasu przez należy poszukiwaćciągle.

Potrzeba Założenia Technologie Projekt Realizacja EOP

Continuous Integration

Martin Fowler:Continuous Integration is a software development

practice where members of a team integrate theirwork frequently, usually each person integrates at leastdaily - leading to multiple integrations per day. Eachintegration is verified by an automated build (includingtest) to detect integration errors as quickly as possible.

Potrzeba Założenia Technologie Projekt Realizacja EOP

Continuous Delivery

Martin Fowler:A common question we hear is “what is the difference

between Continuous Delivery and ContinuousDeployment?” Both terms are similar and were coinedaround the same time. I see the difference as a businessdecision about frequency of deployment into production.Continuous Delivery is about keeping your applicationin a state where it is always able to deploy intoproduction. Continuous Deployment is actuallydeploying every change into production, every day ormore frequently.

A gdy nie jesteśmy pewni?

Automatyzacja do etapu staging, a potem ”promote to production”

Potrzeba Założenia Technologie Projekt Realizacja EOP

12-factor app

Rysunek 1 : http://12factor.net

Potrzeba Założenia Technologie Projekt Realizacja EOP

Kodeks postępowania

Stosowanie zasada Pareta

Duże operacje mają być wykonywane jedną linijką - 3działania i więcej - do skryptu

Rozwiązania mają być ładne, zgrabne, poprawne i lekkie wutrzymaniu - „this small”

Małe i luźno powiązane elementy łatwiej się utrzymuje

Powtarzalność redukuje złożoność, stwórz konwencję i się jejtrzymaj

Projektuj i działaj w oparciu o kontrakty

Co się da i ma sens, przenoś do konfiguracji zudokumentowaną wartością domyślną

Potrzeba Założenia Technologie Projekt Realizacja EOP

PHP

7.0.3 - nowość, nowość nowość!

composer - zarządzanie zależnościami

phing - kontrakt pomiędzy projektem a systemem CI

wszystko z czym można eksperymentować (PHP DataStructures itp)

Potrzeba Założenia Technologie Projekt Realizacja EOP

Silex

Bardzo mały footprint

Kompatybilny z najnowszym PHP

Dostarcza łatwej obsługi Request i Response

Na etapie budowania prostych API nie potrzebuję nic więcej

Ładnie się integruje z pozostałymi komponentami Symfony

Potrzeba Założenia Technologie Projekt Realizacja EOP

TeamCity

Wersja darmowa:

3 build agent’y

20 build configurations

Duże możliwości w zakresie konfiguracji (parametry buildów,szablony konfiguracji, definiowanie zależności etc)

Potrzeba Założenia Technologie Projekt Realizacja EOP

Git

Bo wszystko inne to herezja

BitBucket - prywatne repozytoria za darmo do 5 osób, dlamałych zespołów idealne rozwiązanie

TeamCity VCS root bardzo ładnie się integruje i wspiera Git

Potrzeba Założenia Technologie Projekt Realizacja EOP

Bash / Make

Stosowanie podejścia: configure, make, make install (tematzamknięty w 3 krokach)

Skrypty wspomagające / upraszczające uruchamianie /restartowanie aplikacji

Każde zadanie wymagające co najmniej 3 kroków należyzłożyć do 1 skryptu

Potrzeba Założenia Technologie Projekt Realizacja EOP

Docker

Przeprowadzanie procesu CI wewnątrz izolowanychkontenerów (docker in docker, sic!)

Zapewnienie ‘opakowania dla produktu‘, w którym będziewysyłany na serwer

Prywatny Docker Hub (run in docker) - musimy gdzieśudostępniać budowane obrazy

Rozszerzanie dostępnych obrazów i ich dostosowanie donaszych potrzeb

Docker Compose w celu uruchamiania grup kontenerów (wszczególności 1 element)

Potrzeba Założenia Technologie Projekt Realizacja EOP

Ansible

Opisanie sposobu dostarczenia produktu do odbiorcy(deployment na serwer)

Zarządzanie infrastrukturą (zapewnienie odpowiedniejkonfiguracji)

Bardzo dobra dokumentacja

Bardzo duża liczba modułów - jeszcze nie trafiłem nakonieczność pisania własnych

Potrzeba Założenia Technologie Projekt Realizacja EOP

Sposób postrzegania produktu

Potrzeba Założenia Technologie Projekt Realizacja EOP

Cykl życia produktu

Produkcja - składanie z części, diagnostyka, usunięciezbędnych elementów

Pakowanie - gotowy produkt złożony tylko z częścifinałowych pakowany jest w pudełko / kontener

Dostarczenie - przekazanie do odbiorcy - pod wskazanyadres, w określony sposób

Każdy z etapów procesu ma jasno określone granice - wejście /wyjście

Potrzeba Założenia Technologie Projekt Realizacja EOP

Kompletne rozwiązanie

W przypadku produktu złożonego z wielu komponentów, możemyposłużyć się analogią do zakupu zestawu kuchennego:

Wszystkie pudełka zawierają komponenty produktyspełniające szereg wymogów

Wiemy jak komponenty mają być ze sobą połączone

Wiemy jak komponenty powinny być rozmieszczone docelowow infrastrukturze klienta

Potrzeba Założenia Technologie Projekt Realizacja EOP

Przepływ pracy

Potrzeba Założenia Technologie Projekt Realizacja EOP

Przepływ pracy

Potrzeba Założenia Technologie Projekt Realizacja EOP

Repozytoria

W pracy z dużą liczbą repozytoriów może pomóc zastosowaniekonwencji:

Szablon

(1 ) [ p r o j ]− source−[x ]( 2 ) [ p r o j ]− image−[x ]( 3 ) [ p r o j ]− image−[x]−dev

1 Kod źródłowy produktu2 Kod źródłowy obrazu, który będzie zawierał gotowy produkt3 Kod źródłowy deweloperskiej wersji obrazu dla produktu

Przykład

foo−source−s e r v i c e−paymentfoo−image−s e r v i c e−paymentfoo−image−s e r v i c e−payment−dev

Potrzeba Założenia Technologie Projekt Realizacja EOP

Zatrudniamy agentów

Potrzeba Założenia Technologie Projekt Realizacja EOP

Zatrudniamy agentów

Potrzeba Założenia Technologie Projekt Realizacja EOP

Rozszerzanie obrazów

Potrzeba Założenia Technologie Projekt Realizacja EOP

Plan działań

1 Przygotowanie projektu (projektów) do CI2 Przygotowanie infrastruktury pod CI3 Przygotowanie samego serwera CI4 Opracowanie konfiguracji (Build Configurations)

Potrzeba Założenia Technologie Projekt Realizacja EOP

Przygotowanie projektu

Pełna dowolność użycia narzędzia: make, phing, ant, maven -dosłownie cokolwiek, byle by z głową.

Jedną komendą powinniśmy być w stanie (zadanie dla buildagent’a):

Podłączyć wszystkie wymagane zależności

Przeprowadzić diagnostykę

Zdemontować zależności niewymagane przez odbiorcę

Przygotować paczkę do dystrybucji

Potrzeba Założenia Technologie Projekt Realizacja EOP

Budowanie samego projektu

<?xml version="1.0"?><project name="Project name" default="build">

<target name="build"><phingcall target="clean" /><phingcall target="configure" /><phingcall target="dependencies-dev" /><phingcall target="tests" /><phingcall target="assets" /><phingcall target="dependencies-dist" /><phingcall target="package" />

</target>

<!-- Further targets -->

Potrzeba Założenia Technologie Projekt Realizacja EOP

Budowanie samego projektu

Plik build.xml zawiera opis wszystkich operacji - stanowi pomostpomiędzy projektem, a agentem.

Wykonywanie build’u

$ phing

Domyślny build target: build.

W każdym komponencie systemu (serwisie etc), który będziebudowany przez serwer CI należy stosować to samo podejście -powtarzalność redukuje złożoność!

Potrzeba Założenia Technologie Projekt Realizacja EOP

Przygotowanie infrastruktury

1 Odpowiedni kernel (już od 3.10!)2 Odpowiednie moduły kernela (aufs, devicemapper itp - zależy

od distro)3 Zainstalowany docker4 Zainstalowany docker-compose

Potrzeba Założenia Technologie Projekt Realizacja EOP

Pułapka Docker i DeviceMapper

Jeżeli używacie sterownika devicemapper, zwróćcie uwagę abyUdev Sync Supported było ustawionena true.

Potrzeba Założenia Technologie Projekt Realizacja EOP

Przygotowanie serwera

Docker Hub (registry)

Serwer TeamCity (sjoerdmulder/teamcity)

Agenty TeamCity (sjoerdmulder/teamcity-agent)

W rzeczywistym zastosowaniu powinniśmy mieć swójwyspecjalizowany obraz agent’a, rozszerzający wspomniany wyżej.

Potrzeba Założenia Technologie Projekt Realizacja EOP

Docker Hub

hub:restart: alwaysimage: registry:2ports:- "5000:5000"environment:TERM: linuxREGISTRY_HTTP_TLS_CERTIFICATE: :)REGISTRY_HTTP_TLS_KEY: :)REGISTRY_AUTH: htpasswdREGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswdREGISTRY_AUTH_HTPASSWD_REALM: Registry Realmvolumes:- "/home/docker-distro/registry/data:/var/lib/registry"- "/etc/ssl/certs:/certs"- "/etc/ssl/private:/keys"- "/home/docker-distro/registry/auth:/auth"

Potrzeba Założenia Technologie Projekt Realizacja EOP

TeamCity Server

server:image: "sjoerdmulder/teamcity:latest"ports:- "8111:8111"

volumes:- "/home/teamcity/server/data:/var/lib/teamcity"

environment:TERM: linux

Potrzeba Założenia Technologie Projekt Realizacja EOP

TeamCity Agent

agent:image: "sjoerdmulder/teamcity:latest"ports:- "9090:9090"

volumes:- "/var/run/docker.sock:/var/run/docker.sock" # docker in docker- "/usr/bin/docker:/usr/bin/docker"- "/usr/bin/docker:/usr/local/bin/docker"- "/home/teamcity/agent/work:/opt/buildAgent/work" # work directories- "/home/teamcity/agent/composer:/opt/composer/cache" # composer cache- "/home/teamcity/agent/docker:/home/teamcity/.docker" # hub auth keys

environment:TERM: linuxTEAMCITY_SERVER: "http://teamcity_server:8111" # your serverTEAMCITY_AGENT_NAME: "Alpha"AGENT_HOME_ON_HOST: "/home/teamcity/agent"

Potrzeba Założenia Technologie Projekt Realizacja EOP

Konfigurowanie serwera

Zdefiniować VCS roots, które będą używane

Określenie parametrów konfiguracji (nawet komend, szukaniewspólnych mianowników

Zdefiniowanie konfiguracji build’u

Artefakty!

Zdefiniowanie zależności między konfiguracjami

Zdefiniowanie triggerów buildów

Potrzeba Założenia Technologie Projekt Realizacja EOP

Wdrażanie

Zadanie dla Ansible:

Przygotowanie docker-compose.yml z odpowiednią wersjąobrazu do wdrożenia

Przygotowanie skryptów pomocniczych (start, stop, restartitp).

Uruchomienie przy pomocy skryptu pomocniczego

Wszystkie dodatkowe zadania (ustawienie monitorowania itp).

Wasza infrastruktura wymusi konkretne kroki.

Potrzeba Założenia Technologie Projekt Realizacja EOP

No dobra, ale co w przypadku projektu spadkowego?

Potrzeba Założenia Technologie Projekt Realizacja EOP

Dziękuję za uwagę!

http://linkedin.com/in/ggodlewskigrzegorz@sorcerystudio.com

@GGodlewski