CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui

CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui
Šiame straipsnyje pasidalinsiu savo patirtimi nustatant CI/CD naudojant „Plesk Control Panel“ ir „Github Actions“. Šiandien sužinosime, kaip įdiegti paprastą projektą nesudėtingu pavadinimu „Helloworld“. Jis parašytas „Flask Python“ sistemoje, naudojant „Celery“ darbuotojus ir „Angular 8“ priekinę dalį.

Nuorodos į saugyklas: backend, frontend.

Pirmoje straipsnio dalyje apžvelgsime mūsų projektą ir jo dalis. Antrajame išsiaiškinsime, kaip nustatyti „Plesk“ ir įdiegti reikiamus plėtinius bei komponentus (DB, RabbitMQ, Redis, Docker ir kt.).

Trečioje dalyje pagaliau išsiaiškinsime, kaip sukurti konvejerį, skirtą mūsų projektui įdiegti serveryje kūrimo ir gamybos aplinkoje. Ir tada mes paleisime svetainę serveryje.

Ir taip, pamiršau prisistatyti. Mano vardas Olegas Borzovas, aš esu „Domclick“ hipotekos vadybininkų CRM komandos kūrėjas.

Projekto apžvalga

Pirmiausia pažvelkime į dvi projekto saugyklas – užpakalinę ir priekinę – ir peržvelkime kodą.

Užpakalinė dalis: kolba + salieras

Užpakalinei daliai paėmiau gana populiarią Python kūrėjų grupę: Flask framework (skirta API) ir Celery (užduočių eilei). SQLAchemy naudojama kaip ORM. Alembic naudojamas migracijai. JSON patvirtinimui rankenose – Marshmallow.

В saugyklos yra Readme.md failas su išsamiu struktūros aprašymu ir projekto vykdymo instrukcijomis.

Žiniatinklio dalies API gana paprasta, susideda iš 6 rašiklių:

  • /ping - patikrinti prieinamumą;
  • tvarko registraciją, autorizavimą, panaikinimą ir įgalioto vartotojo gavimą;
  • el. pašto rankena, kuri įdeda užduotį į „Selery“ eilę.

Salierų dalis dar lengviau, yra tik viena problema send_mail_task.

Aplanke /conf yra du poaplankiai:

  • docker su dviem Docker failais (base.dockerfile sukurti retai besikeičiantį pagrindinį įvaizdį ir Dockerfile pagrindiniams mazgams);
  • .env_files - su failais su aplinkos kintamaisiais skirtingoms aplinkoms.

Projekto šaknyje yra keturi dokerio kūrimo failai:

  • docker-compose.local.db.yml sukurti vietinę duomenų bazę plėtrai;
  • docker-compose.local.workers.yml vietiniam darbuotojo auginimui, duomenų bazei, Redis ir RabbitMQ;
  • docker-compose.test.yml atlikti bandymus diegimo metu;
  • docker-compose.yml dislokavimui.

Ir paskutinis aplankas, kuris mus domina - .ci-cd. Jame yra diegimo apvalkalo scenarijai:

  • deploy.sh — perkėlimo ir diegimo pradžia. Veikia serveryje sukūrus ir paleidus „Github Actions“ testus;
  • rollback.sh - konteinerių grąžinimas į ankstesnę komplekto versiją;
  • curl_tg.sh - pranešimų apie diegimą siuntimas į „Telegram“.

Frontend ant Angular

Saugykla su priekiu daug paprastesnis nei Beck's. Priekyje yra trys puslapiai:

  • Pagrindinis puslapis su elektroninio pašto siuntimo forma ir išėjimo mygtuku.
  • Prisijungimo puslapis.
  • Registracijos puslapis.

Pagrindinis puslapis atrodo asketiškai:

CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui
Šakninėje dalyje yra du failai Dockerfile и docker-compose.yml, taip pat pažįstamą aplanką .ci-cd su šiek tiek mažiau scenarijų nei galinėje saugykloje (pašalinti scenarijai, skirti vykdyti testus).

Pradedame projektą Pleske

Pradėkime nuo Plesk nustatymo ir mūsų svetainės prenumeratos.

Plėtinių diegimas

