CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular

CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular
I roto i tenei tuhinga, ka tohatohahia e au taku wheako ki te whakatu CI / CD ma te whakamahi i te Paewhiri Mana Plesk me nga Mahi a Github. I tenei ra ka ako tatou me pehea te whakatakoto i tetahi kaupapa ngawari me te ingoa ngawari "Helloworld". Kua tuhia ki roto i te anga Flask Python, me nga kaimahi Herewi me te Angular 8 o mua.

Hononga ki nga putunga: tuara, mua.

I te wahanga tuatahi o te tuhinga, ka titiro tatou ki ta tatou kaupapa me ona wahanga. I te tuarua, ka whakaarohia e matou me pehea te whakarite i te Plesk me te whakauru i nga taapiri me nga waahanga e tika ana (DB, RabbitMQ, Redis, Docker, etc.).

I te wahanga tuatoru, ka mutu ka whakaaro tatou me pehea te whakarite i te paipa mo te tuku i a maatau kaupapa ki tetahi kaimau i roto i te taiao dev me te prod. Na ka whakarewahia e matou te pae i runga i te tūmau.

Ae, kua wareware ahau ki te whakaatu i ahau. Ko Oleg Borzov toku ingoa, he kaiwhakawhanake tonu ahau i roto i te roopu CRM mo nga kaiwhakahaere mokete i Domclick.

Kaupapa Kaupapa

Tuatahi, kia tirohia e rua nga putunga kaupapa - muri me mua - ka haere ki runga i te waehere.

Whakamuri: Flask+Celery

Mo te taha o muri, i mau ahau i tetahi paihere e tino rongonui ana i waenga i nga kaiwhakawhanake Python: te anga Flask (mo te API) me te Celery (mo te rarangi mahi). Ka whakamahia te SQLAchemy hei ORM. Ka whakamahia te Alembic mo nga heke. Mo te whakamana JSON i roto i nga kakau - Marshmallow.

В whare putunga he konae Readme.md me te whakamaarama taipitopito o te hanganga me nga tohutohu mo te whakahaere i te kaupapa.

API Waahanga Tukutuku tino uaua, e 6 nga pene:

  • /ping - ki te tirotiro i te waatea;
  • ka mau mo te rehitatanga, te whakamanatanga, te whakakore i te mana me te whiwhi i tetahi kaiwhakamahi whai mana;
  • he kakau imeera e tuu ana i tetahi mahi ki te rarangi herewi.

Te wahanga herewi he maamaa ake, kotahi anake te raru send_mail_task.

Kei te kōpaki /conf e rua nga kōpakiroto:

  • docker me nga konae Docker e rua (base.dockerfile ki te hanga i te ahua onge te hurihanga me te Dockerfile mo nga huihuinga matua);
  • .env_files - me nga konae me nga taurangi taiao mo nga taiao rereke.

E wha nga konae tito docker kei te putake o te kaupapa:

  • docker-compose.local.db.yml ki te whakaara i tetahi putunga raraunga o te rohe mo te whanaketanga;
  • docker-compose.local.workers.yml mo te whakaara ake i te kaimahi, te putunga korero, Redis me RabbitMQ;
  • docker-compose.test.yml ki te whakahaere i nga whakamatautau i te wa e tukuna ana;
  • docker-compose.yml mo te whakatakotoranga.

A ko te kōpaki whakamutunga e hiahia ana matou - .ci-cd. Kei roto nga tuhinga anga mo te horahanga:

  • deploy.sh — te whakarewatanga o te heke me te tuku. Ka rere i runga i te tūmau i muri i te hanga me te whakahaere i nga whakamatautau i roto i nga Mahi a Github;
  • rollback.sh - te huri i nga ipu ki te putanga o mua o te huihuinga;
  • curl_tg.sh - te tuku panui whakamohiotanga ki Telegram.

Tuhinga o mua i te Angular

