CI/CD Githubis Actions Flask+Angular projekti jaoks

CI/CD Githubis Actions Flask+Angular projekti jaoks
Selles artiklis jagan oma kogemusi CI/CD seadistamisel Pleski juhtpaneeli ja Githubi toimingute abil. Täna õpime, kuidas juurutada lihtsat projekti lihtsa nimega "Helloworld". See on kirjutatud Flask Pythoni raamistikus, selleri töötajate ja Angular 8 esiosaga.

Lingid hoidlatele: tagaprogramm, esiots.

Artikli esimeses osas vaatleme oma projekti ja selle osi. Teises selgitame välja, kuidas seadistada Plesk ja installida vajalikud laiendused ja komponendid (DB, RabbitMQ, Redis, Docker jne).

Kolmandas osas selgitame lõpuks välja, kuidas seadistada torujuhe meie projekti juurutamiseks serverisse arendus- ja tootekeskkonnas. Ja siis käivitame saidi serveris.

Ja jah, ma unustasin end tutvustada. Minu nimi on Oleg Borzov, ma olen Domclicki hüpoteegihaldurite CRM-i meeskonna täistööjõu arendaja.

Projekti ülevaade

Kõigepealt vaatame kahte projektihoidlat – tausta- ja esiosa – ning tutvume koodiga.

Taustaprogramm: kolb + seller

Tagumise osa jaoks võtsin hunniku, mis on Pythoni arendajate seas üsna populaarne: Flask raamistik (API jaoks) ja Celery (ülesannete järjekorra jaoks). SQLAchemyt kasutatakse ORM-ina. Alembicit kasutatakse rände jaoks. JSON-i valideerimiseks käepidemetes – Marshmallow.

В hoidlad seal on fail Readme.md koos üksikasjaliku struktuuri kirjelduse ja juhistega projekti käitamiseks.

Veebiosa API üsna lihtne, koosneb 6 pliiatsist:

  • /ping - saadavuse kontrollimiseks;
  • tegeleb registreerimise, autoriseerimise, volituste tühistamise ja volitatud kasutaja hankimisega;
  • meili käepide, mis paneb ülesande selleri järjekorda.

Selleri osa veelgi lihtsam, on ainult üks probleem send_mail_task.

Kaustas /conf seal on kaks alamkausta:

  • docker kahe Docker-failiga (base.dockerfile ehitada harva muutuvat aluspilti ja Dockerfile põhikoostude jaoks);
  • .env_files - erinevate keskkondade keskkonnamuutujatega failidega.

Projekti juurtes on neli dokkeri koostamise faili:

  • docker-compose.local.db.yml tõsta arendamiseks kohalikku andmebaasi;
  • docker-compose.local.workers.yml töötaja kohalikuks kasvatamiseks, andmebaas, Redis ja RabbitMQ;
  • docker-compose.test.yml testide läbiviimiseks juurutamise ajal;
  • docker-compose.yml kasutuselevõtuks.

Ja viimane kaust, mis meid huvitab - .ci-cd. See sisaldab juurutamiseks shelliskripte:

  • deploy.sh — migratsiooni ja kasutuselevõtu käivitamine. Töötab serveris pärast Github Actionsis testide loomist ja käivitamist;
  • rollback.sh - konteinerite tagasipööramine sõlme eelmisele versioonile;
  • curl_tg.sh - Telegramile juurutusteatiste saatmine.

Esiosa Angularil

Hoidla esiküljega palju lihtsam kui Becki oma. Esikülg koosneb kolmest lehest:

  • Pealeht e-kirja saatmise vormi ja väljumisnupuga.
  • Sisselogimisleht.
  • Registreerimisleht.

Avaleht näeb askeetlik välja:

CI/CD Githubis Actions Flask+Angular projekti jaoks
Juures on kaks faili Dockerfile и docker-compose.yml, samuti tuttav kaust .ci-cd veidi vähemate skriptidega kui tagumises hoidlas (testide käitamiseks eemaldatud skriptid).

Projekti käivitamine Pleskis

Alustame Pleski seadistamisest ja meie saidi tellimuse loomisest.

Laienduste installimine

Pleskis vajame nelja laiendust:

  • Docker konteinerite oleku haldamiseks ja visuaalseks kuvamiseks Pleski administraatoripaneelil;
  • Git juurutamise etapi konfigureerimiseks serveris;
  • Let's Encrypt tasuta TLS-sertifikaatide genereerimiseks (ja automaatseks uuendamiseks);
  • Firewall sissetuleva liikluse filtreerimise seadistamiseks.

