CI/CD Github Actionsissa Flask+Angular-projektille

CI/CD Github Actionsissa Flask+Angular-projektille
Tässä artikkelissa jaan kokemukseni CI/CD:n määrittämisestä Plesk Control Panelin ja Github Actionsin avulla. Tänään opimme ottamaan käyttöön yksinkertaisen projektin yksinkertaisella nimellä "Helloworld". Se on kirjoitettu Flask Python -kehyksessä Celery työntekijöiden ja Angular 8 -käyttöliittymän kanssa.

Linkkejä arkistoihin: tausta, etuosa.

Artikkelin ensimmäisessä osassa tarkastellaan projektiamme ja sen osia. Toisessa selvitämme, kuinka Plesk määritetään ja tarvittavat laajennukset ja komponentit asennetaan (DB, RabbitMQ, Redis, Docker jne.).

Kolmannessa osassa selvitämme vihdoin, kuinka luodaan putki projektimme käyttöönottamiseksi palvelimelle kehitys- ja tuotantoympäristössä. Ja sitten käynnistämme sivuston palvelimella.

Ja kyllä, unohdin esitellä itseni. Nimeni on Oleg Borzov, olen täysi-kehittäjä Domclickin asuntolainajohtajien CRM-tiimissä.

Hankkeen yleiskatsaus

Tarkastellaan ensin kahta projektivarastoa - tausta- ja etuosa - ja käydään läpi koodi.

Taustaosa: Flask+Sellery

Takaosaan otin joukon, joka on melko suosittu Python-kehittäjien keskuudessa: Flask-kehyksen (API) ja Selery (tehtäväjonoa varten). SQLAchemyä käytetään ORM:na. Alembiciä käytetään muuttoihin. JSON-vahvistukseen kahvoissa - Marshmallow.

В arkistot siellä on Readme.md-tiedosto, jossa on yksityiskohtainen kuvaus projektin rakenteesta ja ohjeet projektin suorittamiseen.

Web Part API melko mutkaton, koostuu 6 kynästä:

  • /ping - tarkistaa saatavuuden;
  • käsittelee rekisteröintiä, valtuutusta, valtuutuksen poistamista ja valtuutetun käyttäjän hankkimista;
  • sähköpostikahva, joka asettaa tehtävän Selleri-jonoon.

Selleri osa vielä helpompaa, on vain yksi ongelma send_mail_task.

Kansiossa /conf on kaksi alikansiota:

  • docker kahdella Docker-tiedostolla (base.dockerfile rakentaa harvoin muuttuva peruskuva ja Dockerfile pääkokoonpanoille);
  • .env_files - tiedostoilla, joissa on ympäristömuuttujia eri ympäristöille.

Projektin ytimessä on neljä Docker-kirjoitustiedostoa:

  • docker-compose.local.db.yml kehittää paikallinen tietokanta;
  • docker-compose.local.workers.yml työntekijän paikalliseen kasvattamiseen, tietokanta, Redis ja RabbitMQ;
  • docker-compose.test.yml suorittaa testejä käyttöönoton aikana;
  • docker-compose.yml käyttöönottoa varten.

Ja viimeinen kansio, josta olemme kiinnostuneita - .ci-cd. Se sisältää shell-skriptit käyttöönottoa varten:

  • deploy.sh — Siirron ja käyttöönoton käynnistäminen. Toimii palvelimella Github Actionsin testien luomisen ja suorittamisen jälkeen;
  • rollback.sh - säiliöiden palautus kokoonpanon edelliseen versioon;
  • curl_tg.sh - käyttöönottoilmoitusten lähettäminen Telegramille.

Etuosa Angularissa

Varasto edessä paljon yksinkertaisempi kuin Beckin. Etupuoli koostuu kolmesta sivusta:

  • Pääsivu, jossa on sähköpostin lähetyslomake ja poistumispainike.
  • Sisäänkirjautumissivu.
  • Rekisteröintisivu.

