Hi!
Nire izena Sergey da, azpiegitura ingeniari gisa lan egiten dut tinkoff.ru plataformako API taldean.
Artikulu honetan gure taldeak orekatzaileak prestatzeko orduan izan zituen arazoei buruz hitz egingo dut nginx hainbat proiektutarako. Gehienak gainditzeko aukera eman zidan tresnaren berri ere emango dizut.
Nginx funtzio anitzeko eta aktiboki garatzen duen proxy zerbitzaria da. Modulu ugari ditu, hau ez da zerrenda osoa. Proiektu bakoitzak baldintza batzuk ezartzen ditu orekatzailearen funtzionaltasunari eta Nginx-en bertsioari (adibidez, http/2 eta grpc proxy-aren presentzia), eta bere moduluen osaeran.
Bertsio berri bat ikusi nahiko genuke behar den modulu-multzoarekin, Linux banaketa zehatz baten pean exekutatzen. Gure kasuan, deb eta rpm-n oinarritutako sistemak dira. Artikulu honetan ez da edukiontzien aukera kontuan hartzen.
Gure orekatzaileen funtzionaltasuna azkar aldatu nahi dugu. Eta hemen berehala sortzen da galdera: nola lortu hori ahalik eta baliabide gutxien gastatuz? Are hobea izango litzateke prozesua konfiguratzea, sarrerako parametro kopuru finitu bat ezarri ahal izateko, eta irteeran artefaktu bat jaso nahi dugun OSrako deb/rpm pakete moduan.
Ondorioz, hainbat arazo plantea daitezke:
Ez dago beti Nginx-en azken bertsioa duten paketeak.
Ez dago behar diren moduluak dituen paketerik.
Pakete bat eskuz konpilatzea eta eraikitzea denbora asko eta guztiz aspergarria da.
Ez dago Nginx instantzia hau edo hura nola muntatzen den deskribatzen.
Arazo hauek konpontzeko, tresna baten beharra sortzen da, sarrera gisa zehaztapen bat hartuko lukeen gizakiak irakurtzeko moduko formatuan eta Nginx pakete bat muntatuko luke bertan oinarritutako beharrezko funtzionalitatearekin.
Github-en zabaltasunean aukera egokirik aurkitu ez genuenez, gure tresna propioa sortzea erabaki genuen - nginx-eraikitzailea.
Zehaztapenak
Gure tresnan, zehaztapenaren deskribapen bat sortu nahi izan dugu kode moduan, gero Git biltegi batean sartu ahal izateko. Horretarako, horrelako gauzetarako ezaguna den formatua aukeratu dugu - yaml. Zehaztapen adibidea:
Hemen adierazten dugu Nginx 1.14.2 bertsioarekin deb pakete bat ikusi nahi dugula beharrezko modulu multzoarekin. Moduluak dituen atala hautazkoa da. Horietako bakoitzarentzat ezar dezakezu:
Izena.
Helbidea non eskuratu dezakezun:
Git biltegia. Adarra edo etiketa bat ere zehaztu dezakezu.
Artxiboaren web esteka.
Artxiborako esteka lokala.
Modulu batzuek menpekotasun gehigarriak instalatu behar dituzte, adibidez nginx-auth-ldap-ek libldap2-dev instalatu behar du. Beharrezko mendekotasunak ere zehaztu daitezke modulua deskribatzerakoan.
Ingurumena
Gure tresnan azkar lor dezakezu konpilaziorako, paketeen muntatzeko eta beste software osagarri batzuk instalatutako utilitateekin ingurune bat. Behar duzun guztia duen Docker edukiontzi bat aproposa da hemen (biltegiak dagoeneko baditu Docker fitxategien adibide pare bat ubuntu eta centos-erako).
Zehaztapena egin eta ingurunea prestatu ondoren, gure eraikitzailea abiarazten dugu, aldez aurretik bere menpekotasunak instalatuta:
Hemen berrikuspen-zenbakia hautazkoa da eta bertsioak muntatzeko erabiltzen da. Paketearen metainformazioan idatzita dago, zerbitzarietan eguneratzea erraztuz.
Erregistroetatik gertatzen ari dena kontrolatu dezakezu. Hona hemen puntu nagusien adibide bat:
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'.
Beraz, literalki komando pare batekin ingurunea eta beharrezko Nginx muntaia sortzen dugu, eta paketea scripta abiarazten den direktorioan agertzen da.
Txertatzea
Gure tresna CI/CD prozesuetan ere integra dezakegu. Gaur egun dauden CI sistema askotako edozeinek lagundu dezake horretan, adibidez Teamcity edo Gitlab CI.
Ondorioz, Git biltegian zehaztapena aldatzen den bakoitzean, artefaktuaren eraikuntza automatikoki abiarazten da. Berrikuspen-zenbakia eraikitze-abiarazte-kontagailuari lotuta dago.
Denbora pixka bat gehiagorekin, artefaktua konfigura dezakezu zure tokiko paketeen biltegira, Nexus, Artifactory eta abarretara bidaltzeko.
Abantaila gehigarri bat yaml konfigurazio fitxategia Ansible edo beste konfigurazio sistema automatiko batera konektatu daitekeela da, eta hortik zabaldu nahi dugun bertsio zenbakia eta pakete mota har ditzakegu.
Zer da hurrengoa
Proiektua oraindik ez dago amaituta. Hona hemen zertan ari garen lanean:
Konfiguratzeko aukera zabaltzen dugu, baina, aldi berean, ahalik eta sinpleena mantentzen dugu. Ez dituzu mila parametro definitu nahi bi bakarrik behar badituzu, eta gainerakoak berez egokitzen dira. Honek konpilazio-markak barne hartzen ditu (orain src/config.py barneko konfigurazio fitxategian alda ditzakezu), instalazio-bidea eta abiarazteko erabiltzailea.
Pakete bat automatikoki hainbat artifaktu biltegietara bidaltzeko aukerak gehitzen ari gara.