Saate need installida jaotises Laiendused Pleski administraatoripaneeli kaudu:

CI/CD Githubis Actions Flask+Angular projekti jaoks
Me ei võta arvesse laienduste üksikasjalikke sätteid, vaikeseaded sobivad meie demo jaoks.

Looge tellimus ja sait

Järgmiseks peame looma oma veebisaidi helloworld.ru tellimuse ja lisama sinna alamdomeeni dev.helloworld.ru.

  1. Looge domeeni helloworld.ru tellimus ja määrake süsteemi kasutaja sisselogimisparool:

    CI/CD Githubis Actions Flask+Angular projekti jaoks
    Märkige lehe allosas olev ruut Kaitske domeen funktsiooniga Let's Encryptkui tahame saidi jaoks HTTPS-i seadistada:

    CI/CD Githubis Actions Flask+Angular projekti jaoks

  2. Järgmisena looge selles tellimuses alamdomeen dev.helloworld.ru (mille jaoks saate väljastada ka tasuta TLS-sertifikaadi):

    CI/CD Githubis Actions Flask+Angular projekti jaoks

Serveri komponentide installimine

Meil on server koos OS Debian Stretch 9.12 ja paigaldatud juhtpaneel Pleski obsidiaan 18.0.27.

Peame oma projekti jaoks installima ja konfigureerima:

  • PostgreSQL (meie puhul on üks server kahe andmebaasiga dev- ja prod-keskkondade jaoks).
  • RabbitMQ (sama, sama eksemplar erinevate vhostidega keskkondade jaoks).
  • Kaks Redise eksemplari (arendus- ja tootmiskeskkondade jaoks).
  • Dockeri register (ehitatud Dockeri piltide kohalikuks salvestamiseks).
  • Dockeri registri kasutajaliides.

PostgreSQL

Pleskis on juba PostgreSQL DBMS, kuid mitte uusim versioon (Plesk Obsidiani kirjutamise ajal toetatud Postgresi versioonid 8.4–10.8). Soovime oma rakenduse jaoks uusimat versiooni (selle kirjutamise ajal 12.3), seega installime selle käsitsi.

Postgresi installimiseks Debiani võrgus on palju üksikasjalikke juhiseid (näide), nii et ma ei kirjelda neid üksikasjalikult, annan lihtsalt käsud:

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

Arvestades, et PostgreSQL-i vaikeseaded on üsna kesised, on vaja konfiguratsiooni korrigeerida. See aitab meid kalkulaator: peate sisestama oma serveri parameetrid ja asendama failis olevad seaded /etc/postgresql/12/main/postgresql.confpakutavatele. Siinkohal tuleb märkida, et sellised kalkulaatorid ei ole mingi võlu ja baasi tuleks täpsemalt häälestada, lähtudes sinu riistvarast, rakendusest ja päringu keerukusest. Kuid alustamiseks sellest piisab.

Lisaks kalkulaatori pakutavatele seadistustele muudame ka sisse postgresql.confvaikeport 5432 teisele (meie näites - 53983).

Pärast konfiguratsioonifaili muutmist taaskäivitage postgresql-server käsuga:

service postgresql restart

Oleme installinud ja konfigureerinud PostgreSQL-i. Nüüd loome andmebaasi, kasutajad arendus- ja tootmiskeskkondade jaoks ning anname kasutajatele õigused andmebaasi haldamiseks:

$ 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

JänesMQ

Liigume edasi selleri sõnumivahendaja RabbitMQ installimise juurde. Selle installimine Debiani on üsna lihtne:

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

Pärast installimist peame looma vhosts, kasutajad ja anda vajalikud õigused:

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

Nüüd installime ja konfigureerime meie rakenduse viimase komponendi - Redis. Seda kasutatakse taustaprogrammina selleri ülesannete tulemuste salvestamiseks.

Tõstame laienduse abil üles kaks Dockeri konteinerit koos Redisega arendus- ja tootmiskeskkondade jaoks Docker Pleski jaoks.

  1. Läheme Pleski, läheme jaotisse Laiendused, otsime Dockeri laiendust ja installime selle (vajame tasuta versiooni):

    CI/CD Githubis Actions Flask+Angular projekti jaoks

  2. Minge installitud laiendusse, leidke pilt otsingu kaudu redis bitnami ja installige uusim versioon:

    CI/CD Githubis Actions Flask+Angular projekti jaoks

  3. Läheme allalaaditud konteinerisse ja kohandame konfiguratsiooni: määrake port, maksimaalne eraldatud RAM-i suurus, parool keskkonnamuutujates ja paigaldage helitugevus:

    CI/CD Githubis Actions Flask+Angular projekti jaoks

  4. Teostame tootemahuti jaoks etapid 2-3, seadetes muudame ainult parameetreid: port, parool, RAM-i suurus ja tee serveri helitugevuse kausta:

    CI/CD Githubis Actions Flask+Angular projekti jaoks