Pleske mums reikia keturių plėtinių:

  • Docker valdyti ir vizualiai rodyti konteinerių būseną Plesk administratoriaus skydelyje;
  • Git sukonfigūruoti diegimo veiksmą serveryje;
  • Let's Encrypt generuoti (ir automatiškai atnaujinti) nemokamus TLS sertifikatus;
  • Firewall sukonfigūruoti gaunamo srauto filtravimą.

Galite juos įdiegti naudodami „Plesk“ administratoriaus skydelį, esantį skiltyje „Plėtiniai“:

CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui
Mes neatsižvelgsime į išsamius plėtinių nustatymus, numatytieji nustatymai bus tinkami demonstraciniams tikslams.

Sukurkite prenumeratą ir svetainę

Tada turime sukurti mūsų helloworld.ru svetainės prenumeratą ir pridėti ten dev.helloworld.ru padomenį.

  1. Sukurkite helloworld.ru domeno prenumeratą ir nurodykite sistemos vartotojo prisijungimo slaptažodį:

    CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui
    Pažymėkite langelį puslapio apačioje Apsaugokite domeną naudodami „Let's Encrypt“.jei norime svetainėje nustatyti HTTPS:

    CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui

  2. Tada šioje prenumeratoje sukurkite padomenį dev.helloworld.ru (kuriam taip pat galite išduoti nemokamą TLS sertifikatą):

    CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui

Serverio komponentų diegimas

Mes turime serverį su OS Debian Stretch 9.12 ir sumontuotas valdymo pultas Plesko obsidianas 18.0.27.