Pupuri me mua he maamaa ake i a Beck. E toru nga wharangi o mua:

  • Te wharangi matua me te puka mo te tuku imeera me te paatene puta.
  • Whārangi takiuru.
  • Whārangi rehitatanga.

Ko te wharangi matua he ahua whakakeke:

CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular
E rua nga konae kei te putake Dockerfile и docker-compose.yml, me te kōpaki taunga .ci-cd he iti ake nga tuhinga i te putunga o muri (kua tangohia nga tuhinga hei whakahaere i nga whakamatautau).

Te tiimata i tetahi kaupapa i Plesk

Me timata ma te whakatu i a Plesk me te hanga ohaurunga mo to maatau papaanga.

Tāuta toronga

I Plesk, me wha nga toronga:

  • Docker ki te whakahaere me te whakaatu kanohi i te mana o nga ipu kei te papa whakahaere o Plesk;
  • Git ki te whirihora i te taahiraa tuku i runga i te tūmau;
  • Let's Encrypt ki te whakaputa (me te whakahou-aunoa) tiwhikete TLS kore utu;
  • Firewall ki te whirihora i te tātari o nga waka taumai.

Ka taea e koe te whakauru i a raatau ma te roopu whakahaere Plesk i te waahanga Toronga:

CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular
E kore matou e whakaaro ki nga tautuhinga taipitopito mo nga taapiri, ka mahia e nga tautuhinga taunoa mo o maatau kaupapa demo.

Waihangahia he ohaurunga me te pae

I muri mai, me hanga he ohaurunga mo ta maatau paetukutuku helloworld.ru me te taapiri i te dev.helloworld.ru subdomain ki reira.

  1. Waihangahia he ohaurunga mo te rohe helloworld.ru ka whakapūtā te takiuru-kupuhipa mo te kaiwhakamahi pūnaha:

    CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular
    Tirohia te pouaka kei raro o te wharangi Whakaorangia te rohe ki a Let's Encryptki te hiahia matou ki te whakarite HTTPS mo te pae:

    CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular

  2. I muri mai, i tenei ohaurunga, hangahia he subdomain dev.helloworld.ru (ka taea hoki e koe te tuku tiwhikete TLS kore utu):

    CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular

Tāuta Wae Tūmau

He tūmau kei a matou OS Debian Stretch 9.12 me te paewhiri mana kua whakauruhia Plesk Obsidian 18.0.27.

Me whakauru me te whirihora mo ta maatau kaupapa:

  • PostgreSQL (i roto i ta maatau keehi, ka kotahi te tūmau me nga papaa raraunga e rua mo nga taiao dev me te prod).
  • RabbitMQ (he rite, he tauira me nga vhosts rereke mo nga taiao).
  • E rua nga tauira Redis (mo nga taiao dev me te whakaputa).
  • Rehita Docker (mo te rokiroki a rohe o nga whakaahua Docker kua hangaia).
  • UI mo te rehita Docker.

PostgreSQL

Kua tae mai a Plesk me te PostgreSQL DBMS, engari ehara i te putanga hou (i te wa e tuhi ana a Plesk Obsidian tautokona Putanga Postgres 8.4–10.8). Kei te pirangi matou ki te putanga hou mo ta maatau tono (12.3 i te wa o tenei tuhinga), na ka whakauruhia e matou ma te ringa.

He maha nga tohutohu taipitopito mo te whakauru i nga Postgres ki a Debian i runga i te kupenga (tauira), no reira kare au e whakaahua taipitopito, ka hoatu noa e au nga whakahau:

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

Ki te whakaaro ko te PostgreSQL he iti noa nga tautuhinga taunoa, me whakatika te whirihoranga. Ka awhina tenei i a maatau tāetete: me peia e koe nga tawhā o to tūmau me te whakakapi i nga tautuhinga i roto i te konae /etc/postgresql/12/main/postgresql.confki te hunga e tapaea ana. Me tohuhia i konei ehara enei tatauranga i te matā makutu, a me tino tika ake te hanga o te turanga, i runga i to taputapu, tono, me te uaua o te patai. Engari he nui tenei hei timata.