Dockeri register

Lisaks põhiteenustele oleks tore serverisse panna oma Dockeri pildihoidla. Õnneks on serveriruum nüüd üsna odav (kindlasti odavam kui DockerHubi tellimus) ja privaatse hoidla seadistamise protsess on väga lihtne.

Soovime omada:

Selleks:

  1. Loome oma tellimuses Pleskis kaks alamdomeeni: docker.helloworld.ru ja docker-ui.helloworld.ru ning konfigureerime nende jaoks Let's Encrypt sertifikaadid.
  2. Lisage fail alamdomeeni kausta docker.helloworld.ru docker-compose.yml sellise sisuga:
    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. SSH-s genereerime Dockeri hoidlas põhivolituse jaoks faili .htpasswd:
    htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password
  4. Koguge ja tõstke konteinerid:
    docker-compose up -d
  5. Ja me peame Nginxi oma konteineritesse ümber suunama. Seda saab teha Pleski kaudu.

Alamdomeenide docker.helloworld.ru ja docker-ui.helloworld.ru jaoks tuleb teha järgmised toimingud:

Jaotises Dev Tööriistad meie sait minge aadressile Dockeri puhverserveri reeglid:

CI/CD Githubis Actions Flask+Angular projekti jaoks
Ja lisage meie konteinerisse sissetuleva liikluse puhverserveri reegel:

CI/CD Githubis Actions Flask+Angular projekti jaoks

  1. Kontrollime, kas saame kohalikust masinast oma konteinerisse sisse logida:
    $ 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. Kontrollime ka alamdomeeni docker-ui.helloworld.ru tööd:

    CI/CD Githubis Actions Flask+Angular projekti jaoks
    Kui klõpsate käsul Sirvi hoidlaid, kuvab brauser autoriseerimisakna, kus peate sisestama hoidla kasutajanime ja parooli. Pärast seda suunatakse meid hoidlate loendiga lehele (praegu on see teie jaoks tühi):

    CI/CD Githubis Actions Flask+Angular projekti jaoks

Portide avamine Pleski tulemüüris

Pärast komponentide installimist ja konfigureerimist peame avama pordid, et komponentidele oleks juurdepääs Dockeri konteineritest ja välisvõrgust.

Vaatame, kuidas seda teha, kasutades Pleski tulemüüri laiendust, mille me varem installisime.

  1. Minema Tööriistad ja sätted > Seaded > Tulemüür:
    CI/CD Githubis Actions Flask+Angular projekti jaoks
  2. Minema Muuda Pleski tulemüüri reegleid > Lisa kohandatud reegel ja avage Dockeri alamvõrgu jaoks järgmised TCP-pordid (172.0.0.0 / 8):
    RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
    Redis: 32785, 32786

    CI/CD Githubis Actions Flask+Angular projekti jaoks

  3. Lisame ka reegli, mis avab PostgreSQL-i pordid ja RabbitMQ halduspaneelid välismaailmale:

    CI/CD Githubis Actions Flask+Angular projekti jaoks

  4. Rakendage reeglid nupu Rakenda muudatused abil:

    CI/CD Githubis Actions Flask+Angular projekti jaoks

CI/CD seadistamine Githubi toimingutes

Asume kõige huvitavama osa juurde – pideva integratsioonikonveieri seadistamine ja projekti serverisse toimetamine.

See torujuhe koosneb kahest osast:

  • pildi loomine ja testide käivitamine (taustaprogrammi jaoks) - Githubi poolel;
  • migratsioonide käitamine (taustaprogrammi jaoks) ja konteinerite juurutamine - serveris.

Kasutusele Pleskis

Tegeleme esmalt teise punktiga (sest esimene sõltub sellest).

Konfigureerime juurutusprotsessi Pleski Giti laienduse abil.

