CI/KD en Github-Agoj por projekto Flask+Angula

CI/KD en Github-Agoj por projekto Flask+Angula
En ĉi tiu artikolo, mi dividos mian sperton pri agordo de CI/KD uzante la Plesk Kontrolpanelon kaj Github-Agojn. Hodiaŭ ni lernos kiel disfaldi simplan projekton kun la senkomplika nomo "Helloworld". Ĝi estas skribita en la kadro Flask Python, kun Celery-laboristoj kaj Angular 8 fasado.

Ligiloj al deponejoj: backend, fasado.

En la unua parto de la artikolo, ni rigardos nian projekton kaj ĝiajn partojn. En la dua, ni ekscios kiel agordi Plesk kaj instali la necesajn etendaĵojn kaj komponantojn (DB, RabbitMQ, Redis, Docker, ktp.).

En la tria parto, ni finfine eltrovos kiel agordi dukton por disfaldi nian projekton al servilo en dev kaj prod-medio. Kaj tiam ni lanĉos la retejon sur la servilo.

Kaj jes, mi forgesis prezenti min. Mia nomo estas Oleg Borzov, mi estas fullstack programisto en la CRM-teamo por hipotekaj administrantoj ĉe Domclick.

Superrigardo de la projekto

Unue, ni rigardu du projektajn deponejojn - backend kaj fronto - kaj trarigardu la kodon.

Postaĵo: Flakono+Celerio

Por la malantaŭa parto, mi prenis aron, kiu estas sufiĉe populara inter Python-programistoj: la kadro Flask (por la API) kaj Celery (por la taskovico). SQLAchemy estas uzata kiel ORM. Alambiko estas uzata por migradoj. Por JSON-validigo en teniloj - Marshmallow.

В deponejoj estas dosiero Readme.md kun detala priskribo de la strukturo kaj instrukcioj por funkcii la projekton.

Reteja Parto API sufiĉe simpla, konsistas el 6 plumoj:

  • /ping - kontroli haveblecon;
  • teniloj por registriĝo, rajtigo, malrajtigo kaj akiro de rajtigita uzanto;
  • retpoŝta tenilo kiu metas taskon en la Celery-vico.

Celeria parto eĉ pli facile, estas nur unu problemo send_mail_task.

En la dosierujo /konf estas du subdosierujoj:

  • docker kun du Dockerfiles (base.dockerfile konstrui malofte ŝanĝiĝantan bazan bildon kaj Dockerfile por ĉefaj asembleoj);
  • .env_files - kun dosieroj kun mediovariabloj por malsamaj medioj.

Estas kvar docker-komponaj dosieroj ĉe la radiko de la projekto:

  • docker-compose.local.db.yml kreskigi lokan datumbazon por disvolviĝo;
  • docker-compose.local.workers.yml por loka altigado de la laboristo, datumbazo, Redis kaj RabbitMQ;
  • docker-compose.test.yml fari testojn dum deplojo;
  • docker-compose.yml por deplojo.

Kaj la lasta dosierujo pri kiu ni interesiĝas - .ci-kd. Ĝi enhavas ŝelajn skriptojn por deplojo:

  • deploy.sh — lanĉo de migrado kaj deplojo. Funkcias sur la servilo post konstruado kaj funkciado de testoj en Github-Agoj;
  • rollback.sh - retroigo de ujoj al la antaŭa versio de la aro;
  • curl_tg.sh - sendante deplojajn sciigojn al Telegram.

Frontend sur Angula

Deponejo kun fronto multe pli simpla ol tiu de Beck. La fronto konsistas el tri paĝoj:

  • Ĉefpaĝo kun formo por sendi retpoŝton kaj elira butono.
  • Ensalutu paĝo.
  • Paĝo de registriĝo.

La ĉefpaĝo aspektas asketa:

CI/KD en Github-Agoj por projekto Flask+Angula
Estas du dosieroj ĉe la radiko Dockerfile и docker-compose.yml, same kiel la konatan dosierujon .ci-cd kun iomete malpli da skriptoj ol en la malantaŭa deponejo (forigitaj skriptoj por ruli testojn).

Komencante projekton en Plesk

Ni komencu agordante Plesk kaj kreante abonon por nia retejo.

Instalante etendaĵojn

En Plesk, ni bezonas kvar etendaĵojn:

  • Docker administri kaj videble montri la staton de ujoj en la administra panelo de Plesk;
  • Git agordi la disfaldan paŝon sur la servilo;
  • Let's Encrypt generi (kaj aŭtomate renovigi) senpagajn TLS-atestilojn;
  • Firewall por agordi filtradon de envenanta trafiko.

Vi povas instali ilin per la administra panelo de Plesk en la sekcio Etendoj:

CI/KD en Github-Agoj por projekto Flask+Angula
Ni ne konsideros la detalajn agordojn por etendoj, la defaŭltaj agordoj faros por niaj pruvaj celoj.

Kreu abonon kaj retejon

Poste ni devas krei abonon por nia retejo helloworld.ru kaj aldoni tie la subdomajnon dev.helloworld.ru.

  1. Kreu abonon por la domajno helloworld.ru kaj specifu la ensalut-pasvorton por la sistemuzanto:

    CI/KD en Github-Agoj por projekto Flask+Angula
    Marku la skatolon ĉe la malsupro de la paĝo Sekurigu la domajnon per Let's Encryptse ni volas agordi HTTPS por la retejo:

    CI/KD en Github-Agoj por projekto Flask+Angula

  2. Poste, en ĉi tiu abono, kreu subdomajnon dev.helloworld.ru (por kiu vi ankaŭ povas elsendi senpagan TLS-atestilon):

    CI/KD en Github-Agoj por projekto Flask+Angula

Instalado de Servilaj Komponentoj

Ni havas servilon kun OS Debian Stretch 9.12 kaj instalita kontrolpanelo Plesk Obsidiano 18.0.27.

Ni devas instali kaj agordi por nia projekto:

  • PostgreSQL (en nia kazo, estos unu servilo kun du datumbazoj por dev- kaj prod-medioj).
  • RabbitMQ (sama, sama kazo kun malsamaj vhosts por medioj).
  • Du Redis-instancoj (por dev- kaj prod-medioj).
  • Docker Registry (por loka stokado de konstruitaj Docker-bildoj).
  • UI por Docker-registro.

PostgreSQL

Plesk jam venas kun PostgreSQL DBMS, sed ne la plej nova versio (en la momento de verkado de Plesk Obsidian apogita Postgres-versioj 8.4–10.8). Ni volas la plej novan version por nia aplikaĵo (12.3 en la momento de ĉi tiu skribado), do ni instalos ĝin permane.

Estas multaj detalaj instrukcioj por instali Postgres sur Debian en la reto (ekzemplo), do mi ne priskribos ilin detale, mi nur donos la ordonojn:

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

Konsiderante ke PostgreSQL havas sufiĉe mezbonajn defaŭltajn agordojn, necesas korekti la agordon. Ĉi tio helpos nin kalkulilo: vi devas veturi en la parametrojn de via servilo kaj anstataŭigi la agordojn en la dosiero /etc/postgresql/12/main/postgresql.confal tiuj proponitaj. Oni devas rimarki ĉi tie, ke tiaj kalkuliloj ne estas magia kuglo, kaj la bazo devus esti agordita pli precize, surbaze de via aparataro, aplikaĵo kaj demanda komplekseco. Sed ĉi tio sufiĉas por komenci.

Krom la agordoj proponitaj de la kalkulilo, ni ankaŭ ŝanĝiĝas postgresql.confla defaŭlta haveno 5432 al alia (en nia ekzemplo - 53983).

Post ŝanĝi la agordan dosieron, rekomencu postgresql-servilon per la komando:

service postgresql restart

Ni instalis kaj agordis PostgreSQL. Nun ni kreu datumbazon, uzantojn por dev- kaj prod-medioj, kaj donu al uzantoj rajtojn administri la datumbazon:

$ 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

KunikloMQ

Ni pluiru al instalo de RabbitMQ, mesaĝmakleristo por Celery. Instali ĝin sur Debian estas sufiĉe simpla:

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

Post instalado, ni devas krei vgastigantoj, uzantoj kaj donu la necesajn rajtojn:

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

Nun ni instalu kaj agordu la lastan komponanton por nia aplikaĵo - Redis. Ĝi estos uzata kiel backend por stoki la rezultojn de Celery-taskoj.

Ni levos du Docker-ujojn kun Redis por dev- kaj prod-medioj uzante la etendon Docker por Plesk.

  1. Ni iras al Plesk, iru al la sekcio Etendoj, serĉu la etendon Docker kaj instalu ĝin (ni bezonas senpagan version):

    CI/KD en Github-Agoj por projekto Flask+Angula

  2. Iru al la instalita etendo, trovu la bildon per la serĉo redis bitnami kaj instalu la lastan version:

    CI/KD en Github-Agoj por projekto Flask+Angula

  3. Ni eniras la elŝutitan ujon kaj ĝustigas la agordon: specifu la havenon, la maksimuman asignitan RAM-grandecon, la pasvorton en la mediaj variabloj, kaj muntu la volumon:

    CI/KD en Github-Agoj por projekto Flask+Angula

  4. Ni plenumas la paŝojn 2-3 por la prod-ujo, en la agordoj ni nur ŝanĝas la parametrojn: haveno, pasvorto, RAM-grandeco kaj vojo al la voluma dosierujo sur la servilo:

    CI/KD en Github-Agoj por projekto Flask+Angula

