Hi!
Jina langu ni Sergey, ninafanya kazi kama mhandisi wa miundombinu katika timu ya API ya jukwaa la tinkoff.ru.
Katika makala hii nitazungumzia matatizo ambayo timu yetu ilikabiliana nayo wakati wa kuandaa mizani kulingana na Nginx kwa miradi mbalimbali. Pia nitakuambia kuhusu chombo ambacho kiliniruhusu kushinda wengi wao.
Nginx ni seva mbadala inayofanya kazi nyingi na inayoendelea kikamilifu. Inayo idadi kubwa ya moduli, hii sio orodha kamili. Kila mradi unaweka mahitaji fulani juu ya utendaji wa usawazishaji na toleo la Nginx (kwa mfano, uwepo wa http/2 na grpc proxying), na muundo wa modules zake.
Tungependa kuona toleo jipya lenye seti inayohitajika ya moduli, inayoendeshwa chini ya usambazaji mahususi wa Linux. Kwa upande wetu, hizi ni mifumo ya msingi wa deni na rpm. Chaguo na vyombo haizingatiwi katika makala hii.
Tunataka kubadilisha haraka utendakazi wa wasawazishaji wetu. Na hapa swali linatokea mara moja: jinsi ya kufikia hili wakati unatumia rasilimali chache iwezekanavyo? Itakuwa bora zaidi kusanidi mchakato ili tuweze kutaja idadi ndogo ya vigezo vya pembejeo, na kwa pato kupokea artifact katika mfumo wa kifurushi cha deb/rpm kwa OS inayotaka.
Kama matokeo, shida kadhaa zinaweza kutatuliwa:
Hakuna vifurushi vilivyo na toleo la hivi karibuni la Nginx kila wakati.
Hakuna vifurushi vilivyo na moduli zinazohitajika.
Kukusanya na kutengeneza kifurushi kwa mikono ni muda mwingi na kuchosha kabisa.
Hakuna maelezo ya jinsi hii au mfano huo wa Nginx umekusanyika.
Ili kusuluhisha shida hizi, hitaji linatokea la zana ambayo inaweza kuchukua kama uainishaji wa kuingiza katika umbizo linaloweza kusomeka na binadamu na kukusanya kifurushi cha Nginx chenye utendakazi unaohitajika kulingana nacho.
Bila kupata chaguo linalofaa kwetu juu ya ukubwa wa Github, tuliamua kuunda zana yetu wenyewe - mjenzi wa nginx.
Specifications
Katika zana yetu, tulitaka kuunda maelezo ya vipimo katika mfumo wa nambari, ambayo inaweza kuwekwa kwenye hazina ya Git. Ili kufanya hivyo, tulichagua muundo unaojulikana kwa vitu kama hivyo - yaml. Mfano wa Specification:
Hapa tunaonyesha kuwa tunataka kuona kifurushi cha deni na toleo la Nginx 1.14.2 na seti inayohitajika ya moduli. Sehemu iliyo na moduli ni ya hiari. Kwa kila mmoja wao unaweza kuweka:
Jina.
Anwani unapoweza kuipata:
Hifadhi ya Git. Unaweza pia kutaja tawi au lebo.
Hifadhi kiungo cha wavuti.
Kiungo cha ndani cha kumbukumbu.
Baadhi ya moduli zinahitaji vitegemezi vya ziada kusakinishwa, kwa mfano nginx-auth-ldap inahitaji libldap2-dev kusakinishwa. Vitegemezi vinavyohitajika vinaweza pia kubainishwa wakati wa kuelezea moduli.
Mazingira
Katika chombo chetu unaweza kupata haraka mazingira na huduma zilizowekwa kwa ajili ya mkusanyiko, mkusanyiko wa mfuko na programu nyingine ya msaidizi. Chombo cha Docker kilicho na kila kitu unachohitaji ni bora hapa (hazina tayari ina mifano michache ya faili za Docker za ubuntu na centos).
Baada ya uainishaji kutayarishwa na mazingira kutayarishwa, tunazindua mjenzi wetu, akiwa ameweka utegemezi wake hapo awali:
Nambari ya marekebisho hapa ni ya hiari na inatumika kwa makusanyiko ya matoleo. Imeandikwa katika maelezo ya meta ya kifurushi, na kuifanya iwe rahisi kusasisha kwenye seva.
Kutoka kwa magogo unaweza kufuatilia kinachotokea. Hapa kuna mfano wa mambo makuu:
builder - INFO - Parse yaml file: example.config.yaml
builder - INFO - Download scripts for build deb package
builder - INFO - Downloading nginx src...
builder - INFO - --> http://nginx.org/download/nginx-1.14.1.tar.gz
builder - INFO - Downloading 3d-party modules...
builder - INFO - Module nginx-auth-ldap will download by branch
builder - INFO - -- Done: nginx-auth-ldap
builder - INFO - -- Done: ngx_http_substitutions_filter_module
builder - INFO - Module headers-more-nginx-module will downloading
builder - INFO - Module nginx-module-vts will download by tag
builder - INFO - -- Done: nginx-module-vts
builder - INFO - Module ngx_devel_kit will download by tag
builder - INFO - -- Done: ngx_devel_kit
builder - INFO - -- Done: ngx_cache_purge
builder - INFO - -- Done: ngx_http_dyups_module
builder - INFO - Downloading dependencies
builder - INFO - Building .deb package
builder - INFO - Running 'dh_make'...
builder - INFO - Running 'dpkg-buildpackage'...
dpkg-deb: building package 'nginx' in '../nginx_1.14.1-1_amd64.deb'.
Kwa hivyo, kwa amri chache tu, tunaunda mazingira na mkusanyiko unaohitajika wa Nginx, na kifurushi kinaonekana kwenye saraka kutoka ambapo hati imezinduliwa.
Kupachika
Tunaweza pia kuunganisha zana yetu katika michakato ya CI/CD. Yoyote ya mifumo mingi ya CI iliyopo leo inaweza kusaidia na hii, kwa mfano Timu ya pamoja au Gitlab CI.
Kama matokeo, kila wakati vipimo vinapobadilika kwenye hazina ya Git, muundo wa kisanii huzinduliwa kiatomati. Nambari ya marekebisho imeunganishwa kwenye kihesabu cha uzinduzi wa jengo.
Kwa muda kidogo zaidi, unaweza kusanidi vizalia vya programu kutumwa kwenye hazina ya kifurushi chako cha ndani, Nexus, Artifactory, na kadhalika.
Faida ya ziada ni kwamba faili ya usanidi ya yaml inaweza kuunganishwa kwa Ansible au mfumo mwingine wa usanidi wa kiotomatiki, na kutoka hapo tunaweza kuchukua nambari ya toleo na aina ya kifurushi tunachotaka kusambaza.
Nini kifuatacho
Mradi bado haujakamilika. Haya ndiyo tunayofanyia kazi sasa:
Tunapanua uwezekano wa usanidi, lakini wakati huo huo uifanye iwe rahisi iwezekanavyo. Hutaki kufafanua vigezo elfu ikiwa unahitaji mbili tu, na zingine zinafaa kwa chaguo-msingi. Hii inajumuisha bendera za ujumuishaji (sasa unaweza kuzibadilisha katika faili ya usanidi wa ndani src/config.py), njia ya usakinishaji, na kuzindua mtumiaji.
Tunaongeza chaguo za kutuma kifurushi kiotomatiki kwenye hazina mbalimbali za vizalia vya programu.