Vaatleme näidet taustahoidla Prod-keskkonnast.

  1. Avame oma Helloworldi veebisaidi tellimuse ja avame Giti alamjaotise:

    CI/CD Githubis Actions Flask+Angular projekti jaoks

  2. Sisestage link meie Githubi hoidlale väljale "Remote Git repository" ja muutke vaikekausta httpdocs teisele (nt. /httpdocs/hw_back):

    CI/CD Githubis Actions Flask+Angular projekti jaoks

  3. Kopeerige SSH avalik võti eelmisest sammust ja lisa see on Githubi seadetes.
  4. Klõpsake sammus 2 ekraanil OK, misjärel suunatakse meid Pleski hoidla lehele. Nüüd peame konfigureerima hoidla nii, et seda värskendataks põhiharule tehtavate kohustuste osas. Selleks minge aadressile Hoidla sätted ja salvestage väärtus Webhook URL (vajame seda hiljem Githubi toimingute seadistamisel):

    CI/CD Githubis Actions Flask+Angular projekti jaoks

  5. Sisestage eelmise lõigu ekraanil väljale Toimingud juurutamise käivitamiseks skript:
    cd {REPOSITORY_ABSOLUTE_PATH}
    .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID} 

    kus:

    {REPOSITORY_ABSOLUTE_PATH} - serveris asuva taustahoidla prod-kausta tee;
    {ENV} - keskkond (dev / prod), meie puhul prod;
    {DOCKER_REGISTRY_HOST} - meie dokkide hoidla host
    {TG_BOT_TOKEN} — Telegrami roboti tunnus;
    {TG_CHAT_ID} — teadete saatmise vestluse/kanali ID.

    Skripti näide:

    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. Lisage kasutaja meie tellimusest Dockeri rühma (et ta saaks konteinereid hallata):
    sudo usermod -aG docker helloworld_admin

Taustaprogrammi hoidla ja kasutajaliidese arenduskeskkond seadistatakse samal viisil.

Githubi toimingute juurutamise torujuhe

Liigume edasi meie CI/CD torujuhtme esimese osa seadistamise juurde Github Actionsis.

Taustaprogramm

Torujuhet on kirjeldatud artiklis deploy.yml faili.

Kuid enne selle sõelumist täitkem Githubis vajalikud salamuutujad. Selleks minge aadressile Seaded -> Saladused:

  • DOCKER_REGISTRY - meie Dockeri hoidla host (docker.helloworld.ru);
  • DOCKER_LOGIN - logige sisse Dockeri hoidlasse;
  • DOCKER_PASSWORD - selle parool;
  • DEPLOY_HOST — host, kus on saadaval Pleski administraatoripaneel (näide: helloworld.com: 8443 või 123.4.56.78:8443);
  • DEPLOY_BACK_PROD_TOKEN - token serveri prod-hoidlasse juurutamiseks (selle saime Pleski juurutamine lk 4);
  • DEPLOY_BACK_DEV_TOKEN - luba serveri arendajahoidlasse juurutamiseks.

Juurutusprotsess on lihtne ja koosneb kolmest põhietapist:

  • pildi koostamine ja avaldamine meie hoidlas;
  • testide käivitamine konteineris värskelt ehitatud pildi põhjal;
  • juurutamine soovitud keskkonda olenevalt harust (dev/master).

Frontend

Fail deploy.yml eesmise hoidla jaoks veidi erinev Becki omast. Sellel puudub testide käitamise etapp ja see muudab juurutamiseks mõeldud žetoonide nimesid. Muide, esihoidla saladused tuleb eraldi täita.

Saidi seadistamine

Liikluse puhverserver läbi Nginxi

Noh, me oleme jõudnud lõppu. Jääb vaid konfigureerida sissetuleva ja väljamineva liikluse puhverserver meie konteinerisse Nginxi kaudu. Oleme seda protsessi juba käsitlenud Dockeri registri häälestuse 5. sammus. Sama tuleks korrata tagumise ja esiosa puhul arendus- ja tootekeskkondades.

Annan seadetest ekraanipildid.

Taustaprogramm

CI/CD Githubis Actions Flask+Angular projekti jaoks

Frontend

CI/CD Githubis Actions Flask+Angular projekti jaoks
Oluline selgitus. Kõik URL-id, välja arvatud need, mis algavad tähisega, suunatakse puhverserverile esiserva konteinerile /api/ - need ühendatakse tagumise konteineriga (nii tagumises konteineris peavad kõik käitlejad alustama sellest /api/).

Tulemused

Nüüd peaks meie sait olema saadaval aadressil helloworld.ru ja dev.helloworld.ru (vastavalt prod- ja dev-keskkonnad).

Kokku õppisime Flaskis ja Angularis lihtsat rakendust ette valmistama ning Github Actionsis konveieri seadistama, et see Pleski töötavasse serverisse levitada.

Kopeerin hoidlate lingid koodiga: tagaprogramm, esiots.

Allikas: www.habr.com

Lisa kommentaar