I tua atu i nga tautuhinga i whakaarohia e te taatai, ka huri ano matou postgresql.confte tauranga taunoa 5432 ki tetahi atu (i ta maatau tauira - 53983).

I muri i te huri i te konae whirihoranga, whakaara ano i te postgresql-server me te whakahau:

service postgresql restart

Kua whakauruhia, kua whirihorahia e matou te PostgreSQL. Inaianei me hanga he patengi raraunga, nga kaiwhakamahi mo nga taiao dev me te whakaputanga, me te tuku mana ki nga kaiwhakamahi ki te whakahaere i te paataka raraunga:

$ 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

Ka anga whakamua ki te whakauru i a RabbitMQ, he kaihokohoko karere mo Celery. Ko te whakauru i runga i a Debian he tino ngawari:

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

I muri i te whakaurunga, me hanga e tatou vhosts, nga kaiwhakamahi me te tuku i nga mana tika:

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

Inaianei me whakauru me te whirihora i te waahanga whakamutunga mo ta maatau tono - Redis. Ka whakamahia hei tuara mo te penapena i nga hua o nga mahi herewi.

Ka whakaarahia e matou nga ipu Docker e rua me te Redis mo te dev me nga taiao prod ma te whakamahi i te toronga Docker mo Plesk.

  1. Ka haere matou ki Plesk, haere ki te waahanga Toronga, rapua te toronga Docker me te whakauru (me whai putanga kore utu):

    CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular

  2. Haere ki te toronga kua whakauruhia, kimihia te ahua ma te rapu redis bitnami ka tāuta i te putanga hōu:

    CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular

  3. Ka haere matou ki roto i te ipu kua tangohia ka whakatika i te whirihoranga: tohua te tauranga, te rahi o te rahinga RAM kua tohatohahia, te kupuhipa i roto i nga taurangi taiao, ka whakairihia te rōrahi:

    CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular

  4. Ka mahia e matou nga waahanga 2-3 mo te ipu prod, i roto i nga tautuhinga ka huri noa i nga tawhā: te tauranga, te kupuhipa, te rahi o te RAM me te ara ki te kōpaki rōrahi i runga i te tūmau:

    CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular

Rehita Docker

I tua atu i nga ratonga taketake, he pai ki te whakauru i a koe ake putunga whakaahua Docker ki runga i te tūmau. Waimarie, he iti noa te mokowā tūmau (he iti ake te utu i te ohaurunga DockerHub), a he tino ngawari te mahi ki te whakatu i tetahi putunga motuhake.

E hiahia ana matou ki te whai:

Hei mahi i tenei:

  1. Me hanga e rua nga roheroto i Plesk i roto i ta maatau ohaurunga: docker.helloworld.ru me docker-ui.helloworld.ru, me te whirihora i nga tiwhikete Kia Whakamuna ma ratou.
  2. Tāpirihia te konae ki te kōpaki roheroto docker.helloworld.ru docker-compose.yml me nga ihirangi penei:
    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. I raro i te SSH, ka whakaputahia e matou te konae .htpasswd mo te whakamanatanga taketake i roto i te putunga Docker:
    htpasswd -bBc .htpasswd hw_docker_admin hw_docker_password
  4. Kohikohi me te hiki ipu:
    docker-compose up -d
  5. A me huri ano a Nginx ki o tatou ipu. Ka taea tenei ma Plesk.

Ko nga mahi e whai ake nei me mahi mo te docker.helloworld.ru me te docker-ui.helloworld.ru subdomains:

wāhanga Utauta Taputapu haere to tatou pae ki Ture Takawaenga Docker:

CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular
Ka taapirihia he ture hei takawaenga i nga waka taumai ki ta maatau ipu:

CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular

  1. Ka tirohia e matou ka taea e matou te takiuru ki ta matou ipu mai i te miihini o te rohe:
    $ 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. Me tirohia ano te mahi o te docker-ui.helloworld.ru subdomain:

    CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular
    Ka paato koe ki te Tirotiro i nga whare pupuri, ka whakaatu te kaitirotiro i te matapihi whakamanatanga me whakauru koe i te ingoa kaiwhakamahi me te kupuhipa mo te putunga. I muri i tera, ka whakawhitia matou ki tetahi wharangi me te rarangi o nga putunga (mo tenei wa, ka noho kau mo koe):

    CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular

Te whakatuwhera i nga tauranga i Plesk Firewall

I muri i te whakauru me te whirihora i nga waahanga, me whakatuwhera nga tauranga kia uru mai nga waahanga mai i nga ipu Docker me te whatunga o waho.

Kia kite tatou me pehea te mahi ma te whakamahi i te toronga Pātūahi mo Plesk i whakauruhia e matou i mua.

  1. Haere ki Utauta & Tautuhinga> Tautuhinga> Patuahi:
    CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular
  2. Haere ki Whakarerekē Ture Pātūahi Plesk > Tāpiri Ture Ritenga ka whakatuwhera i nga tauranga TCP e whai ake nei mo te kupengaroto Docker (172.0.0.0 / 8):
    RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
    Redis: 32785, 32786

    CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular

  3. Ka taapirihia he ture hei whakatuwhera i nga tauranga PostgreSQL me nga panui whakahaere RabbitMQ ki te ao o waho:

    CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular

  4. Hoatu nga ture ma te whakamahi i te paatene Hoatu Huringa:

    CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular

Te whakatu CI/CD ki nga Mahi a Github

Me heke ki te waahanga tino whakamere - te whakarite i te paipa whakauru tonu me te tuku i ta tatou kaupapa ki te tūmau.

E rua nga wahanga o tenei pipeline:

  • te hanga whakaahua me te whakahaere i nga whakamatautau (mo te tuara) - kei te taha o Github;
  • rere hekenga (mo te tuara) me te whakatakoto ipu - i runga i te tūmau.

Tukuna ki Plesk

Me mahi ki te take tuarua i te tuatahi (na te mea ka whakawhirinaki te tuatahi ki runga).

Ka whirihorahia e matou te mahinga tuku ma te whakamahi i te toronga Git mo Plesk.

Whakaarohia he tauira me te taiao Prod mo te putunga Putunga.

  1. Ka haere matou ki te ohaurunga o ta maatau paetukutuku a Helloworld ka haere ki te waahanga-iti o Git:

    CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular

  2. Whakauruhia he hononga ki ta maatau putunga Github ki te mara "Remote Git repository" ka huri i te kōpaki taunoa httpdocs ki tetahi atu (hei tauira. /httpdocs/hw_back):

    CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular

  3. Tāruatia te kī SSH Public mai i te taahiraa o mua me te tāpiri kei roto i nga tautuhinga Github.
  4. Paatohia te OK i runga i te mata i te taahiraa 2, muri iho ka tukuna atu ki te wharangi putunga i Plesk. Inaianei me whirihora i te putunga kia whakahoutia i runga i nga mahi ki te peka matua. Ki te mahi i tenei, haere ki Tautuhinga Pupuri me te tiaki i te uara Webhook URL (ka hiahia matou i muri mai i te wa e whakarite ana i nga Mahi a Github):

    CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular

  5. I roto i te mara Hohenga i runga i te mata mai i te kowae o mua, whakauruhia te tuhinga hei whakarewa i te tukunga:
    cd {REPOSITORY_ABSOLUTE_PATH}
    .ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID} 

    kei hea:

    {REPOSITORY_ABSOLUTE_PATH} - ara ki te kōpaki prod o te putunga o muri i runga i te tūmau;
    {ENV} - taiao (dev / prod), i roto i to maatau take prod;
    {DOCKER_REGISTRY_HOST} - te kaihautu o ta matou putunga putunga
    {TG_BOT_TOKEN} — Tohu karetao Telegram;
    {TG_CHAT_ID} — ID o te korerorero / hongere mo te tuku whakamohiotanga.

    Tauira hōtuhi:

    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. Tāpirihia he kaiwhakamahi mai i ta maatau ohaurunga ki te roopu Docker (kia taea e ratou te whakahaere ipu):
    sudo usermod -aG docker helloworld_admin

