CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular

CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular
Katika makala hii, nitashiriki uzoefu wangu wa kusanidi CI/CD kwa kutumia paneli ya kudhibiti Plesk na Vitendo vya Github. Leo tutajifunza jinsi ya kupeleka mradi rahisi kwa jina rahisi "Helloworld". Imeandikwa katika Flask ya mfumo wa Python, na wafanyikazi huko Celery na sehemu ya mbele katika Angular 8.

Viungo kwa hazina: nyuma, mbele.

Katika sehemu ya kwanza ya makala tutaangalia mradi wetu na sehemu zake. Katika pili, tutajua jinsi ya kusanidi Plesk na kufunga upanuzi muhimu na vipengele (DB, RabbitMQ, Redis, Docker, nk).

Katika sehemu ya tatu, hatimaye tutajua jinsi ya kusanidi bomba la kupeleka mradi wetu kwa seva katika mazingira ya uboreshaji na uzalishaji. Na kisha tutazindua tovuti kwenye seva.

Na ndio, nilisahau kujitambulisha. Jina langu ni Oleg Borzov, mimi ni msanidi programu kamili katika timu ya CRM kwa wasimamizi wa mikopo ya nyumba huko Domklik.

Muhtasari wa mradi

Kwanza, hebu tuangalie hazina mbili za mradi - backend na mbele - na kupitia kanuni.

Sehemu ya nyuma: Flask+Celery

Kwa mwisho, nilichukua mchanganyiko ambao ni maarufu sana kati ya watengenezaji wa Python: Mfumo wa Flask (kwa API) na Celery (kwa foleni ya kazi). SQLAchemy inatumika kama ORM. Alembic hutumiwa kwa uhamiaji. Kwa uthibitisho wa JSON katika vipini - Marshmallow.

Π’ hazina Kuna faili ya Readme.md yenye maelezo ya kina ya muundo na maagizo ya kuanzisha mradi.

API ya Sehemu ya Wavuti rahisi sana, lina vipini 6:

  • /ping - kuangalia upatikanaji;
  • hushughulikia usajili, uidhinishaji, uondoaji idhini na kupata mtumiaji aliyeidhinishwa;
  • mpini wa kutuma barua pepe ambayo huweka kazi kwenye foleni ya Selari.

Sehemu ya celery Ni rahisi zaidi, kuna shida moja tu send_mail_task.

Katika folda /conf kuna folda ndogo mbili:

  • docker na Dockerfiles mbili (base.dockerfile kujenga picha ya msingi ambayo mara chache hubadilika na Dockerfile kwa makusanyiko makuu);
  • .env_files - na faili zilizo na anuwai za mazingira kwa mazingira tofauti.

Kuna faili nne za kutunga docker kwenye mzizi wa mradi:

  • docker-compose.local.db.yml kuinua hifadhidata ya ndani kwa ajili ya maendeleo;
  • docker-compose.local.workers.yml kwa uinuaji wa ndani wa mfanyakazi, hifadhidata, Redis na RabbitMQ;
  • docker-compose.test.yml kwa ajili ya kuendesha vipimo wakati wa kupelekwa;
  • docker-compose.yml kwa ajili ya kupelekwa.

Na folda ya mwisho ya kupendeza kwetu ni .ci-cd. Inayo maandishi ya ganda kwa kupelekwa:

  • deploy.sh - kuzindua uhamiaji na kupelekwa. Imezinduliwa kwenye seva baada ya kujenga na kuendesha majaribio katika Vitendo vya Github;
  • rollback.sh - vyombo vya kurudisha nyuma kwa toleo la awali la mkutano;
  • curl_tg.sh - kutuma arifa za kupelekwa kwa Telegraph.

Mbele katika Angular

Hifadhi iliyo na mbele rahisi zaidi kuliko ya Bekov. Sehemu ya mbele ina kurasa tatu:

  • Ukurasa kuu ulio na fomu ya kutuma barua pepe na kitufe cha kutoka.
  • Ukurasa wa kuingia.
  • Ukurasa wa usajili.

