Assemblamu u nostru Nginx cù un coppiu di cumandamenti
Hello!
Mi chjamu Sergey, travagliu cum'è un ingegnere di l'infrastruttura in a squadra API di a piattaforma tinkoff.ru.
In questu articulu vi parleraghju di i prublemi chì a nostra squadra hà affruntatu quandu preparava balancers basatu nantu Nginx per vari prughjetti. Vi cuntaraghju ancu di u strumentu chì m'hà permessu di superà a maiò parte di elli.
Nginx hè un servitore proxy multifunzionale è attivamente in sviluppu. Hà un gran numaru di moduli, questu ùn hè micca una lista cumpleta. Ogni prughjettu impone certe esigenze nantu à a funziunalità di u balancer è a versione di Nginx (per esempiu, a presenza di http/2 è grpc proxy), è a cumpusizioni di i so moduli.
Vuleriamu vede una versione fresca cù u settore necessariu di moduli, in esecuzione sottu una distribuzione Linux specifica. In u nostru casu, questi sò sistemi basati in deb è rpm. L'opzione cù cuntenituri ùn hè micca cunsideratu in questu articulu.
Vulemu cambià rapidamente a funziunalità di i nostri balancers. È quì hè subitu a quistione: cumu si pò ottene questu mentre spende quant'è pocu risorse pussibule? Saria ancu megliu di stallà u prucessu in modu chì pudemu specificà un nùmeru finitu di parametri di input, è à l'output riceve un artefattu in forma di un pacchettu deb / rpm per u SO desideratu.
In u risultatu, una quantità di prublemi ponu esse formulati:
Ùn ci sò micca sempre pacchetti cù l'ultima versione di Nginx.
Ùn ci sò micca pacchetti cù i moduli necessarii.
Cumpilà è custruisce un pacchettu manualmente richiede tempu è ghjustu fastidiosu.
Ùn ci hè micca descrizzione di cumu questu o quellu esempiu Nginx hè assemblatu.
Per risolve questi prublemi, hè bisognu di un strumentu chì piglià cum'è input una specificazione in un formatu leggibile da l'omu è assemble un pacchettu Nginx cù e funziunalità necessariu basatu annantu à questu.
Ùn truvamu micca una opzione adatta per noi nantu à l'immensità di Github, avemu decisu di creà u nostru propiu strumentu - nginx-builder.
Quaternu
In u nostru strumentu, avemu vulutu creà una descrizzione di l'specificazione in forma di codice, chì pò esse messu in un repository Git. Per fà questu, avemu sceltu u formatu familiar per tali cose - yaml. Esempiu di specificazione:
Quì avemu indicatu chì vulemu vede un pacchettu deb cù a versione Nginx 1.14.2 cù u settore di moduli necessariu. A seccione cù i moduli hè opzionale. Per ognunu di elli pudete stabilisce:
Nome.
Indirizzu induve pudete ottene:
Repository Git. Pudete ancu specificà un ramu o tag.
Archive web link.
Link locale à l'archiviu.
Certi moduli necessitanu dipendenze supplementari per esse installati, per esempiu nginx-auth-ldap richiede libldap2-dev installatu. I dependenzii necessarii ponu ancu esse specificati quandu descrive u modulu.
Ambiente
In u nostru strumentu pudete ottene rapidamente un ambiente cù utilità installate per a compilazione, l'assemblea di pacchetti è altri software ausiliari. Un containeru Docker cù tuttu ciò chì avete bisognu hè ideale quì (u repository hà digià un paru di esempi di schedari Docker per ubuntu è centos).
Dopu chì a specificazione hè stata elaborata è l'ambiente hè preparatu, lanciamu u nostru costruttore, avè installatu prima e so dipendenze:
U numeru di rivisione quì hè opzionale è hè utilizatu per l'assemblee di versione. Hè scrittu in a meta infurmazione di u pacchettu, facendu faciule d'aghjurnà in i servitori.
Da i logs pudete monitorà ciò chì succede. Eccu un esempiu di i punti principali:
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'.
Allora, cù solu un paru di cumandamenti, creemu l'ambiente è l'assemblea Nginx necessaria, è u pacchettu appare in u cartulare da induve u script hè lanciatu.
Incrustà
Pudemu ancu integrà u nostru strumentu in i prucessi CI / CD. Qualchese di i tanti sistemi CI esistenti oghje pò aiutà cun questu, per esempiu Teamcity o Gitlab CI.
In u risultatu, ogni volta chì a specificazione cambia in u repository Git, a custruzione di l'artefattu hè automaticamente lanciata. U numeru di rivisione hè ligatu à u contatore di lanciamentu di custruzzione.
Cù un pocu di più tempu, pudete cunfigurà l'artefattu per esse mandatu à u vostru pacchettu lucale, Nexus, Artifactory, etc.
Un vantaghju supplementu hè chì u schedariu di cunfigurazione yaml pò esse cunnessu à Ansible o à un altru sistema di cunfigurazione automatica, è da quì pudemu piglià u numeru di versione è u tipu di pacchettu chì vulemu implementà.
Chì vene
U prugettu ùn hè ancu finitu. Eccu ciò chì avemu travagliatu avà:
Ampliemu a pussibilità di cunfigurazione, ma à u stessu tempu mantene u più simplice pussibule. Ùn vulete micca definisce mille paràmetri s'ellu avete bisognu di dui solu, è u restu si mette in modu predeterminatu. Questu include bandieri di compilazione (ora pudete cambià in u schedariu di cunfigurazione internu src/config.py), a strada di installazione è l'utilizatore di lanciamentu.
Avemu aghjustatu opzioni per mandà automaticamente un pacchettu à diversi repositori di artefatti.