Pääsivu näyttää askeettiselta:

CI/CD Github Actionsissa Flask+Angular-projektille
Jutussa on kaksi tiedostoa Dockerfile и docker-compose.yml, sekä tuttu kansio .ci-cd hieman vähemmän komentosarjoja kuin takavarastossa (poistettu komentosarjat testien suorittamista varten).

Projektin aloittaminen Pleskissä

Aloitetaan perustamalla Plesk ja luomalla tilaus sivustollemme.

Laajennusten asentaminen

Pleskissä tarvitsemme neljä laajennusta:

  • Docker hallita ja näyttää visuaalisesti säilöjen tilaa Plesk-hallintapaneelissa;
  • Git käyttöönottovaiheen määrittäminen palvelimella;
  • Let's Encrypt luoda (ja uusia) ilmaisia ​​TLS-varmenteita;
  • Firewall määrittääksesi saapuvan liikenteen suodatuksen.

Voit asentaa ne Plesk-hallintapaneelin kautta Laajennukset-osiossa:

CI/CD Github Actionsissa Flask+Angular-projektille
Emme ota huomioon laajennusten yksityiskohtaisia ​​asetuksia, oletusasetukset käyvät esittelytarkoituksiin.

Luo tilaus ja sivusto

Seuraavaksi meidän on luotava tilaus helloworld.ru-verkkosivustollemme ja lisättävä sinne dev.helloworld.ru-aliverkkotunnus.

  1. Luo tilaus helloworld.ru-verkkotunnukselle ja määritä järjestelmän käyttäjän kirjautumissalasana:

    CI/CD Github Actionsissa Flask+Angular-projektille
    Valitse sivun alareunassa oleva valintaruutu Suojaa verkkotunnus Let's Encryptilläjos haluamme määrittää HTTPS:n sivustolle:

    CI/CD Github Actionsissa Flask+Angular-projektille

  2. Luo seuraavaksi tässä tilauksessa aliverkkotunnus dev.helloworld.ru (jolle voit myös myöntää ilmaisen TLS-varmenteen):

    CI/CD Github Actionsissa Flask+Angular-projektille

Palvelinkomponenttien asentaminen

Meillä on palvelin Käyttöjärjestelmä Debian Stretch 9.12 ja asennettu ohjauspaneeli Pleskin obsidiaani 18.0.27.

Meidän on asennettava ja määritettävä projektiamme:

  • PostgreSQL (tapauksessamme on yksi palvelin, jossa on kaksi tietokantaa dev- ja prod-ympäristöille).
  • RabbitMQ (sama, sama ilmentymä eri vhostilla ympäristöille).
  • Kaksi Redis-instanssia (kehittäjä- ja tuotantoympäristöille).
  • Docker-rekisteri (rakennettujen Docker-kuvien paikalliseen tallentamiseen).
  • Docker-rekisterin käyttöliittymä.

PostgreSQL

Plesk sisältää jo PostgreSQL DBMS:n, mutta ei uusinta versiota (kirjoitushetkellä Plesk Obsidian tuettu Postgres-versiot 8.4–10.8). Haluamme sovelluksellemme uusimman version (12.3 tätä kirjoitettaessa), joten asennamme sen manuaalisesti.

Verkossa on paljon yksityiskohtaisia ​​ohjeita Postgresin asentamiseen Debianiin (esimerkki), joten en kuvaa niitä yksityiskohtaisesti, annan vain komennot:

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

Koska PostgreSQL:llä on melko keskinkertaiset oletusasetukset, on välttämätöntä säätää kokoonpanoa. Tämä auttaa meitä laskin: sinun on syötettävä palvelimesi parametrit ja vaihdettava tiedoston asetukset /etc/postgresql/12/main/postgresql.conftarjotuille. Tässä on syytä huomata, että tällaiset laskimet eivät ole taikaluoteja, ja pohja tulisi virittää tarkemmin laitteistosi, sovelluksesi ja kyselysi monimutkaisuuden perusteella. Mutta tämä riittää aloittamiseen.