Ukurasa kuu unaonekana kuwa mzuri:

CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular
Kuna faili mbili kwenye mizizi Dockerfile ΠΈ docker-compose.yml, pamoja na folda inayojulikana .ci-cd na idadi ndogo kidogo ya hati kuliko kwenye hazina ya nyuma (hati za kufanya majaribio zimeondolewa).

Kuanzisha mradi katika Plesk

Wacha tuanze kwa kusanidi Plesk na kuunda usajili kwa tovuti yetu.

Inasakinisha viendelezi

Katika Plesk tunahitaji viendelezi vinne:

  • Docker kudhibiti na kuonyesha hali ya vyombo kwenye paneli ya msimamizi wa Plesk;
  • Git kusanidi hatua ya kupeleka kwenye seva;
  • Let's Encrypt kwa ajili ya kuzalisha (na kusasisha kiotomatiki) vyeti vya bure vya TLS;
  • Firewall kusanidi uchujaji wa trafiki inayoingia.

Unaweza kuzisakinisha kupitia paneli ya msimamizi wa Plesk katika sehemu ya Viendelezi:

CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular
Hatutazingatia usanidi wa kina wa viendelezi; kwa madhumuni yetu ya onyesho, mipangilio chaguomsingi itafaa.

Kuunda usajili na tovuti

Ifuatayo, tunahitaji kuunda usajili kwa tovuti yetu helloworld.ru na kuongeza subdomain dev.helloworld.ru huko.

  1. Tunaunda usajili kwa kikoa cha helloworld.ru na kutaja nenosiri la kuingia kwa mtumiaji wa mfumo:

    CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular
    Angalia kisanduku chini ya ukurasa Linda kikoa kwa kutumia Let's Encrypt, ikiwa tunataka kusanidi HTTPS kwa tovuti:

    CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular

  2. Ifuatayo, katika usajili huu, tunaunda kikoa kidogo dev.helloworld.ru (ambacho unaweza pia kutoa cheti cha bure cha TLS):

    CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular

Inasakinisha vipengele vya seva

Tuna seva na Unyooshaji wa OS Debian 9.12 na imewekwa jopo la kudhibiti Plesk Obsidian 18.0.27.

Tunahitaji kusakinisha na kusanidi kwa mradi wetu:

  • PostgreSQL (kwa upande wetu, kutakuwa na seva moja iliyo na hifadhidata mbili za mazingira ya dev na prod).
  • RabbitMQ (sawa, mfano sawa na vhosts tofauti kwa mazingira).
  • Matukio mawili ya Redis (kwa mazingira ya dev na prod).
  • Usajili wa Docker (kwa uhifadhi wa ndani wa picha za Docker zilizokusanywa).
  • Kiolesura cha UI cha Usajili wa Docker.

PostgreSQL

Plesk tayari inakuja na PostgreSQL DBMS, lakini sio toleo la hivi karibuni (wakati wa kuandika Plesk Obsidian kuungwa mkono Matoleo ya Postgres 8.4–10.8). Tunataka toleo jipya zaidi la programu yetu (12.3 wakati wa kuandika), kwa hivyo tutaisakinisha sisi wenyewe.

Kuna maagizo mengi ya kina ya kusanikisha Postgres kwenye Debian mkondoni (mfano), kwa hivyo sitazielezea kwa undani, nitatoa amri tu:

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

Kwa kuzingatia kwamba PostgreSQL ina mipangilio chaguo-msingi ya wastani, ni muhimu kurekebisha usanidi. Hii itatusaidia Calculator: unahitaji kuingiza vigezo vya seva yako na kubadilisha mipangilio kwenye faili /etc/postgresql/12/main/postgresql.confkwa waliopendekezwa. Hapa ni lazima ieleweke kwamba calculators vile si risasi uchawi, na msingi lazima tuned kwa usahihi zaidi, kwa kuzingatia vifaa yako, maombi na utata wa maswali. Lakini hii inatosha kuanza.