Turime įdiegti ir sukonfigūruoti savo projektą:

  • PostgreSQL (mūsų atveju bus vienas serveris su dviem duomenų bazėmis dev ir prod aplinkoms).
  • RabbitMQ (tas pats, tas pats egzempliorius su skirtingais aplinkos vhost'ais).
  • Du „Redis“ egzemplioriai (kuriems ir gamintojams).
  • „Docker“ registras (skirtas vietiniam „Docker“ vaizdų saugojimui).
  • „Docker“ registro vartotojo sąsaja.

PostgreSQL

Plesk jau yra su PostgreSQL DBVS, bet ne naujausia versija (rašant Plesk Obsidian palaikoma Postgres 8.4–10.8 versijos). Norime naujausios programos versijos (12.3 šio rašymo metu), todėl ją įdiegsime rankiniu būdu.

Yra daug išsamių instrukcijų, kaip įdiegti Postgres Debian tinkle (pavyzdys), todėl smulkiai jų neaprašysiu, tik duosiu komandas:

wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O - | sudo apt-key add -
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main" >> /etc/apt/sources.list.d/pgdg.list'

sudo apt-get update
sudo apt-get install postgresql postgresql-contrib

Atsižvelgiant į tai, kad PostgreSQL turi gana vidutinius numatytuosius nustatymus, būtina ištaisyti konfigūraciją. Tai mums padės skaičiuoklė: reikia įvesti savo serverio parametrus ir pakeisti nustatymus faile /etc/postgresql/12/main/postgresql.conftiems, kurie siūlomi. Reikėtų pažymėti, kad tokie skaičiuotuvai nėra stebuklinga kulka, o bazė turėtų būti sureguliuota tiksliau, atsižvelgiant į jūsų aparatinę įrangą, programą ir užklausos sudėtingumą. Bet to pakanka norint pradėti.

Be skaičiuoklės siūlomų nustatymų, mes taip pat keičiame postgresql.confnumatytasis prievadas 5432 į kitą (mūsų pavyzdyje - 53983).

Pakeitę konfigūracijos failą, iš naujo paleiskite postgresql-server komandą:

service postgresql restart

Įdiegėme ir sukonfigūravome PostgreSQL. Dabar sukurkime duomenų bazę, vartotojus kūrėjų ir gaminių aplinkoms ir suteikime vartotojams teises valdyti duomenų bazę:

$ su - postgres
postgres:~$ create database hw_dev_db_name;
CREATE DATABASE
postgres:~$ create user hw_dev_db_user with password 'hw_dev_db_password';
CREATE ROLE
postgres:~$ grant ALL privileges ON database hw_dev_db_name to hw_dev_db_user;
GRANT
postgres:~$ create database hw_prod_db_name;
CREATE DATABASE
postgres:~$ create user hw_prod_db_user with password 'hw_prod_db_password';
CREATE ROLE
postgres:~$ grant ALL privileges ON database hw_prod_db_name to hw_prod_db_user;
GRANT

TriušisMQ

Pereikime prie „RabbitMQ“, „Sellery“ pranešimų tarpininko, diegimo. Jį įdiegti „Debian“ yra gana paprasta:

wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
sudo dpkg -i erlang-solutions_1.0_all.deb

sudo apt-get update
sudo apt-get install erlang erlang-nox

sudo add-apt-repository 'deb http://www.rabbitmq.com/debian/ testing main'
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -

sudo apt-get update
sudo apt-get install rabbitmq-server

Įdiegę turime sukurti vhosts, vartotojams ir suteikti reikiamas teises:

sudo rabbitmqctl add_user hw_dev_amqp_user hw_dev_amqp_password 
sudo rabbitmqctl set_user_tags hw_dev_amqp_user administrator
sudo rabbitmqctl add_vhost hw_dev_vhost
sudo rabbitmqctl set_permissions -p hw_dev_vhost hw_dev_amqp_user ".*" ".*" ".*"

sudo rabbitmqctl add_user hw_prod_amqp_user hw_prod_amqp_password 
sudo rabbitmqctl set_user_tags hw_prod_amqp_user administrator
sudo rabbitmqctl add_vhost hw_prod_vhost
sudo rabbitmqctl set_permissions -p hw_prod_vhost hw_prod_amqp_user ".*" ".*" ".*"

Redis

Dabar įdiegkime ir sukonfigūruokime paskutinį mūsų programos komponentą - Redis. Jis bus naudojamas kaip užpakalinė programa, skirta Salierų užduočių rezultatams saugoti.

Naudodami plėtinį iškelsime du „Docker“ konteinerius su „Redis“, skirtą „dev“ ir „prod“ aplinkoms Docker už Pleską.

  1. Einame į Plesk, einame į skyrių „Plėtiniai“, ieškome „Docker“ plėtinio ir įdiekite jį (mums reikia nemokamos versijos):

    CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui

  2. Eikite į įdiegtą plėtinį, suraskite vaizdą per paiešką redis bitnami ir įdiekite naujausią versiją:

    CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui

  3. Einame į atsisiųstą konteinerį ir koreguojame konfigūraciją: nurodykite prievadą, didžiausią skirtą RAM dydį, slaptažodį aplinkos kintamuosiuose ir sumontuokite garsumą:

    CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui

  4. Prod konteineriui atliekame 2-3 veiksmus, nustatymuose keičiame tik parametrus: prievadą, slaptažodį, RAM dydį ir kelią į serverio apimties aplanką:

    CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui

Docker registras

Be pagrindinių paslaugų, būtų malonu į serverį įdėti savo „Docker“ vaizdų saugyklą. Laimei, serverio vieta dabar yra gana pigi (žinoma, pigesnė nei DockerHub prenumerata), o privačios saugyklos nustatymo procesas yra labai paprastas.

Mes norime turėti:

Norėdami tai padaryti:

  1. Sukurkime du subdomenus „Plesk“ savo prenumerata: docker.helloworld.ru ir docker-ui.helloworld.ru ir sukonfigūruokite jiems „Let's Encrypt“ sertifikatus.
  2. Pridėkite failą į docker.helloworld.ru padomenio aplanką docker-compose.yml su tokiu turiniu:
    version: "3"
    
    services:
      docker-registry:
        image: "registry:2"
        restart: always
        ports:
          - "53985:5000"
        environment:
          REGISTRY_AUTH: htpasswd
          REGISTRY_AUTH_HTPASSWD_REALM: basic-realm
          REGISTRY_AUTH_HTPASSWD_PATH: /auth/.htpasswd
          REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
        volumes:
          - ./.docker-registry.htpasswd:/auth/.htpasswd
          - ./data:/data
    
      docker-registry-ui:
        image: konradkleine/docker-registry-frontend:v2
        restart: always
        ports:
          - "53986:80"
        environment:
          VIRTUAL_HOST: '*, https://*'
          ENV_DOCKER_REGISTRY_HOST: 'docker-registry'
          ENV_DOCKER_REGISTRY_PORT: 5000
        links:
          - 'docker-registry'
    

  3. Pagal SSH sugeneruosime .htpasswd failą pagrindiniam autorizavimui Docker saugykloje:
    htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password
  4. Surinkite ir pakelkite konteinerius:
    docker-compose up -d
  5. Ir mes turime nukreipti Nginx į mūsų konteinerius. Tai galima padaryti per Plesk.

Docker.helloworld.ru ir docker-ui.helloworld.ru padomeniuose reikia atlikti šiuos veiksmus:

Skyriuje „Dev“ įrankiai eikite į mūsų svetainę „Docker“ tarpinio serverio taisyklės:

CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui
Ir pridėkite taisyklę, skirtą įeinančiam srautui į mūsų sudėtinį rodinį:

CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui

  1. Mes patikriname, ar galime prisijungti prie savo konteinerio iš vietinio įrenginio:
    $ docker login docker.helloworld.ru -u hw_docker_admin -p hw_docker_password
    WARNING! Using --password via the CLI is insecure. Use --password-stdin.
    Login Succeeded
  2. Taip pat patikrinkime docker-ui.helloworld.ru padomenio veikimą:

    CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui
    Kai paspausite Naršyti saugyklas, naršyklė parodys autorizacijos langą, kuriame turėsite įvesti saugyklos vartotojo vardą ir slaptažodį. Po to būsime perkelti į puslapį su saugyklų sąrašu (kol kas jis jums bus tuščias):

    CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui

Prievadų atidarymas Plesk ugniasienėje

Įdiegę ir sukonfigūravę komponentus, turime atidaryti prievadus, kad komponentai būtų pasiekiami iš Docker konteinerių ir išorinio tinklo.

Pažiūrėkime, kaip tai padaryti naudojant ugniasienės plėtinį, skirtą Plesk, kurį įdiegėme anksčiau.

  1. Eiti į Įrankiai ir nustatymai > Nustatymai > Užkarda:
    CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui
  2. Eiti į Modifikuoti Plesk ugniasienės taisykles > Pridėti tinkintą taisyklę ir atidarykite šiuos Docker potinklio TCP prievadus (172.0.0.0 / 8):
    RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
    Redis: 32785, 32786

    CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui

  3. Taip pat pridėsime taisyklę, kuri atvers PostgreSQL prievadus ir RabbitMQ valdymo skydelius išoriniam pasauliui:

    CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui

  4. Taikykite taisykles naudodami mygtuką Taikyti pakeitimus:

    CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui

CI / CD nustatymas programoje „Github Actions“.

Pereikime prie įdomiausios dalies – nenutrūkstamo integravimo vamzdyno nustatymo ir projekto pristatymo į serverį.

Šį dujotiekį sudarys dvi dalys:

  • atvaizdo kūrimas ir testų vykdymas (backend) – Github pusėje;
  • perkėlimų vykdymas (užpakalinei programai) ir konteinerių diegimas serveryje.

Dislokuoti į Pleską

Pirmiausia išnagrinėkime antrąjį punktą (nes nuo jo priklauso pirmasis).

Diegimo procesą sukonfigūruosime naudodami „Plesk“ skirtą „Git“ plėtinį.

Apsvarstykite pavyzdį su „Backend“ saugyklos „Prod“ aplinka.

  1. Einame į mūsų Helloworld svetainės prenumeratą ir einame į Git poskyrį:

    CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui

  2. Į lauką „Nuotolinė Git saugykla“ įterpkite nuorodą į mūsų „Github“ saugyklą ir pakeiskite numatytąjį aplanką httpdocs kitam (pvz. /httpdocs/hw_back):

    CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui

  3. Nukopijuokite viešąjį SSH raktą iš ankstesnio veiksmo ir pridėti jis yra „Github“ nustatymuose.
  4. 2 veiksme ekrane paspaudžiame OK, po kurio pereiname į saugyklos puslapį Plesk. Dabar turime sukonfigūruoti saugyklą, kad ji būtų atnaujinta pagal įsipareigojimus pagrindinei šakai. Norėdami tai padaryti, eikite į Saugyklos nustatymai ir išsaugoti vertę Webhook URL (to prireiks vėliau, kai nustatome „Github Actions“):

    CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui

  5. Ekrano lauke Veiksmai iš ankstesnės pastraipos įveskite scenarijų, kad paleistumėte diegimą:
    cd {REPOSITORY_ABSOLUTE_PATH}
    .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID} 

    , jeigu:

    {REPOSITORY_ABSOLUTE_PATH} - kelias į serveryje esančios backend saugyklos prod aplanką;
    {ENV} - aplinka (dev / prod), mūsų atveju prod;
    {DOCKER_REGISTRY_HOST} - mūsų dokerių saugyklos šeimininkas
    {TG_BOT_TOKEN} — Telegram boto žetonas;
    {TG_CHAT_ID} - pokalbio / kanalo, skirto pranešimų siuntimui, ID.

    Scenarijaus pavyzdys:

    cd /var/www/vhosts/helloworld.ru/httpdocs/hw_back/
    .ci-cd/deploy.sh dev docker.helloworld.ru docker_user docker_password 12345678:AAbcdEfghCH1vGbCasdfSAs0K5PALDsaw -1001234567890
  6. Pridėkite naudotoją iš mūsų prenumeratos į Docker grupę (kad jis galėtų tvarkyti konteinerius):
    sudo usermod -aG docker helloworld_admin

