Differences

This shows you the differences between two versions of the page.

Link to this comparison view

idp:laboratoare:06 [2021/04/21 17:38]
radu.ciobanu
idp:laboratoare:06 [2023/02/22 11:12] (current)
radu.ciobanu
Line 1: Line 1:
 ===== Laboratorul 06 - Portainer și GitLab CI/CD ===== ===== Laboratorul 06 - Portainer și GitLab CI/CD =====
  
-==== Introducere ==== 
  
-În acest laborator, vom discuta despre utilizarea Portainer, care acționează ca un GUI pentru Docker Swarm. În plus, vom implementa procesul de CI/CD („continuous integration and continuous deployment”) utilizând GitLab CI/CD și Portainer. 
- 
-Laboratorul se va desfășura pe local sau folosind Docker Machine, întrucât infrastructura de la Play With Docker nu permite rularea runner-ilor de GitLab. 
- 
-==== Portainer ==== 
- 
-[[https://​www.portainer.io|Portainer]] este o platformă Web care permite administrarea unui cluster Docker Swarm. 
- 
-{{:​cc:​laboratoare:​portainer.png?​800|}} 
- 
-Portainer poate rula ca un container separat sau ca serviciu de Swarm. **Vă recomandăm să îl rulați ca serviciu de Swarm**. 
- 
-<note tip>În cazul în care rulează ca serviciu de Swarm, Portainer are două componente: aplicația Web propriu-zisă,​ și un agent care rulează în mod global (pe toate nodurile).</​note>​ 
- 
-Un exemplu de fișier Docker Compose de stivă de servicii pentru Portainer poate fi observat mai jos. 
- 
-<code yaml> 
-version: '​3.2'​ 
- 
-services: 
-    agent: 
-        image: portainer/​agent 
-        volumes: 
-            - /​var/​run/​docker.sock:/​var/​run/​docker.sock 
-            - /​var/​lib/​docker/​volumes:/​var/​lib/​docker/​volumes 
-        networks: 
-            - agent_network 
-        deploy: 
-            mode: global 
-            placement: 
-                constraints:​ [node.platform.os == linux] 
- 
-    portainer: 
-        image: portainer/​portainer-ce 
-        command: -H tcp://​tasks.agent:​9001 --tlsskipverify 
-        ports: 
-            - "​9000:​9000"​ 
-            - "​8000:​8000"​ 
-        volumes: 
-            - portainer_data:/​data 
-        networks: 
-            - agent_network 
-        deploy: 
-            mode: replicated 
-            replicas: 1 
-            placement: 
-                constraints:​ [node.role == manager] 
- 
-networks: 
-    agent_network:​ 
-        driver: overlay 
-        attachable: true 
- 
-volumes: 
-    portainer_data:​ 
- 
-</​code>​ 
- 
-Pe lângă utilitatea oferită de posibilitatea gestiunii cluster-ului prin interfața vizuală, Portainer oferă **//​webhook-uri//​** de CI/CD. Un webhook este un endpoint care, atunci când este accesat, execută o acțiune. În cazul Portainer, webhook-urile vor actualiza serviciile de Docker. Pentru a genera un webhook, se intră pe pagina serviciului și se face toggle pe „Service Webhook”, așa cum se observă în imaginea de mai jos. 
- 
-{{:​cc:​laboratoare:​portainer_webhook.png?​800|}} 
- 
-<note important>​ 
-Pentru a crea un webhook, trebuie mai întâi ca serviciul să ruleze în cadrul Docker Swarm. 
-</​note>​ 
- 
-==== Gitlab CI/CD ==== 
- 
-Conceptul de **//​CI/​CD//​** se referă la: 
-  * continuous integration - integrarea automată în sistem a modificărilor de cod 
-  * continuous deployment - plasarea automată a codului modificat în testare/​producție. 
- 
-Acest concept se mulează natural pe filozofia microserviciilor,​ unde o aplicație este „spartă” în mai multe **//module separate și independente//​**. Pe măsură ce codul unui modul este actualizat, acesta este integrat automat în sistem, fără să perturbe execuția celorlalte module. 
- 
-În acest laborator, se exemplifică procesul de CI/CD folosind GitLab. Gitlab CI/CD se bazează pe două componente: 
- 
-  * [[https://​docs.gitlab.com/​runner/​|Gitlab Runners]] - procese care executa pipeline-uri 
-  * //​**.gitlab-ci.yml**//​ - fișier YAML de configurații declarative,​ care descrie ce face fiecare etapă dintr-un pipeline. 
- 
-<note tip> 
-Un runner execută un pipeline. Un pipeline este format din etape. Fiecare etapă este descrisă în fișierul de configurație **//​.gitlab-ci.yml//​**.</​note>​ 
- 
-==== Structura codului sursă ==== 
- 
-Pentru a putea folosi conceptul de CI/CD cu GitLab cat mai eficient, se recomandă ca fiecare microserviciu să se afle în propriul său **//​repository//​**,​ iar toate repository-urile să fie grupate într-un **//​grup//​**. Așadar, pentru acest laborator, vom avea următoarele repository-uri:​ 
-  * IOService - conține codul pentru microserviciul IO implementat la laboratoarele anterioare 
-  * BooksService - conține codul pentru microserviciul de cărți implementat la laboratoarele anterioare 
-  * Configs - conține fișierele de configurare necesare rulării stivei de servicii. 
- 
-Codul este accesibil pe [[https://​gitlab.com/​mobylab-idp|repo-ul oficial al laboratorului]]. 
- 
-==== Gitlab Runners ==== 
- 
-Gitlab Runners sunt procese care execută pipeline-uri. Atunci când se dă comanda //**git push**//, este lansat în execuție un pipeline aferent repository-ului respectiv (de aici recomandarea de a avea un repository per serviciu). 
- 
-Acestea vin în mai multe forme, însă modul cel mai faci de a lansa un runner în execuție este sub formă de containere Docker. 
- 
-=== Setup Gitlab Runners === 
- 
-Pentru a folosi un runner, este nevoie, in primul rand, sa accesati pagina repository-ului sau din pagina grupului, daca folositi grup. 
- 
-<note tip>Un runner de grup va putea rula pipelines pentru fiecare repository din grupul respectiv. Un runner de repository va rula pipelines doar pentru acel repository.</​note>​ 
- 
-<note tip>Noi vom folosi un runner de grup</​note>​ 
-Intrati in meniul de CI/CD al paginii de proiect 
- 
-{{:​cc:​laboratoare:​mobygrouprunner.png?​800|}} 
- 
-si apoi selectati optiunea "​Expand"​ din dreptul "​Runners"​ 
- 
-{{:​cc:​laboratoare:​group_runner.png?​800|}} 
- 
-O sa observati ca noi avem un runner pornit pentru grupul nostru MobyCloudComputing. Este runnerul folosit de test la acest laborator. 
- 
-=== Instalare Gitlab Runners folosind Docker === 
- 
-Instalarea unui runner folosind docker este [[https://​docs.gitlab.com/​runner/​install/​docker.html|simpla]] si necesita 3 pasi: 
- 
-    - "​Instalarea runnerului"​ 
-    - Inregistrarea runnerului 
-    - Schimbarea fisierului de configuratie config.toml 
- 
-== Instalarea efectiva == 
-Trebuie sa rulati comanda 
- 
-<code bash> 
-   ​docker run -d --name gitlab-runner --restart always \ 
-     -v /​srv/​gitlab-runner/​config:/​etc/​gitlab-runner \ 
-     -v /​var/​run/​docker.sock:/​var/​run/​docker.sock \ 
-     ​gitlab/​gitlab-runner:​latest 
-</​code> ​ 
-<note important>​Atentie,​ runnerul va rula in modul bind mount. Calea de pe host pe care o dati runnerului (in cazul de fata, /​srv/​gitlab-runner/​config) trebuie sa existe. In ea vor fi retinue configuratiile runnerului din interiorul containerului.</​note>​ 
- 
-== Inregistrarea runnerului == 
-Trebuie sa rulati comanda ​ 
- 
-<code bash> 
-docker run --rm -it -v /​srv/​gitlab-runner/​config:/​etc/​gitlab-runner gitlab/​gitlab-runner register 
-</​code>​ 
- 
-si sa urmati pasii specificati 
-<note tip>​Tokenul de inregistrare este cel din pagina grupului vostru</​note>​ 
-<note warning>​Va trebui sa folositi grupul personal de gitlab si runnerul vostru personal. Nu folositi token-ul de inregistrare al grupului MobyCloudComputing</​note>​ 
-<note tip>​Tineti minte ce specificati la tag. **Tag-ul runnerului va fi folosit in cadrul .gitlab-ci.yml**</​note>​ 
-<note tip>​Atunci cand vi se cere imaginea de docker, specificati **docker:​19.03**</​note>​ 
-<note important>​Observati ca trebuie sa specificati aceeasi cale de bind mount, ca la prima comanda</​note>​ 
- 
-== Modificarea fisierului de configuratie config.toml == 
- 
-Runnerul de gitlab care ruleaza in docker se bazeaza pe conceptul //dind// (docker-in-docker). Pentru anumite operatii, este nevoie de acces elevat asupra sistemului docker din gazda. Asadar, trebuie facute 2 mici modificari asupra fisierului de configuratie **config.toml**. 
- 
-<note tip>Veti gasi fisierul la calea specificata in comanda de rulare de la etapa 1 (cea de instalare)</​note>​ 
-{{:​cc:​laboratoare:​config_toml.png|?​800}} 
- 
-<note tip>​Observati liniile marcate cu un punct verde</​note>​ 
- 
-Modificarile sunt urmatoarele:​ 
-  * **privileged** trebuie sa fie setat pe **true** 
-  * la volume trebuie adaugat si **"/​var/​run/​docker.sock:/​var/​run/​docker.sock"​** 
- 
-Dupa ce efectuati modificarile,​ executati comanda: 
- 
-<code bash> 
-sudo docker restart gitlab-runner 
-</​code>​ 
- 
-=== Scriere script .gitlab-ci.yml === 
- 
-Scritpul **.gitlab-ci.yml** descrie executia pipeline-ului pe un runner. Un exemplu de script este cel folosit in cadrul laboratorului. ​ 
-<note tip>Va trebuie sa scrieti cate un script .gitlab-ci.yml pentru fiecare repository. Scripturile sunt, oricum, similare.</​note> ​ 
- 
-<code yaml> 
-docker-build-master:​ 
-  # Official docker image. 
-  stage: build 
-  before_script:​ 
-    - docker login -u "​$CI_REGISTRY_USER"​ -p "​$CI_REGISTRY_PASSWORD"​ $CI_REGISTRY 
-  script: 
-    - docker build --pull -t "​$CI_REGISTRY_IMAGE"​ . 
-    - docker push "​$CI_REGISTRY_IMAGE"​ 
-  only: 
-    - master 
-  tags: 
-    - lab-cc-pwd 
- 
-# deploy-service-master:​ 
-#   ​stage:​ deploy 
-#   ​script:​ 
-#     - apk add --update curl 
-#     - curl -XPOST http://​host.docker.internal:​9000/​api/​webhooks/​78074a4c-840c-4152-a9ab-b094fa5e525b 
-#   only: 
-#     - master 
-#   tags: 
-#     - lab-cc-pwd 
- 
-</​code>​ 
- 
-Acest script descrie doua etape ale pipeline-ului:​ 
-  * **build** - codul este construit intr-o imagine de docker si salvat in registrul privat de gitlab 
-  * **deploy** - serviciul de docker este incarcat in clusterul de Swarm, utilizat un **webhook** Portainer 
- 
-<note tip>​Observati ca partea de deploy este comentata. Am facut acest lucru din mai multe motive: 
-  * in primul rand, un webhook trebuie creat **dupa ce serviciul ruleaza deja in Swarm**. Asta inseamna ca prima oara, deploymentul se va face manual, prin comanda **docker stack deploy** 
-  * in al doilea rand, link-ul pentru webhook difera de la persoana la persoana 
-</​note>​ 
- 
-<note tip>​Observati cum IP-ul este **host.docker.internal** desi Portainer a generat webhook utilizand **localhost**</​note>​ 
- 
-==== Rularea configuratiei de laborator ==== 
- 
-Pentru a rula exemplul din laborator, este nevoie sa efectuati urmatoarele comenzi in repository-ul **Configs** 
- 
-<code bash> 
-docker stack deploy -c stack-kong.yml lab4-cluster 
-</​code>​ 
- 
-<code bash> 
-docker stack deploy -c portainer-agent-stack.yml portainer 
-</​code>​ 
- 
-Puteti accesa container pe adresa //​localhost:​9000//​ 
- 
-==== Mentiuni lucru individual ==== 
- 
-Daca doriti sa lucrati individual cu partea de CI/CD, este **obligatoriu** sa va faceti propriul grup de gitlab si propriile repositories.  ​ 
- 
-Pentru a testa ca va merge partea de CI/CD, la o modificare de cod si rularea comenzii ​ 
- 
-<code git> 
-git push -u origin master 
-</​code>​ 
- 
-ar trebui sa vedeti executia cu succes a unui pipeline din panoul CI/CD al repository-ului. 
- 
-{{:​cc:​laboratoare:​pipelines_1.png?​800|}} 
- 
-{{:​cc:​laboratoare:​pipeline_success.png?​800|}} 
idp/laboratoare/06.1619015885.txt.gz · Last modified: 2021/04/21 17:38 by radu.ciobanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0