Muutamme myös laskimen ehdottamien asetusten lisäksi postgresql.confoletusportti 5432 toiseen (esimerkissämme - 53983).

Kun olet vaihtanut asetustiedoston, käynnistä postgresql-server uudelleen komennolla:

service postgresql restart

Olemme asentaneet ja määrittäneet PostgreSQL:n. Luodaan nyt tietokanta, käyttäjät dev- ja prod-ympäristöihin ja annamme käyttäjille oikeudet hallita tietokantaa:

$ 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

RabbitMQ

Jatketaan RabbitMQ:n, Seleryn viestivälittäjän, asentamiseen. Sen asentaminen Debianiin on melko yksinkertaista:

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

Asennuksen jälkeen meidän on luotava vhosts, käyttäjiä ja myönnä tarvittavat oikeudet:

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

Asennamme ja määritetään nyt sovelluksemme viimeinen komponentti - Redis. Sitä käytetään taustaohjelmana selleritehtävien tulosten tallentamiseen.

Nostamme kaksi Docker-konttia Rediksen kanssa kehitys- ja tuotantoympäristöihin laajennuksen avulla Docker Pleskille.

  1. Menemme Pleskiin, siirrymme Laajennukset-osioon, etsimme Docker-laajennuksen ja asennamme sen (tarvitsemme ilmaisen version):

    CI/CD Github Actionsissa Flask+Angular-projektille

  2. Siirry asennettuun laajennukseen, etsi kuva haun kautta redis bitnami ja asenna uusin versio:

    CI/CD Github Actionsissa Flask+Angular-projektille

  3. Siirrymme ladattuihin säilöön ja säädämme kokoonpanoa: määritä portti, suurin varattu RAM-koko, salasana ympäristömuuttujissa ja asenna asema:

    CI/CD Github Actionsissa Flask+Angular-projektille

  4. Suoritamme vaiheet 2-3 prod-säiliölle, asetuksissa muutamme vain parametreja: portti, salasana, RAM-muistin koko ja polku palvelimen taltiokansioon:

    CI/CD Github Actionsissa Flask+Angular-projektille

Docker-rekisteri

Peruspalvelujen lisäksi olisi kiva laittaa oma Docker-kuvavarasto palvelimelle. Onneksi palvelintila on nyt melko halpaa (varmasti halvempaa kuin DockerHub-tilaus), ja yksityisen tietovaraston perustaminen on hyvin yksinkertaista.

Haluamme saada:

Voit tehdä tämän seuraavasti:

  1. Luodaan kaksi aliverkkotunnusta Pleskiin tilauksessamme: docker.helloworld.ru ja docker-ui.helloworld.ru ja määritetään Let's Encrypt -varmenteet niille.
  2. Lisää tiedosto docker.helloworld.ru-aliverkkotunnuskansioon docker-compose.yml tällaisella sisällöllä:
    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:ssa luomme .htpasswd-tiedoston perusvaltuutusta varten Docker-tietovarastoon:
    htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password
  4. Kerää ja nosta kontit:
    docker-compose up -d
  5. Ja meidän on ohjattava Nginx konttiihimme. Tämä voidaan tehdä Pleskin kautta.

Seuraavat vaiheet on suoritettava docker.helloworld.ru- ja docker-ui.helloworld.ru-aliverkkotunnuksille:

Luokasta Kehitystyökalut sivumme mene osoitteeseen Dockerin välityspalvelimen säännöt:

CI/CD Github Actionsissa Flask+Angular-projektille
Ja lisää sääntö saapuvan liikenteen välityspalvelimelle säilöimme:

CI/CD Github Actionsissa Flask+Angular-projektille

  1. Tarkistamme, että voimme kirjautua konttiimme paikalliselta koneelta:
    $ 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. Tarkastetaan myös docker-ui.helloworld.ru-aliverkkotunnuksen toiminta:

    CI/CD Github Actionsissa Flask+Angular-projektille
    Kun napsautat Selaa tietovarastoja, selain näyttää valtuutusikkunan, jossa sinun on syötettävä arkiston käyttäjätunnus ja salasana. Sen jälkeen meidät siirretään sivulle, jossa on luettelo arkistoista (toistaiseksi se on sinulle tyhjä):

    CI/CD Github Actionsissa Flask+Angular-projektille

Porttien avaaminen Plesk Firewallissa

Kun komponentit on asennettu ja määritetty, meidän on avattava portit, jotta komponentit ovat käytettävissä Docker-säiliöistä ja ulkoisesta verkosta.

Katsotaanpa, kuinka tämä tehdään käyttämällä aiemmin asentamaamme Pleskin palomuurilaajennusta.

  1. Mene Työkalut ja asetukset > Asetukset > Palomuuri:
    CI/CD Github Actionsissa Flask+Angular-projektille
  2. Mene Muokkaa Plesk-palomuurisääntöjä > Lisää mukautettu sääntö ja avaa seuraavat Docker-aliverkon TCP-portit (172.0.0.0 / 8):
    RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
    Redis: 32785, 32786

    CI/CD Github Actionsissa Flask+Angular-projektille

  3. Lisäämme myös säännön, joka avaa PostgreSQL-portit ja RabbitMQ-hallintapaneelit ulkomaailmalle:

    CI/CD Github Actionsissa Flask+Angular-projektille

  4. Ota sääntöjä käyttöön Käytä muutokset -painikkeella:

    CI/CD Github Actionsissa Flask+Angular-projektille

CI/CD:n määrittäminen Github Actionsissa

Siirrytään mielenkiintoisimpaan osaan - jatkuvan integraatioputken perustamiseen ja projektimme toimittamiseen palvelimelle.

Tämä putki koostuu kahdesta osasta:

  • kuvan luominen ja testien suorittaminen (taustajärjestelmälle) - Githubin puolella;
  • siirtojen suorittaminen (taustajärjestelmälle) ja säiliöiden käyttöönotto - palvelimella.

Ota käyttöön Pleskiin

Käsitellään ensin toista kohtaa (koska ensimmäinen riippuu siitä).

Määritämme käyttöönottoprosessin Pleskin Git-laajennuksella.

Harkitse esimerkkiä taustatietovaraston Prod-ympäristöstä.

  1. Siirrymme Helloworld-verkkosivustomme tilaukseen ja siirrymme Git-alaosioon:

    CI/CD Github Actionsissa Flask+Angular-projektille

  2. Lisää linkki Github-tietovarastoon "Remote Git repository" -kenttään ja vaihda oletuskansio httpdocs toiselle (esim. /httpdocs/hw_back):

    CI/CD Github Actionsissa Flask+Angular-projektille

  3. Kopioi julkinen SSH-avain edellisestä vaiheesta ja lisäämällä se on Githubin asetuksissa.
  4. Napsauta OK näytöllä vaiheessa 2, minkä jälkeen meidät ohjataan Pleskin arkistosivulle. Nyt meidän on määritettävä arkisto päivitettäväksi päähaaratoimituksissa. Voit tehdä tämän siirtymällä osoitteeseen Arkiston asetukset ja tallenna arvo Webhook URL (Tarvitsemme sitä myöhemmin, kun määrität Github Actionsin):

    CI/CD Github Actionsissa Flask+Angular-projektille

  5. Kirjoita edellisen kappaleen näytön Toiminnot-kenttään komentosarja käynnistääksesi käyttöönoton:
    cd {REPOSITORY_ABSOLUTE_PATH}
    .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID} 

    jos:

    {REPOSITORY_ABSOLUTE_PATH} - polku palvelimen taustatietovaraston prod-kansioon;
    {ENV} - ympäristö (dev / prod), meidän tapauksessamme prod;
    {DOCKER_REGISTRY_HOST} - telakointivarastomme isäntä
    {TG_BOT_TOKEN} — Telegram-bot-tunnus;
    {TG_CHAT_ID} — Chatin/kanavan tunnus ilmoitusten lähettämistä varten.

    Esimerkki skriptistä:

    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. Lisää käyttäjä tilauksestamme Docker-ryhmään (jotta hän voi hallita säilöjä):
    sudo usermod -aG docker helloworld_admin