Docker Registro

Krom bazaj servoj, estus bone meti vian propran bilddeponejon de Docker sur la servilon. Feliĉe, servila spaco nun estas sufiĉe malmultekosta (certe pli malmultekosta ol abono de DockerHub), kaj la procezo de starigo de privata deponejo estas tre simpla.

Ni volas havi:

Por fari tion:

  1. Ni kreu du subdomajnojn en Plesk en nia abono: docker.helloworld.ru kaj docker-ui.helloworld.ru, kaj agordu Ni Ĉifri atestojn por ili.
  2. Aldonu la dosieron al la subdomajna dosierujo docker.helloworld.ru docker-compose.yml kun enhavo tia:
    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. Sub SSH, ni generos la .htpasswd-dosieron por Baza rajtigo en la deponejo de Docker:
    htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password
  4. Kolektu kaj levu ujojn:
    docker-compose up -d
  5. Kaj ni devas redirekti Nginx al niaj ujoj. Ĉi tio povas esti farita per Plesk.

La sekvaj paŝoj devas esti faritaj por la subdomajnoj docker.helloworld.ru kaj docker-ui.helloworld.ru:

sekcio Iloj Dev nia retejo iru al Docker Prokura Reguloj:

CI/KD en Github-Agoj por projekto Flask+Angula
Kaj aldonu regulon al prokura envenanta trafiko al nia ujo:

CI/KD en Github-Agoj por projekto Flask+Angula

  1. Ni kontrolas, ke ni povas ensaluti al nia ujo de la loka maŝino:
    $ 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. Ni kontrolu ankaŭ la funkciadon de la subdomajno docker-ui.helloworld.ru:

    CI/KD en Github-Agoj por projekto Flask+Angula
    Kiam vi klakas sur Foliumi deponejojn, la retumilo montros rajtigan fenestron, kie vi devos enigi la uzantnomon kaj pasvorton por la deponejo. Post tio, ni estos translokigitaj al paĝo kun listo de deponejoj (nuntempe ĝi estos malplena por vi):

    CI/KD en Github-Agoj por projekto Flask+Angula

Malfermo de havenoj en Plesk Firewall

Post instalo kaj agordo de la komponantoj, ni devas malfermi havenojn por ke la komponantoj estu alireblaj el Docker-ujoj kaj la ekstera reto.

Ni vidu kiel fari ĉi tion uzante la Fajroŝirmitan etendon por Plesk, kiun ni instalis pli frue.

  1. Iru al Iloj kaj Agordoj > Agordoj > Fajromuro:
    CI/KD en Github-Agoj por projekto Flask+Angula
  2. Iru al Modifi Regulojn de Plesk Firewall > Aldoni Propran Regulon kaj malfermu la sekvajn TCP-havenojn por la Docker-subreto (172.0.0.0 / 8):
    RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
    Redis: 32785, 32786

    CI/KD en Github-Agoj por projekto Flask+Angula

  3. Ni ankaŭ aldonos regulon, kiu malfermos PostgreSQL-havenojn kaj administrajn panelojn de RabbitMQ al la ekstera mondo:

    CI/KD en Github-Agoj por projekto Flask+Angula

  4. Apliku la regulojn per la butono Apliki Ŝanĝojn:

    CI/KD en Github-Agoj por projekto Flask+Angula

Agordi CI/KD en Github-Agoj

Ni iru al la plej interesa parto - starigi kontinuan integrigan dukton kaj liveri nian projekton al la servilo.

Ĉi tiu dukto konsistos el du partoj:

  • konstrui bildon kaj ruli testojn (por la backend) - ĉe la flanko de Github;
  • ruli migradojn (por la backend) kaj deplojante ujojn - sur la servilo.

Deploji al Plesk

Ni traktu unue la duan punkton (ĉar la unua dependas de ĝi).

Ni agordos la disfaldan procezon per la etendo Git por Plesk.

