Saluton!
Mi nomiĝas Sergey, mi laboras kiel infrastruktura inĝeniero en la API-teamo de la platformo tinkoff.ru.
En ĉi tiu artikolo mi parolos pri la problemoj, kiujn nia teamo alfrontis kiam preparis ekvilibristojn bazitajn sur Nginx por diversaj projektoj. Mi ankaŭ rakontos al vi pri la ilo, kiu permesis al mi venki la plej multajn el ili.
Nginx estas multfunkcia kaj aktive evoluanta prokurilo. Ĝi havas grandan nombron da moduloj, ĉi tio ne estas kompleta listo. Ĉiu projekto trudas certajn postulojn pri la funkcieco de la ekvilibristo kaj la versio de Nginx (ekzemple, la ĉeesto de http/2 kaj grpc-proxying), kaj la komponado de ĝiaj moduloj.
Ni ŝatus vidi freŝan version kun la bezonata aro de moduloj, funkciante sub specifa Linukso-distribuo. En nia kazo, ĉi tiuj estas deb- kaj rpm-bazitaj sistemoj. La opcio kun ujoj ne estas konsiderata en ĉi tiu artikolo.
Ni volas rapide ŝanĝi la funkciojn de niaj balanciloj. Kaj ĉi tie tuj aperas la demando: kiel atingi ĉi tion elspezante kiel eble plej malmultajn rimedojn? Estus eĉ pli bone agordi la procezon por ke ni povu specifi finian nombron da enigparametroj, kaj ĉe la eligo ricevi artefakton en la formo de deb/rpm-pakaĵo por la dezirata OS.
Kiel rezulto, kelkaj problemoj povas esti formulitaj:
Ne ĉiam estas pakaĵoj kun la plej nova versio de Nginx.
Ne ekzistas pakoj kun la postulataj moduloj.
Kompili kaj konstrui pakaĵon permane estas tempopostula kaj tute teda.
Ne estas priskribo pri kiel ĉi tiu aŭ alia Nginx-instanco estas kunvenita.
Por solvi ĉi tiujn problemojn, aperas la bezono de ilo, kiu prenus kiel enigaĵon specifon en homlegebla formato kaj kunvenus Nginx-pakaĵon kun la necesa funkcieco bazita sur ĝi.
Ne trovante taŭgan opcion por ni sur la vasteco de Github, ni decidis krei nian propran ilon - nginx-konstruanto.
Specifoj (redakti)
En nia ilo, ni volis krei priskribon de la specifo en formo de kodo, kiu tiam povas esti metita en Git-deponejon. Por fari tion, ni elektis la konatan formaton por tiaj aferoj - yaml. Specifa ekzemplo:
Ĉi tie ni indikas, ke ni volas vidi deb-pakaĵon kun Nginx-versio 1.14.2 kun la bezonata aro de moduloj. La sekcio kun moduloj estas laŭvola. Por ĉiu el ili vi povas agordi:
Nomo.
Adreso kie vi povas akiri ĝin:
Git-deponejo. Vi ankaŭ povas specifi branĉon aŭ etikedon.
Arkivu interretligilon.
Loka ligilo al la arkivo.
Iuj moduloj postulas pliajn dependecojn esti instalitaj, ekzemple nginx-auth-ldap postulas libldap2-dev instalita. Necesaj dependecoj ankaŭ povas esti specifitaj dum priskribado de la modulo.
La medio
En nia ilo vi povas rapide akiri medion kun instalitaj utilecoj por kompilo, pakaĵaro kaj aliaj helpaj programoj. Docker-ujo kun ĉio, kion vi bezonas, estas ideala ĉi tie (la deponejo jam havas kelkajn ekzemplojn de Docker-dosieroj por ubuntu kaj centos).
Post kiam la specifo estas ellaborita kaj la medio estas preta, ni lanĉas nian konstruilon, antaŭe instalinte ĝiajn dependecojn:
La revizia numero ĉi tie estas laŭvola kaj estas uzata por versioj de asembleoj. Ĝi estas skribita en la metainformojn de la pakaĵo, faciligante ĝisdatigon sur serviloj.
El la protokoloj vi povas kontroli kio okazas. Jen ekzemplo de la ĉefaj punktoj:
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'.
Do, kun nur kelkaj komandoj, ni kreas la medion kaj la bezonatan Nginx-asembleon, kaj la pako aperas en la dosierujo de kie la skripto estas lanĉita.
Enkonstruado
Ni ankaŭ povas integri nian ilon en CI/KD-procezojn. Ĉiu el la multaj CI-sistemoj ekzistantaj hodiaŭ povas helpi kun tio, ekzemple Teamcity aŭ Gitlab CI.
Kiel rezulto, ĉiufoje kiam la specifo ŝanĝiĝas en la Git-deponejo, la konstruo de la artefakto estas aŭtomate lanĉita. La revizia numero estas ligita al la konstrua lanĉa nombrilo.
Kun iom pli da tempo, vi povas agordi la artefakton por esti sendita al via loka pak-deponejo, Nexus, Artifactory, ktp.
Plia avantaĝo estas, ke la yaml-agorda dosiero povas esti konektita al Ansible aŭ al alia aŭtomata agorda sistemo, kaj de tie ni povas preni la version-numeron kaj pakaĵon, kiujn ni volas disfaldi.
Kio sekvas
La projekto ankoraŭ ne estas finita. Jen pri kio ni laboras nun:
Ni pligrandigas la eblecon de agordo, sed samtempe tenas ĝin kiel eble plej simpla. Vi ne volas difini mil parametrojn se vi bezonas nur du, kaj la resto taŭgas defaŭlte. Ĉi tio inkluzivas kompilajn flagojn (nun vi povas ŝanĝi ilin en la interna agorda dosiero src/config.py), instala vojo kaj lanĉa uzanto.
Ni aldonas eblojn por aŭtomate sendi pakaĵon al diversaj artefaktaj deponejoj.