Taustavaraston ja käyttöliittymän kehittäjäympäristö määritetään samalla tavalla.

Käyttöönottoputki Github Actionsissa

Siirrytään CI/CD-putken ensimmäisen osan määrittämiseen Github Actionsissa.

taustaosa

Putkilinja on kuvattu kohdassa deploy.yml-tiedosto.

Mutta ennen sen jäsentämistä, täytämme salaiset muuttujat, joita tarvitsemme Githubissa. Voit tehdä tämän siirtymällä osoitteeseen Asetukset -> Salaisuudet:

  • DOCKER_REGISTRY - Docker-arkistomme isäntä (docker.helloworld.ru);
  • DOCKER_LOGIN - kirjaudu sisään Docker-arkistoon;
  • DOCKER_PASSWORD - salasana siihen;
  • DEPLOY_HOST - isäntä, jossa Plesk-hallintapaneeli on käytettävissä (esimerkki: helloworld.com: 8443 tai 123.4.56.78:8443);
  • DEPLOY_BACK_PROD_TOKEN - Token käyttöönottoa varten palvelimella olevaan prod-varastoon (saimme sen Pleskin käyttöönotossa s. 4);
  • DEPLOY_BACK_DEV_TOKEN - tunnus palvelimen kehittäjävarastoon käyttöön ottamista varten.

Käyttöönottoprosessi on yksinkertainen ja koostuu kolmesta päävaiheesta:

  • kuvan rakentaminen ja julkaiseminen arkistossamme;
  • testien suorittaminen säilössä, joka perustuu juuri rakennettuun kuvaan;
  • käyttöönotto haluttuun ympäristöön haarasta riippuen (dev/master).

Frontend

Etuvaraston deploy.yml-tiedosto hieman erilainen kuin Beckin. Siitä puuttuu vaihe testien suorittamiseksi ja se muuttaa käyttöönoton tokenien nimet. Etuvaraston salaisuudet on muuten täytettävä erikseen.

Sivuston määritys

Välityspalvelinliikenne Nginxin kautta

No, olemme tulleet loppuun. On vain määritettävä saapuvan ja lähtevän liikenteen välityspalvelin konttiin Nginxin kautta. Olemme jo käsitelleet tämän prosessin Dockerin rekisterin asennuksen vaiheessa 5. Sama tulee toistaa taka- ja etuosille kehitys- ja tuoteympäristöissä.

Annan kuvakaappauksia asetuksista.

taustaosa

CI/CD Github Actionsissa Flask+Angular-projektille

Frontend

CI/CD Github Actionsissa Flask+Angular-projektille
Tärkeä selvennys. Kaikki URL-osoitteet välitetään käyttöliittymäsäilölle, paitsi ne, jotka alkavat /api/ - ne välitetään takakonttiin (niin takasäiliössä kaikkien käsittelijöiden on aloitettava /api/).

Tulokset

Nyt sivustomme pitäisi olla saatavilla osoitteessa helloworld.ru ja dev.helloworld.ru (tuote- ja dev-ympäristöt, vastaavasti).

Kaiken kaikkiaan opimme valmistelemaan yksinkertaisen sovelluksen Flaskissa ja Angularissa ja määrittämään Github Actionsissa putkilinjan, jolla se julkaistaan ​​Plesk-palvelimelle.

Kopioin linkit arkistoihin koodilla: tausta, etuosa.

Lähde: will.com

Lisää kommentti