Užpakalinės saugyklos ir sąsajos kūrėjų aplinka yra nustatyta taip pat.

Diegimo dujotiekis „Github Actions“.

Pereikime prie pirmosios CI / CD dujotiekio dalies nustatymo „Github Actions“.

Vidinis

Dujotiekis aprašytas deploy.yml failą.

Tačiau prieš analizuodami užpildykime slaptus kintamuosius, kurių mums reikia „Github“. Norėdami tai padaryti, eikite į Nustatymai -> Paslaptys:

  • DOCKER_REGISTRY - mūsų Docker saugyklos (docker.helloworld.ru) priegloba;
  • DOCKER_LOGIN - prisijungti prie Docker saugyklos;
  • DOCKER_PASSWORD - slaptažodis;
  • DEPLOY_HOST — priegloba, kurioje yra „Plesk“ administratoriaus skydelis (pavyzdys: helloworld.com: 8443 arba 123.4.56.78:8443);
  • DEPLOY_BACK_PROD_TOKEN - prieigos raktas, skirtas įdiegti į prod-saugyklą serveryje (jį gavome Deployment in Plesk p. 4);
  • DEPLOY_BACK_DEV_TOKEN - prieigos raktas, skirtas diegti serverio kūrėjo saugykloje.

Diegimo procesas yra paprastas ir susideda iš trijų pagrindinių etapų:

  • atvaizdo kūrimas ir publikavimas mūsų saugykloje;
  • bandymų vykdymas konteineryje pagal naujai sukurtą vaizdą;
  • diegimas į norimą aplinką, priklausomai nuo šakos (dev/master).

