CI/CD yn Github Actions ar gyfer prosiect Fflasg+Angular
Yn yr erthygl hon, byddaf yn rhannu fy mhrofiad o sefydlu CI / CD gan ddefnyddio Panel Rheoli Plesk a Github Actions. Heddiw, byddwn yn dysgu sut i ddefnyddio prosiect syml gyda'r enw syml "Helloworld". Mae wedi'i ysgrifennu yn fframwaith Fflasg Python, gyda gweithwyr Seleri a blaen Angular 8.
Yn rhan gyntaf yr erthygl, byddwn yn edrych ar ein prosiect a'i rannau. Yn yr ail, byddwn yn darganfod sut i sefydlu Plesk a gosod yr estyniadau a'r cydrannau angenrheidiol (DB, RabbitMQ, Redis, Docker, ac ati).
Yn y drydedd ran, byddwn o'r diwedd yn darganfod sut i sefydlu piblinell ar gyfer defnyddio ein prosiect i weinydd mewn amgylchedd dev a prod. Ac yna byddwn yn lansio'r wefan ar y gweinydd.
Ac ie, anghofiais gyflwyno fy hun. Fy enw i yw Oleg Borzov, rwy'n ddatblygwr pentwr llawn yn y tîm CRM ar gyfer rheolwyr morgeisi yn Domclick.
Trosolwg o'r prosiect
Yn gyntaf, gadewch i ni edrych ar ddau ystorfa prosiect - backend a blaen - a mynd dros y cod.
Cefn: Fflasg+seleri
Ar gyfer y rhan gefn, cymerais griw sy'n eithaf poblogaidd ymhlith datblygwyr Python: y fframwaith Fflasg (ar gyfer yr API) a Seleri (ar gyfer y ciw tasg). Defnyddir SQLAchemy fel ORM. Defnyddir alembig ar gyfer mudo. Ar gyfer dilysu JSON mewn dolenni - Marshmallow.
В storfeydd mae ffeil Readme.md gyda disgrifiad manwl o'r strwythur a chyfarwyddiadau ar gyfer rhedeg y prosiect.
docker gyda dwy Dockerfile (base.dockerfile i adeiladu delwedd sylfaen sy'n newid yn anaml a Dockerfile ar gyfer prif gynulliadau);
.env_files - gyda ffeiliau gyda newidynnau amgylchedd ar gyfer gwahanol amgylcheddau.
Mae pedair ffeil cyfansoddi docwr wrth wraidd y prosiect:
docker-compose.local.db.yml codi cronfa ddata leol i'w datblygu;
docker-compose.local.workers.yml ar gyfer codi'r gweithiwr yn lleol, cronfa ddata, Redis a RabbitMQ;
docker-compose.test.yml cynnal profion yn ystod y defnydd;
docker-compose.yml ar gyfer lleoli.
A'r ffolder olaf y mae gennym ddiddordeb ynddo - .ci-cd. Mae'n cynnwys sgriptiau cregyn i'w defnyddio:
deploy.sh — lansio mudo a lleoli. Yn rhedeg ar y gweinydd ar ôl adeiladu a rhedeg profion yn Github Actions;
rollback.sh - dychwelyd cynwysyddion i fersiwn flaenorol y gwasanaeth;
curl_tg.sh - anfon hysbysiadau lleoli i Telegram.
Frontend ar Angular
Ystorfa gyda blaen llawer symlach na Beck. Mae'r blaen yn cynnwys tair tudalen:
Prif dudalen gyda ffurflen ar gyfer anfon e-bost a botwm ymadael.
Tudalen mewngofnodi.
Tudalen gofrestru.
Mae'r brif dudalen yn edrych yn ascetic:
Mae dwy ffeil wrth y gwraidd Dockerfile и docker-compose.yml, yn ogystal â'r ffolder cyfarwydd .ci-cd gydag ychydig yn llai o sgriptiau nag yn y storfa gefn (sgriptiau wedi'u tynnu ar gyfer cynnal profion).
Dechrau prosiect yn Plesk
Gadewch i ni ddechrau trwy sefydlu Plesk a chreu tanysgrifiad ar gyfer ein gwefan.
Gosod estyniadau
Yn Plesk, mae angen pedwar estyniad arnom:
Docker rheoli ac arddangos statws cynwysyddion yn weledol ym mhanel gweinyddol Plesk;
Git i ffurfweddu'r cam lleoli ar y gweinydd;
Let's Encrypt cynhyrchu (ac adnewyddu'n awtomatig) tystysgrifau TLS am ddim;
Firewall i ffurfweddu hidlo traffig sy'n dod i mewn.
Gallwch eu gosod trwy banel gweinyddol Plesk yn yr adran Estyniadau:
Ni fyddwn yn ystyried y gosodiadau manwl ar gyfer estyniadau, bydd y gosodiadau diofyn yn eu gwneud at ein dibenion demo.
Creu tanysgrifiad a gwefan
Nesaf, mae angen i ni greu tanysgrifiad ar gyfer ein gwefan helloworld.ru ac ychwanegu'r is-barth dev.helloworld.ru yno.
Creu tanysgrifiad ar gyfer y parth helloworld.ru a nodi'r cyfrinair mewngofnodi ar gyfer defnyddiwr y system:
Ticiwch y blwch ar waelod y dudalen Sicrhewch y parth gyda Let's Encryptos ydym am sefydlu HTTPS ar gyfer y wefan:
Nesaf, yn y tanysgrifiad hwn, crëwch subdomain dev.helloworld.ru (y gallwch chi hefyd roi tystysgrif TLS am ddim ar ei gyfer):
Gosod Cydrannau Gweinydd
Mae gennym weinydd gyda OS Debian Stretch 9.12 a gosod panel rheoli Plesk Obsidian 18.0.27.
Mae angen i ni osod a ffurfweddu ar gyfer ein prosiect:
PostgreSQL (yn ein hachos ni, bydd un gweinydd gyda dwy gronfa ddata ar gyfer amgylcheddau dev a prod).
RabbitMQ (yr un, yr un enghraifft gyda gwahanol vhosts ar gyfer amgylcheddau).
Dau achos Redis (ar gyfer amgylcheddau dev a prod).
Cofrestrfa Docwyr (ar gyfer storio delweddau Docker adeiledig yn lleol).
UI ar gyfer cofrestrfa Docker.
PostgreSQL
Mae Plesk eisoes yn dod gyda PostgreSQL DBMS, ond nid y fersiwn ddiweddaraf (ar adeg ysgrifennu Plesk Obsidian cefnogi Fersiynau Postgres 8.4–10.8). Rydyn ni eisiau'r fersiwn ddiweddaraf ar gyfer ein cais (12.3 ar adeg ysgrifennu hwn), felly byddwn yn ei osod â llaw.
Mae yna lawer o gyfarwyddiadau manwl ar gyfer gosod Postgres ar Debian ar y we (enghraifft), felly ni fyddaf yn eu disgrifio'n fanwl, byddaf yn rhoi'r gorchmynion:
O ystyried bod gan PostgreSQL osodiadau diofyn eithaf cymedrol, mae angen cywiro'r ffurfweddiad. Bydd hyn yn ein helpu ni cyfrifiannell: mae angen i chi yrru ym mharamedrau eich gweinydd a disodli'r gosodiadau yn y ffeil /etc/postgresql/12/main/postgresql.confi'r rhai a gynigir. Dylid nodi yma nad yw cyfrifianellau o'r fath yn fwled hud, a dylid tiwnio'r sylfaen yn fwy manwl gywir, yn seiliedig ar gymhlethdod eich caledwedd, eich cymhwysiad a'ch ymholiad. Ond mae hyn yn ddigon i ddechrau.
Yn ogystal â'r gosodiadau a gynigir gan y gyfrifiannell, rydym hefyd yn newid i mewn postgresql.confy porthladd rhagosodedig 5432 i un arall (yn ein hesiampl - 53983).
Ar ôl newid y ffeil ffurfweddu, ailgychwyn postgresql-server gyda'r gorchymyn:
service postgresql restart
Rydym wedi gosod a ffurfweddu PostgreSQL. Nawr, gadewch i ni greu cronfa ddata, defnyddwyr ar gyfer amgylcheddau dev a prod, a rhoi hawliau i ddefnyddwyr reoli'r gronfa ddata:
$ 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
Gadewch i ni symud ymlaen i osod RabbitMQ, brocer negeseuon ar gyfer Seleri. Mae ei osod ar Debian yn eithaf syml:
Nawr, gadewch i ni osod a ffurfweddu'r gydran olaf ar gyfer ein cais - Redis. Bydd yn cael ei ddefnyddio fel cefndir ar gyfer storio canlyniadau tasgau Seleri.
Byddwn yn codi dau gynhwysydd Docker gyda Redis ar gyfer amgylcheddau dev a prod gan ddefnyddio'r estyniad Docker ar gyfer Plesk.
Rydyn ni'n mynd i Plesk, ewch i'r adran Estyniadau, edrychwch am yr estyniad Docker a'i osod (mae angen fersiwn am ddim arnom):
Ewch i'r estyniad gosod, dewch o hyd i'r ddelwedd trwy'r chwiliad redis bitnami a gosod y fersiwn diweddaraf:
Rydyn ni'n mynd i mewn i'r cynhwysydd wedi'i lawrlwytho ac yn addasu'r ffurfweddiad: nodwch y porthladd, yr uchafswm maint RAM a ddyrannwyd, y cyfrinair yn y newidynnau amgylchedd, a gosodwch y cyfaint:
Rydyn ni'n perfformio camau 2-3 ar gyfer y cynhwysydd prod, yn y gosodiadau dim ond y paramedrau rydyn ni'n eu newid: porthladd, cyfrinair, maint RAM a llwybr i'r ffolder cyfaint ar y gweinydd:
Cofrestrfa Docwyr
Yn ogystal â gwasanaethau sylfaenol, byddai'n braf rhoi eich storfa ddelwedd Docker eich hun ar y gweinydd. Yn ffodus, mae gofod gweinydd bellach yn eithaf rhad (yn sicr yn rhatach na thanysgrifiad DockerHub), ac mae'r broses o sefydlu ystorfa breifat yn syml iawn.
Gadewch i ni greu dau is-barth yn Plesk yn ein tanysgrifiad: docker.helloworld.ru a docker-ui.helloworld.ru, a ffurfweddu tystysgrifau Let's Encrypt ar eu cyfer.
Ychwanegwch y ffeil i'r ffolder subdomain docker.helloworld.ru docker-compose.yml gyda chynnwys fel hyn:
Ac mae angen inni ailgyfeirio Nginx i'n cynwysyddion. Gellir gwneud hyn trwy Plesk.
Mae angen gwneud y camau canlynol ar gyfer yr is-barthau docker.helloworld.ru a docker-ui.helloworld.ru:
Yn adran Offer Dev ein gwefan ewch i Rheolau Dirprwy Docker:
Ac ychwanegu rheol at draffig dirprwyol sy'n dod i mewn i'n cynhwysydd:
Rydym yn gwirio y gallwn fewngofnodi i'n cynhwysydd o'r peiriant lleol:
$ 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
Gadewch i ni hefyd wirio gweithrediad yr is-barth docker-ui.helloworld.ru:
Pan gliciwch ar Pori ystorfeydd, bydd y porwr yn dangos ffenestr awdurdodi lle bydd angen i chi nodi enw defnyddiwr a chyfrinair yr ystorfa. Ar ôl hynny, byddwn yn cael ein trosglwyddo i dudalen gyda rhestr o ystorfeydd (am y tro, bydd yn wag i chi):
Agor porthladdoedd yn Plesk Firewall
Ar ôl gosod a ffurfweddu'r cydrannau, mae angen i ni agor porthladdoedd fel bod y cydrannau'n hygyrch o gynwysyddion Docker a'r rhwydwaith allanol.
Gadewch i ni weld sut i wneud hyn gan ddefnyddio'r estyniad Firewall ar gyfer Plesk a osodwyd gennym yn gynharach.
Mynd i Offer a Gosodiadau > Gosodiadau > Mur Tân:
Mynd i Addasu Rheolau Mur Tân Plesk > Ychwanegu Rheol Custom ac agorwch y porthladdoedd TCP canlynol ar gyfer yr is-rwydwaith Docker (172.0.0.0 / 8):
RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
Coch: 32785, 32786
Byddwn hefyd yn ychwanegu rheol a fydd yn agor porthladdoedd PostgreSQL a phaneli rheoli RabbitMQ i'r byd y tu allan:
Cymhwyswch y rheolau gan ddefnyddio'r botwm Gwneud Cais Newidiadau:
Sefydlu CI/CD yn Github Actions
Gadewch i ni gyrraedd y rhan fwyaf diddorol - sefydlu piblinell integreiddio barhaus a chyflwyno ein prosiect i'r gweinydd.
Bydd y biblinell hon yn cynnwys dwy ran:
adeiladu delwedd a rhedeg profion (ar gyfer y backend) - ar ochr Github;
rhedeg mudo (ar gyfer y backend) a defnyddio cynwysyddion - ar y gweinydd.
Anfon i Plesk
Gadewch i ni ddelio â'r ail bwynt yn gyntaf (gan fod yr un cyntaf yn dibynnu arno).
Byddwn yn ffurfweddu'r broses leoli gan ddefnyddio'r estyniad Git ar gyfer Plesk.
Ystyriwch enghraifft gydag amgylchedd Prod ar gyfer ystorfa Backend.
Rydyn ni'n mynd i danysgrifiad ein gwefan Helloworld ac yn mynd i'r is-adran Git:
Mewnosod dolen i'n cadwrfa Github yn y maes "Remote Git repository" a newid y ffolder rhagosodedig httpdocs i un arall (ee. /httpdocs/hw_back):
Copïwch yr allwedd Gyhoeddus SSH o'r cam blaenorol a ychwanegu ei mewn gosodiadau Github.
Cliciwch OK ar y sgrin yng ngham 2, ac ar ôl hynny byddwn yn cael ein hailgyfeirio i dudalen ystorfa yn Plesk. Nawr mae angen i ni ffurfweddu'r ystorfa i gael ei diweddaru ar ymrwymiadau i'r brif gangen. I wneud hyn, ewch i Gosodiadau Cadwrfa ac arbed y gwerth Webhook URL (bydd ei angen arnom yn nes ymlaen wrth sefydlu Github Actions):
Yn y maes Camau Gweithredu ar y sgrin o'r paragraff blaenorol, nodwch y sgript i lansio'r defnydd:
cd {REPOSITORY_ABSOLUTE_PATH}
.ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID}
lle:
{REPOSITORY_ABSOLUTE_PATH} - llwybr i ffolder prod yr ystorfa backend ar y gweinydd; {ENV} - amgylchedd (dev/prod), yn ein hachos ni prod; {DOCKER_REGISTRY_HOST} — llu ein cadwrfa docwr {TG_BOT_TOKEN} — tocyn bot Telegram; {TG_CHAT_ID} - ID y sgwrs / sianel ar gyfer anfon hysbysiadau.
Enghraifft o sgript:
cd /var/www/vhosts/helloworld.ru/httpdocs/hw_back/
.ci-cd/deploy.sh dev docker.helloworld.ru docker_user docker_password 12345678:AAbcdEfghCH1vGbCasdfSAs0K5PALDsaw -1001234567890
Ychwanegu defnyddiwr o'n tanysgrifiad i'r grŵp Docker (fel y gallant reoli cynwysyddion):
sudo usermod -aG docker helloworld_admin
Mae'r amgylchedd datblygu ar gyfer y storfa backend a'r frontend yn cael eu sefydlu yn yr un modd.
Piblinell lleoli yn Github Actions
Gadewch i ni symud ymlaen i sefydlu rhan gyntaf ein piblinell CI/CD yn Github Actions.
Ond cyn ei dosrannu, gadewch i ni lenwi'r newidynnau Cyfrinachol sydd eu hangen arnom yn Github. I wneud hyn, ewch i Gosodiadau -> Cyfrinachau:
DOCKER_REGISTRY - llu ein cadwrfa Docker (docker.helloworld.ru);
DOCKER_LOGIN - mewngofnodi i gadwrfa'r Docker;
DOCKER_PASSWORD - cyfrinair iddo;
DEPLOY_HOST — gwesteiwr lle mae panel gweinyddol Plesk ar gael (enghraifft: heloworld.com: 8443 neu 123.4.56.78:8443);
DEPLOY_BACK_PROD_TOKEN - arwydd i'w ddefnyddio i'r storfa prod ar y gweinydd (cawsom ef yn Deployment in Plesk t. 4);
DEPLOY_BACK_DEV_TOKEN - tocyn ar gyfer ei ddefnyddio i'r ystorfa datblygu ar y gweinydd.
Mae'r broses leoli yn syml ac yn cynnwys tri phrif gam:
adeiladu a chyhoeddi y ddelw yn ein cadwrfa;
cynnal profion mewn cynhwysydd yn seiliedig ar ddelwedd newydd;
lleoli i'r amgylchedd dymunol yn dibynnu ar y gangen (dev / meistr).
frontend
Y ffeil deploy.yml ar gyfer yr ystorfa flaen ychydig yn wahanol i un Beck. Nid oes ganddo gam gyda rhedeg profion ac mae'n newid enwau tocynnau i'w defnyddio. Gyda llaw, mae angen llenwi'r cyfrinachau ar gyfer y storfa flaen ar wahân.
Gosod safle
Proxy traffig trwy Nginx
Wel, rydyn ni wedi dod i'r diwedd. Dim ond i ffurfweddu dirprwy traffig sy'n dod i mewn ac allan i'n cynhwysydd trwy Nginx y mae'n dal i fod. Rydym eisoes wedi ymdrin â'r broses hon yng ngham 5 o sefydlu Cofrestrfa Docker. Dylid ailadrodd yr un peth ar gyfer y rhannau cefn a blaen mewn amgylcheddau dev a phrod.
Byddaf yn darparu sgrinluniau o'r gosodiadau.
Backend
frontend
Eglurhad pwysig. Bydd pob URL yn cael ei ddirprwyo i'r cynhwysydd blaen, ac eithrio'r rhai sy'n dechrau /api/ - byddant yn cael eu procsi i'r cynhwysydd cefn (felly yn y cynhwysydd cefn, rhaid i bob triniwr ddechrau /api/).
Canlyniadau
Nawr dylai ein gwefan fod ar gael yn helloworld.ru a dev.helloworld.ru (prod- a dev-environments, yn y drefn honno).
Yn gyfan gwbl, fe wnaethom ddysgu sut i baratoi cymhwysiad syml yn Fflasg ac Angular a sefydlu piblinell yn Github Actions i'w gyflwyno i weinydd sy'n rhedeg Plesk.
Byddaf yn dyblygu'r dolenni i'r storfeydd gyda'r cod: cefn, Pen blaen.