Mbali na mipangilio iliyopendekezwa na calculator, tunabadilisha pia postgresql.confbandari chaguo-msingi 5432 imepewa nyingine (kwa mfano wetu - 53983).

Baada ya kubadilisha faili ya usanidi, fungua upya seva ya postgresql kwa amri:

service postgresql restart

Tulisakinisha na kusanidi PostgreSQL. Sasa hebu tuunde hifadhidata, watumiaji wa mazingira ya usanifu na uzalishaji, na tuwape watumiaji haki za kudhibiti hifadhidata:

$ 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

SunguraMQ

Wacha tuendelee kusakinisha RabbitMQ, wakala wa ujumbe wa Celery. Kuisakinisha kwenye Debian ni rahisi sana:

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

Baada ya ufungaji tunahitaji kuunda wenyeji, watumiaji na kutoa haki zinazohitajika:

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 ".*" ".*" ".*"

Rejea

Sasa hebu tusakinishe na kusanidi sehemu ya mwisho ya programu yetu - Redis. Itatumika kama backend kuhifadhi matokeo ya kazi Celery.

Tutainua kontena mbili za Docker na Redis kwa mazingira ya dev na prod kwa kutumia kiendelezi Docker kwa Plesk.

  1. Nenda kwa Plesk, nenda kwa sehemu ya Viendelezi, tafuta kiendelezi cha Docker na usakinishe (tunahitaji toleo la bure):

    CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular

  2. Nenda kwenye kiendelezi kilichowekwa, pata picha kupitia utafutaji redis bitnami na usakinishe toleo jipya zaidi:

    CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular

  3. Tunaingia kwenye chombo kilichopakuliwa na kurekebisha usanidi: taja bandari, ukubwa wa juu wa RAM uliotengwa, nenosiri katika vigezo vya mazingira, na weka kiasi:

    CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular

  4. Tunafanya hatua 2-3 kwa chombo cha prod, katika mipangilio tunabadilisha tu vigezo: bandari, nenosiri, ukubwa wa RAM na njia ya folda ya kiasi kwenye seva:

    CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular

Usajili wa Docker

Mbali na huduma za kimsingi, itakuwa nzuri kusakinisha hazina yako ya picha ya Docker kwenye seva. Kwa bahati nzuri, nafasi kwenye seva sasa ni nafuu kabisa (kwa hakika ni nafuu zaidi kuliko usajili kwa DockerHub), na mchakato wa kufunga hifadhi ya kibinafsi ni rahisi sana.

Tunataka kuwa na:

Kwa hili:

  1. Wacha tuunde vikoa vidogo viwili katika usajili wetu katika Plesk: docker.helloworld.ru na docker-ui.helloworld.ru, na tusanidi cheti cha Let's Encrypt kwa ajili yao.
  2. Ongeza faili kwenye folda ya kikoa cha docker.helloworld.ru docker-compose.yml na maudhui haya:
    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. Chini ya SSH, tutaunda faili ya .htpasswd kwa uidhinishaji wa Msingi katika hazina ya Docker:
    htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password
  4. Wacha tukusanye na kuinua vyombo:
    docker-compose up -d
  5. Na tunahitaji kuelekeza Nginx kwenye vyombo vyetu. Hii inaweza kufanywa kupitia Plesk.

Hatua zifuatazo zinahitajika kufanywa kwa vikoa vidogo vya docker.helloworld.ru na docker-ui.helloworld.ru:

Katika sehemu Vyombo vya vifaa tovuti yetu kwenda Sheria za Wakala wa Docker:

CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular
Na ongeza sheria ya kuwasilisha trafiki inayoingia kwenye kontena letu:

CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular

  1. Tunaangalia kuwa tunaweza kuingia kwenye kontena letu kutoka kwa mashine ya ndani:
    $ 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. Wacha tuangalie utendakazi wa docker-ui.helloworld.ru subdomain:

    CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular
    Unapobofya Vinjari hazina, kivinjari kitaonyesha dirisha la uidhinishaji ambapo utahitaji kuingiza kuingia na nenosiri kwa hifadhi. Baada ya hapo tutaelekezwa kwenye ukurasa ulio na orodha ya hazina (kwa sasa itakuwa tupu):

    CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular

Kufungua bandari katika Plesk Firewall

Baada ya kufunga na kusanidi vipengele, tunahitaji kufungua bandari ili vipengele viweze kupatikana kutoka kwa vyombo vya Docker na mtandao wa nje.

Hebu tuone jinsi ya kufanya hivyo kwa kutumia mfano wa kiendelezi cha Firewall kwa Plesk ambacho tulisakinisha hapo awali.

  1. Enda kwa Zana na Mipangilio > Mipangilio > Firewall:
    CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular
  2. Enda kwa Rekebisha Kanuni za Firewall za Plesk > Ongeza Kanuni Maalum na ufungue bandari zifuatazo za TCP kwa subnet ya Docker (172.0.0.0 / 8):
    RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
    Redis: 32785, 32786

    CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular

  3. Pia tutaongeza sheria ambayo itafungua bandari za PostgreSQL na paneli ya usimamizi ya RabbitMQ kwa ulimwengu wa nje:

    CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular

  4. Tumia sheria kwa kutumia kitufe cha Omba Mabadiliko:

    CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular

Kuanzisha CI/CD katika Vitendo vya Github

Wacha tufikie sehemu ya kupendeza zaidi - kusanidi bomba la ujumuishaji endelevu na kuwasilisha mradi wetu kwa seva.

Bomba hili litakuwa na sehemu mbili:

  • kujenga picha na vipimo vya kukimbia (kwa backend) - upande wa Github;
  • kuzindua uhamiaji (kwa nyuma) na kupeleka vyombo kwenye seva.

Sambaza kwa Plesk

Wacha tushughulike na hatua ya pili kwanza (kwani ya kwanza inategemea).

Tutasanidi mchakato wa kupeleka kwa kutumia kiendelezi cha Git cha Plesk.

Wacha tuangalie mfano na mazingira ya Prod kwa hazina ya Backend.

  1. Tunaenda kwa usajili wa tovuti yetu ya Helloworld na kwenda kwa kifungu kidogo cha Git:

    CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular

  2. Ingiza kiunga cha hazina yetu ya Github kwenye uwanja wa "Remote Git hazina" na ubadilishe folda chaguo-msingi. httpdocs kwa mwingine (kwa mfano, /httpdocs/hw_back):

    CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular

  3. Nakili kitufe cha Umma cha SSH kutoka kwa hatua ya awali na ongeza katika mipangilio ya Github.
  4. Bonyeza OK kwenye skrini katika hatua ya 2, baada ya hapo tunaelekezwa kwenye ukurasa wa hifadhi huko Plesk. Sasa tunahitaji kusanidi hazina ili kusasishwa kwenye ahadi kwa tawi kuu. Ili kufanya hivyo, nenda kwa Mipangilio ya Hifadhi na kuokoa thamani Webhook URL (tutahitaji hii baadaye wakati wa kusanidi Vitendo vya Github):

    CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular

  5. Katika sehemu ya Vitendo kwenye skrini kutoka kwa aya iliyotangulia, ingiza hati ili kuanza kupeleka:
    cd {REPOSITORY_ABSOLUTE_PATH}
    .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID} 

    ambapo:

    {REPOSITORY_ABSOLUTE_PATH} - njia ya folda ya uwekaji kumbukumbu ya nyuma kwenye seva;
    {ENV} - mazingira (dev/prod), kwa upande wetu prod;
    {DOCKER_REGISTRY_HOST} - mwenyeji wa hazina yetu ya docker
    {TG_BOT_TOKEN} - ishara ya bot ya Telegraph;
    {TG_CHAT_ID} - Kitambulisho cha gumzo/kituo cha kutuma arifa.

    Hati ya mfano:

    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. Tunaongeza mtumiaji kutoka kwa usajili wetu kwa kikundi cha Docker (ili aweze kudhibiti vyombo):
    sudo usermod -aG docker helloworld_admin