Frontend

Priekinės saugyklos failas deploy.yml šiek tiek skiriasi nuo Becko. Trūksta žingsnio su bandymų vykdymu ir pakeičiami diegimo prieigos raktų pavadinimai. Beje, priekinės saugyklos paslaptis reikia užpildyti atskirai.

Svetainės sąranka

Tarpinio serverio srautas per Nginx

Na, mes atėjome į pabaigą. Belieka tik sukonfigūruoti įeinančio ir išeinančio srauto perdavimą į mūsų konteinerį per Nginx. Šį procesą jau aptarėme Docker registro sąrankos 5 veiksme. Tas pats turėtų būti kartojamas su galine ir priekine dalimis kūrimo ir gamybos aplinkoje.

Pateiksiu nustatymų ekrano kopijas.

Vidinis

CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui

Frontend

CI / CD programoje „Github Actions“, skirta „Flask+Angular“ projektui
Svarbus paaiškinimas. Visi URL bus perduoti sąsajos sudėtiniam rodiniui, išskyrus tuos, kurie prasideda /api/ - jie bus prijungti prie galinio konteinerio (taigi galinėje talpykloje visi prižiūrėtojai turi pradėti nuo /api/).

rezultatai

Dabar mūsų svetainė turėtų būti pasiekiama adresu helloworld.ru ir dev.helloworld.ru (atitinkamai prod-ir dev-environments).

Iš viso išmokome paruošti paprastą programą „Flask“ ir „Angular“ ir „Github Actions“ sukurti konvejerį, kad jis būtų paleistas į serverį, kuriame veikia „Plesk“.

Pakartosiu nuorodas į saugyklas su kodu: backend, frontend.

Šaltinis: www.habr.com

Добавить комментарий