Konsideru ekzemplon kun Prod-medio por Backend-deponejo.

  1. Ni iras al la abono de nia retejo Helloworld kaj iras al la Git-subsekcio:

    CI/KD en Github-Agoj por projekto Flask+Angula

  2. Enigu ligilon al nia Github-deponejo en la kampon "Fora Git-deponejo" kaj ŝanĝu la defaŭltan dosierujon httpdocs al alia (ekz. /httpdocs/hw_back):

    CI/KD en Github-Agoj por projekto Flask+Angula

  3. Kopiu la Publikan ŝlosilon SSH de la antaŭa paŝo kaj aldoni estas en Github-agordoj.
  4. Alklaku OK sur la ekrano en la paŝo 2, post kio ni estos redirektitaj al la deponejo-paĝo en Plesk. Nun ni devas agordi la deponejon por esti ĝisdatigita en komitoj al la majstra branĉo. Por fari tion, iru al Deponejo Agordoj kaj konservu la valoron Webhook URL (Ni bezonos ĝin poste dum agordo de Github-Agoj):

    CI/KD en Github-Agoj por projekto Flask+Angula

  5. En la kampo Agoj sur la ekrano de la antaŭa alineo, enigu la skripton por lanĉi la deplojon:
    cd {REPOSITORY_ABSOLUTE_PATH}
    .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID} 

    kie:

    {REPOSITORY_ABSOLUTE_PATH} - vojo al la prod-dosierujo de la malantaŭa deponejo sur la servilo;
    {ENV} - medio (dev / prod), en nia kazo prod;
    {DOCKER_REGISTRY_HOST} - la gastiganto de nia docker-deponejo
    {TG_BOT_TOKEN} — Telegram-bot-ĵetono;
    {TG_CHAT_ID} — ID de la babilejo/kanalo por sendi sciigojn.

    Ekzemplo de manuskripto:

    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. Aldonu uzanton de nia abono al la grupo Docker (por ke ili povu administri ujojn):
    sudo usermod -aG docker helloworld_admin

La dev-medio por la backend-deponejo kaj la fasado estas starigitaj en la sama maniero.

Deploja dukto en Github Agoj

Ni pluiru al starigo de la unua parto de nia CI/CD-dukto en Github-Agoj.

backend

La dukto estas priskribita en deploy.yml dosiero.

Sed antaŭ analizi ĝin, ni plenigu la Sekretajn variablojn, kiujn ni bezonas en Github. Por fari tion, iru al Agordoj -> Sekretoj:

  • DOCKER_REGISTRY - la gastiganto de nia deponejo Docker (docker.helloworld.ru);
  • DOCKER_LOGIN - ensalutu al la deponejo de Docker;
  • DOCKER_PASSWORD - pasvorto al ĝi;
  • DEPLOY_HOST — gastiganto kie la administra panelo de Plesk estas disponebla (ekzemplo: helloworld.com: 8443 aŭ 123.4.56.78:8443);
  • DEPLOY_BACK_PROD_TOKEN - ĵetono por deplojo al la prod-deponejo sur la servilo (ni ricevis ĝin en Deployment in Plesk p. 4);
  • DEPLOY_BACK_DEV_TOKEN - ĵetono por deplojo al la dev-deponejo sur la servilo.

La deploja procezo estas simpla kaj konsistas el tri ĉefaj paŝoj:

  • konstrui kaj publikigi la bildon en nia deponejo;
  • ruli testojn en ujo bazita sur ĵus konstruita bildo;
  • deplojo al la dezirata medio depende de la branĉo (dev/majstro).

Antaŭa finaĵo

La deploy.yml dosiero por la antaŭa deponejo iom diferenca de tiu de Beck. Ĝi mankas paŝo kun kurado de testoj kaj ŝanĝas la nomojn de ĵetonoj por deplojo. Sekretoj por la antaŭa deponejo, cetere, devas esti plenigitaj aparte.

Agordo de retejo

Prokura trafiko tra Nginx

Nu, ni venis al la fino. Restas nur agordi la prokuradon de envenanta kaj elira trafiko al nia ujo per Nginx. Ni jam kovris ĉi tiun procezon en la paŝo 5 de la agordo de Docker Registry. La sama devus esti ripetita por la malantaŭaj kaj antaŭaj partoj en dev- kaj prod-medioj.

Mi provizos ekrankopiojn de la agordoj.

backend

CI/KD en Github-Agoj por projekto Flask+Angula

Antaŭa finaĵo

CI/KD en Github-Agoj por projekto Flask+Angula
Grava klarigo. Ĉiuj URL-oj estos prokuritaj al la fasanta ujo, krom tiuj komencante per /api/ - ili estos aligitaj al la malantaŭa ujo (do en la malantaŭa ujo, ĉiuj prizorgantoj devas komenci kun /api/).

Rezultoj

Nun nia retejo estu disponebla ĉe helloworld.ru kaj dev.helloworld.ru (prod- kaj dev-medioj, respektive).

Entute, ni lernis kiel prepari simplan aplikaĵon en Flask kaj Angular kaj starigi dukton en Github Agoj por disvastigi ĝin al servilo prizorganta Plesk.

Mi duobligos la ligilojn al la deponejoj per la kodo: backend, fasado.

fonto: www.habr.com

Aldoni komenton