Mazingira ya Dev ya hazina ya nyuma na ya mbele yamesanidiwa kwa njia ile ile.

Bomba la Usambazaji kwa Vitendo vya Github

Wacha tuendelee kusanidi sehemu ya kwanza ya bomba letu la CI/CD katika Vitendo vya Github.

Backend

Bomba limeelezewa ndani deploy.yml faili.

Lakini kabla ya kuichanganua, wacha tujaze vijiti vya Siri tunazohitaji katika Github. Ili kufanya hivyo, nenda kwa Mipangilio -> Siri:

  • DOCKER_REGISTRY - mwenyeji wa hazina yetu ya Docker (docker.helloworld.ru);
  • DOCKER_LOGIN - ingia kwenye hazina ya Docker;
  • DOCKER_PASSWORD - nenosiri kwa ajili yake;
  • DEPLOY_HOST - mwenyeji ambaye paneli ya msimamizi wa Plesk inapatikana (mfano: helloworld.ru: 8443 au 123.4.56.78:8443);
  • DEPLOY_BACK_PROD_TOKEN - ishara ya kupelekwa kwenye hifadhi ya prod kwenye seva (tuliipokea katika Usambazaji katika Plesk, hatua ya 4);
  • DEPLOY_BACK_DEV_TOKEN - ishara kwa ajili ya kupelekwa kwenye hazina ya dev kwenye seva.

Mchakato wa kupeleka ni rahisi na una hatua tatu kuu:

  • kujenga na kuchapisha picha katika hazina yetu;
  • kufanya vipimo kwenye chombo kulingana na picha mpya iliyokusanywa;
  • kupelekwa kwa mazingira yanayotakiwa kulingana na tawi (dev/master).

frontend

Deploy.yml faili kwa hazina ya mbele sio tofauti sana na Bekov. Inakosa hatua ya kufanya majaribio na kubadilisha majina ya tokeni za kupelekwa. Siri za hazina ya mbele, kwa njia, zinahitaji kujazwa tofauti.

Mpangilio wa tovuti

Kuwakilisha trafiki kupitia Nginx

Naam, tumefika mwisho. Kilichosalia ni kusanidi utumaji wakala wa trafiki inayoingia na kutoka kwa kontena letu kupitia Nginx. Tayari tumeshughulikia mchakato huu katika hatua ya 5 ya kusanidi Usajili wa Docker. Kitu kimoja kinahitaji kurudiwa kwa sehemu za nyuma na za mbele katika mazingira ya dev na prod.

Nitatoa viwambo vya mipangilio.

Backend

CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular

frontend

CI/CD katika Vitendo vya Github kwa mradi wa Flask+Angular
Ufafanuzi muhimu. URL zote zitawekwa kama seva kwa chombo cha mbele, isipokuwa zile zinazoanza /api/ - watawekwa kwenye kontena la nyuma (kwa hivyo kwenye chombo cha nyuma, washikaji wote lazima waanze na /api/).

Matokeo ya

Sasa tovuti yetu inapaswa kupatikana kwenye helloworld.ru na dev.helloworld.ru (mazingira ya prod na dev, kwa mtiririko huo).

Kwa jumla, tulijifunza jinsi ya kuandaa programu rahisi katika Flask na Angular na kusanidi bomba katika Vitendo vya Github kwa kuisambaza kwa seva inayoendesha Plesk.

Nitatoa nakala za viungo kwenye hazina na nambari: nyuma, mbele.

Chanzo: mapenzi.com

Kuongeza maoni