Mikä on toistettava build?
Deterministinen rakennus tai toistettavissa oleva rakenne ovat hieman erilaisia, mutta ne voidaan ymmärtää samana asiana kuin tässä artikkelissa.
Toistettavat rakennelmat viittaavatUseat rakennusprosessin suoritukset samalla syötteellä ja rakennusympäristöllä voivat tuottaa täsmälleen samat tulokset。 Tämä teknologia on tärkeä ohjelmistokehityksessä, jakelussa ja tietoturvan validoinnissa.
Rakennelma on toistettavissa, jos se tuottaa täsmälleen saman ulostulon riippumatta siitä, milloin ja missä se ajetaan. Riippumatta siitä, millä tietokoneella käytät, mihin aikaan päivästä ja mitä ulkoisia palveluita käytät verkon kautta, toistettavat versiot tuottavat saman tavu kerrallaan tuloksen. Tämä on erinomaista sekä kehitykselle (koska toistettavat versiot on helppo jakaa eri kehittäjälaitteiden välillä) että tuotannossa (koska on helppo varmistaa, ettei toistettavien versioiden tuloksia ole manipuloitu – aja vain versio uudelleen omalla koneellasi ja tarkista, että tulokset ovat johdonmukaisia!). ovat erittäin hyödyllisiä.
Toistettavien rakenteiden kolme pilaria
Pilari 1: Toistuvat rakennelmat
Build-toistettavuus tarkoittaa sitä, mitä tapahtuu itse rakennuskoneelle. Oletetaan, että build-syötteemme ovat saatavilla eikä mikään muutu ympäröivään maailmaan, tuottaako buildimme saman tuloksen, kun se toistuu?
Deterministinen asennussuunnitelma
Ensimmäinen, yksinkertaisin ja ilmeisin vaatimus toistettavassa rakennuksessa on deterministinen riippuvuusasennussuunnitelma.
Useimmissa kielissä se on yhtä yksinkertaista kuin lukitun tiedoston kirjaaminen. Nykyaikaiset rakennustyökalut mahdollistavat usein projektien ilmaista suorat riippuvuusvaatimukset rajoitteina ja sitten ratkaista nämä rajoitteet luodakseen asennussuunnitelman (listan riippuvuusnimistä ja asennettavista versiopareista). Monet näistä työkaluista tuottavat myös lukitustiedostoja sarjallistettuja asennussuunnitelmia varten. Kehittäjät voivat lähettää nämä lukitustiedostot versionhallintaan, jotta tulevat versiot käyttävät samoja riippuvuusnimiä ja versioita.
Huomaa, että deterministinen tarvitsemme myös riippuvuusbuildissa (ei pelkästään version valinnassa), eikä deterministinen asennussuunnitelma mahdollista sitä!
Deterministinen konstruktio
Kun tiedämme, mitä rakentaa, itse rakennuksemme (mukaan lukien oma koodimme ja riippuvuuskoodi) täytyy itse asiassa olla deterministinen.
Tämä ei välttämättä ole ongelma projekteissa, joissa ei ole käännösvaihetta! Esimerkiksi Node-projekti, jossa on kaikki riippuvuudet, on puhdasta JavaScriptiä, eikä tehokkaan deterministisyyden saavuttamiseksi vaadita lisätyötä.
Projekteissa, jotka sisältävät käännös- tai käännösvaiheita (lähteestä lähteeseen -käännös), determinismin varmistaminen on ylivoimaisesti vaikein osa toistettavan rakennelman rakentamista. Käännösprosessi voi implisiittisesti tuoda ei-determinismiä monin tavoin, kuten:
- Turing-täydelliset ohjelmarakennusskriptit voivat muuttaa käännettyä tulosta vapaasti.
- Asennuksen jälkeiset skriptit, jotka perustuvat suoritettaviin tiedostojärjestelmän hakuihin tai verkkokutsuihin.
- C-sitominen järjestelmään asennettuun pakettiin, jossa eri järjestelmissä eri otsikoilla sidonnat voivat tuottaa erilaisia ulostuloja.
- Vaiheet tiedoston rakentamiseen, joka lukee versionhallinnan ulkopuolella.
- Rakenna vaiheita aikaleimojen luomiseksi käyttäen järjestelmäaikaa.
- Vaiheet riippuvuuksien rakentamiseksi, joita ei ole ilmaistu verkkolatausasennussuunnitelmassa (esimerkiksi NPM-riippuvuuden lataaminen GitHubista välimuistissa olevaan binääribuildiin, joka on C-sidottu).
- Muuta käyttäytymistä nykyisen ympäristömuuttujan perusteella, mutta älä lähetä buildia ympäristömuuttujan konfiguraatiolla.
Kaikki nämä toiminnot eivät välttämättä aiheuta epävarmuutta, kun ne on asetettu oikein, mutta rakennusprosessin asianmukainen konfigurointi voi olla monimutkaista ja vaikeaa. Voit esimerkiksi lukea tämän blogikirjoituksen epävarmuudesta Chromium-rakennelmissa. Monia näistä ongelmista voidaan lieventää hallitsemalla paikallista rakennusympäristöä, mistä käsittelemme seuraavassa osiossa.
Pilari 2: Muuttumaton ympäristö
Vaikka buildit olisivat toistettavia, meidän täytyy varmistaa, etteivät build-syötteet muutu. Usein tämä tarkoittaa, että haluamme varmistaa, että rakennamme muuttumattoman tilannekuvan varaan ympäristöstämme.
Muuttumaton paikallinen ympäristö
Kuten aiemmin keskustelimme, yleinen rakennusepävarmuuden lähde on "riippuvuuksiin", joita rakennustyökalu ei sisällä. C-rajaiset järjestelmäkirjastot ovat yleisimpiä esimerkkejä, mutta myös muut paikalliset ympäristötekijät, kuten ympäristömuuttujien asetukset ja tiedostot, jotka eivät kuulu versionhallintaan, voivat vaikuttaa buildiin.
Helppo tapa lieventää tätä ongelmaa on ajaa versio tunnetussa, muuttumattomassa kontissa. Esimerkiksi konttiajonaika, kuten Docker, auttaa varmistamaan, että kaikki käyttävät samoja järjestelmäriippuvuuksia, samoja ympäristömuuttujia ja toimivat samalla tiedostojärjestelmällä. Lisäksi on helppo varmistaa, että säiliön sisältö vastaa tunnettua hyvää rakennekonttia, ja tarvittaessa säiliö voidaan helposti poistaa kokonaan tunnetusta hyvästä kuvasta ja luoda uudelleen.
Huomaa, että olemme hyvin selkeitä tunnetuista säiliöistä tai tunnetuista konttikuvista. Ei riitä, että lähetät vain Docker-tiedoston! Miksi? Koska Dockerfile itsessään ei kuvaa täysin toistettavissa olevaa rakennusprosessia Docker-kuville, koska ne eivät toimi muuttumattomassa globaalissa ympäristössä.
Muuttumaton globaali ympäristö
Rakennusjärjestelmät ovat usein vuorovaikutuksessa ulkoisten palveluiden kanssa suorittaakseen tehtäviä, kuten versioiden resoluutioita ja riippuvuuksien latauksia. Mutta ulkoiset palvelut vaihtuvat usein.
Apt install nodejsin ajaminen tänään antaa erilaiset tulokset kuin viime vuonna, ja todennäköisesti ensi vuonnakin saat erilaiset tulokset. Siksi Dockerfiles ei itse pysty kuvailemaan toistettavia versioita – saman Dockerfilen ajaminen eri ajankohdissa tuottaa erilaisia build-tuloksia!
Yksinkertainen suojauskeino on konfiguroida rakennelma aina kun mahdollista, määrittäen tarkka versio (mieluiten myös tarkka sisältötiiviste), jotta tulevat versiot käyttävät samaa versiota kuin nykyinen versio. Mutta ulkoiset palvelut voivat myös muuttaa käyttäytymistään odottamattomasti – aidosti pessimistinen toistettavissa oleva versio pyörittää sisäistä kuvaa mahdollisimman monilla verkkoresursseillaan.
Pilari 3: Resurssien saatavuus
Oletetaan, että rakenteemme on toistettavissa eikä maailma jalkojemme alla muutu. Tarvitsemme nyt vain pääsyn rakennussyötteeseen. Se vaikuttaa yksinkertaiselta, eikö? Kaivo......
Rekisteri joskus epäonnistuu
Useimmat Node-kehittäjät ovat kokeneet ainakin yhden NPM-katkon, jonka aikana rakennusputki ilman välimuistia tai NPM-pakettien peilausta häiriintyy. Monet Node-kehittäjät ovat myös kokeneet vasemman padin ja väärennösten poistoja, jotka ovat vakavasti vahingoittaneet NPM-ekosysteemiä ja käytännössä johtaneet häiriöön.
Ainoa luotettava tapa lieventää tällaisia rakennuskatkoja on ajaa oma pakettirekisterin peili. Kun ulkoiset palvelut eivät ole saatavilla, kuva voi pysyä verkossa; Kun virallinen rekisteri poistaa vanhan paketin, peili voi jatkaa palveluiden tarjoamista. Sama periaate pätee muihin etäpalveluihin: ellei käytä omaa imagoasi, rakennusputken saatavuus on verrattavissa vain sen palveluiden saatavuuteen.
Palvelukuvan käyttäminen on aina herkkä kompromissi. Toisaalta rekistereillä, kuten NPM:llä, on omat insinööri- ja operatiiviset tiimit, joilla on asiantuntemusta pitää nämä järjestelmät verkossa. Toisaalta on paljon helpompaa ajaa pieni kuva pienelle joukolle riippuvuuksia kuin ajaa kaikkia NPM-kuvia. Sinun tulisi tehdä peilaavia päätöksiä kunkin palvelun yksityiskohtien perusteella, ottaen huomioon historiallisten ulkoisten palveluiden luotettavuuden sekä tiimisi rakennuskäytettävyyden ja henkilöstötarpeen.
Toimittajat varmistavat maksimaalisen saatavuuden
Helppo tapa varmistaa projektisi riippuvuuksien maksimaalinen saatavuus on lisätä ne toimittajallesi. Useimmat pakettienhallintaohjelmat tukevat jonkinlaista "vendoringia", mikä tarkoittaa, että ulkoisten palveluiden latausten sijaan tallennamme riippuvuuslähdekoodin versionhallintaan, joka toimii rinnakkain lähdekoodimme kanssa. Esimerkiksi Nodessa tämä voi näyttää siltä, että sitoudutaan node_modules lähdekoodin hallintaan.
Vaikka tämä ratkaisu ei ole täydellinen (riippuen siitä, miten toimittajasi ja projektisi on asetettu, mikä voi rasittaa versionhallintaa), se on usein yksinkertaisin ja helpoin ratkaisu maksimaaliseen saatavuuteen.
Viittaus:
Hyperlinkin kirjautuminen on näkyvissä.
Hyperlinkin kirjautuminen on näkyvissä. |