Ko te taiao dev mo te rehitatanga o muri me te pito o mua kua rite te whakarite.

Hoatuhia te paipa i roto i nga Hohenga Github

Me neke whakamua ki te whakatuu i te waahanga tuatahi o ta maatau paipa CI/CD i roto i nga Mahi a Github.

Tuhinga

Ko te pipeline e whakaahuatia ana i roto deploy.yml kōnae.

Engari i mua i te panui, me whakakiia nga taurangi ngaro e hiahiatia ana e tatou i Github. Ki te mahi i tenei, haere ki Tautuhinga -> Nga mea ngaro:

  • DOCKER_REGISTRY - te kaihautu o ta matou putunga Docker (docker.helloworld.ru);
  • DOCKER_LOGIN - takiuru ki te putunga Docker;
  • DOCKER_PASSWORD - kupuhipa ki reira;
  • DEPLOY_HOST — kaihautu kei te waatea te roopu whakahaere Plesk (tauira: helloworld.com: 8443 ranei 123.4.56.78:8443);
  • DEPLOY_BACK_PROD_TOKEN - he tohu mo te tuku ki te putunga prod-repository i runga i te tūmau (i whiwhi matou i te Deployment in Plesk p. 4);
  • DEPLOY_BACK_DEV_TOKEN - tohu mo te tuku ki te putunga dev i runga i te tūmau.

He ngawari te tukanga tuku, e toru nga waahanga matua:

  • te hanga me te whakaputa i te ahua ki roto i ta maatau putunga;
  • te whakahaere i nga whakamatautau i roto i tetahi ipu i runga i te ahua hou i hangaia;
  • te tuku ki te taiao e hiahiatia ana i runga i te peka (dev/master).

frontend

Ko te kōnae deploy.yml mo te putunga o mua He rereke te rereke mai i a Beck. Karekau he taahiraa ki te whakahaere i nga whakamatautau me te whakarereke i nga ingoa o nga tohu mo te tuku. Ko nga mea ngaro mo te rehitatanga o mua, na te ara, me whakakii motuhake.

Tatūnga pae

Te takawaenga waka ma Nginx

Kaati, kua tae tatou ki te mutunga. Ka noho tonu ki te whirihora i te takawaenga o nga waka taumai me te puta atu ki ta maatau ipu ma Nginx. Kua hipokina e matou tenei tukanga i te taahiraa 5 o te tatūnga Rehita Docker. Me whakahoki ano mo nga waahanga o muri me o mua i roto i nga taiao dev me te prod.

Ka hoatu e ahau nga whakaahua o nga tautuhinga.

Tuhinga

CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular

frontend

CI/CD i roto i nga Mahi a Github mo te kaupapa Flask+Angular
Tuhinga o mua. Ka tukuna nga URL katoa ki te ipu o mua, haunga era ka timata mai /api/ - ka tukuna ki te ipu o muri (na i roto i te ipu o muri, me timata nga kaikawe katoa /api/).

Ngā putanga

Inaianei kei te waatea to maatau pae ki helloworld.ru me dev.helloworld.ru (prod- me dev-taiao, ia).

I te katoa, i ako matou me pehea te whakarite i tetahi tono ngawari i roto i te Flask me te Angular me te whakarite i tetahi paipa i roto i nga Mahi a Github hei huri atu ki tetahi tūmau e whakahaere ana i a Plesk.

Ka tāruahia e ahau nga hononga ki nga whare pupuri me te waehere: tuara, mua.

Source: will.com

Tāpiri i te kōrero