Sut rydych chi’n gadael i fodel helpu gyda rhyddhad heb roi iddo’r liferi na ellir eu tynnu’n ôl? Mae tag a wthiwyd yn cael ei nôl gan ddefnyddiwr, ac mae wedi mynd am byth. Mae ffeil grwydr a ysgubwyd i mewn i ymrwymiad rhyddhau yn cael ei chyhoeddi cyn i neb ei darllen. Mae adrelease yn cadw’r liferi hynny o fewn cod Swift deterministig ac yn rhoi dim ond dwy farn i’r model eu ffurfio. Y peiriant sy’n penderfynu beth sy’n digwydd ac ym mha drefn. Mae’r model yn penderfynu dau beth, yn eu dychwelyd fel gwerthoedd, ac nid yw byth yn yr ystafell pan fydd git yn rhedeg.
Gwaith mecanyddol yn bennaf yw rhyddhau un pecyn Swift ar draws graff o becynnau sy’n dibynnu arno, gyda dau bwynt lle mae angen barn go iawn: pa mor fawr yw’r cynnydd fersiwn hwn, a sut i drwsio’r cod dibynnol y mae’r cynnydd newydd ei dorri. Peiriant rhyddhau wedi’i adeiladu o amgylch y rhaniad hwnnw yw adrelease. Mae craidd deterministig yn berchen ar drefn ac amseriad pob gweithred na ellir ei dadwneud (ymrwymo, tagio, gwthio, ac agor y cais tynnu), ynghyd â’r datrys fersiwn sy’n eu bwydo, ac mae’r dyluniad yn derbyn model iaith ar y ddau bwynt barn hynny yn union a dim un man arall. Mae’r model yn cynnig; y peiriant sy’n penderfynu. Data plaen y mae’r model yn ei ddychwelyd, byth gorchymyn, felly ni all dagio, gwthio, nac ymrwymo hyd yn oed ar ddamwain. Mae’r darn hwn yn onest am y pris. Dim ond os ydych chi wir yn rhedeg graff pecynnau modiwlaidd sy’n newid yn aml y mae’r budd yn glanio, ac yn y fersiwn gyntaf a ryddhawyd mae’r cam trwsio dibynnol yn ildio yn hytrach na thrwsio, felly mae toriad mawr yn atal y rhaeadr ar gyfer person yn hytrach na’i drwsio.
Dechreuodd y dyluniad gyda methiant. Ymrwymodd awtomeiddiad cyfochrog a oedd yn dosbarthu bachyn lint i 13 ystorfa fynegai budr i mewn i gais tynnu, oherwydd bod git commit yn ymrwymo’r mynegai cyfan, nid dim ond yr hyn a lwyfannwyd. Hylendid mecanyddol wedi mynd o chwith oedd hynny, nid camgymeriad rhesymu, ac mae’r gwahaniaeth yn penderfynu’r bensaernïaeth gyfan: rhaid i’r rhannau sy’n dueddol o fethu fod yn god go iawn gyda haeriadau, nid yn rhyddiaith yr ymddiriedir mewn model i’w dilyn.
Mae rhyddhau pecyn sylfaenol â llaw yn dilyn yr un siâp, ar raddfa fwy. Rydych yn cerdded y rhaeadr yn nhrefn y dibyniaethau, yn golygu pob maniffest, yn datrys, yn profi, yn tagio, ac yn agor cais tynnu ar gyfer pob defnyddiwr, gan ddal y graff yn eich pen wrth fynd. Un siâp cyffredin yw diemwnt: pecyn sy’n dibynnu ar ddau arall, a phob un o’r rheini’n dibynnu ar bedwerydd pecyn a rennir. Cynyddwch y pecyn a rennir hwnnw ac ni chaiff yr un ar frig y diemwnt dagio nes bod y ddau becyn oddi tano wedi setlo yn gyntaf. Mae cylch gwastad fesul ystorfa yn cael yr union achos hwn yn anghywir.
Mae dwy ffordd gonfensiynol allan, ac mae’r ddwy’n gollwng. Y gyntaf yw “byddwch yn ofalus”: rhestr wirio y mae dyn, neu fodel, yn ei dilyn gam wrth gam. Un llithriad ac fe gyhoeddir rhyddhad toredig neu budr. Yr ail yw trosglwyddo’r gwaith cyfan i asiant sydd â chragen. Bellach mae model yn dal git, tag, a push, ac mae’r liferi na ellir eu tynnu’n ôl un gorchymyn hyderus-ond-anghywir i ffwrdd o gael eu tynnu. Nid yw’r naill opsiwn na’r llall yn trin y rhannau peryglus fel rhai peryglus.
Felly mae’r gwaith yn rhannu’n lân. Mae dau beth yn farn go iawn na all sgript ei gwneud: beth ddylai’r lefel semver fod, a sut i drwsio cod dibynnol yn erbyn API sydd wedi newid. Mecanwaith yw popeth arall, ac mae hwnnw’n perthyn mewn cod gyda chodau ymadael go iawn a haeriadau go iawn. Mae’r darn hwn yn ymwneud â thynnu’r llinell honno a’i gorfodi’n strwythurol, yr un safiad y mae’r stiwdio’n ei gymryd yn ei hastudiaethau achos peirianneg eraill, gan gynnwys y gyfres dolennu dwfn: rhowch y clyfrwch lle mae’n brofadwy, a gwnewch y methiannau peryglus yn amhosibl yn hytrach nag wedi’u hosgoi’n ofalus.
Mewn un rhediad, rhyddhaodd adrelease dri phecyn o raff a reolir y stiwdio. Cafodd y tri eu tagio o fewn tua chan eiliad, un ar ôl y llall yn nhrefn y dibyniaethau; unwyd eu ceisiadau tynnu rhyddhau ychydig funudau’n ddiweddarach.
Llofnod cais tynnu’r peiriant ei hun yw’r enwi cangen-a-theitl release/<package>-<version>, sy’n wahanol i ymrwymiad chore(release): cut X a ysgrifennwyd â llaw, felly gellir adnabod pob rhyddhad fel gwaith y peiriant yn hytrach na’i gymryd ar ymddiriedaeth.
Nid y rhediad byw yw’r unig wiriad. Mae prawf integreiddio hermetig yn gyrru’r gweithredwr rhaeadr go iawn dros gadwyn ddibyniaeth dau becyn gyda tharddleoedd git file://, gan ffugio dim ond yr agorwr cais tynnu a’r cynlluniwr fersiwn, felly caiff y gwarantau trefn a lledaenu eu profi ar bob adeiladwaith, nid ar ddiwrnod rhyddhau yn unig.
Mae un manylyn gonest yn perthyn yma yn hytrach na’i gladdu’n ddiweddarach. Yn yr un rhediad hwnnw, bu’n rhaid rhyddhau dau becyn arall â llaw, oherwydd bod y gwiriwr yn methu ar becynnau nad ydynt yn cynnwys profion. Mae’r cyfyngiad hwnnw wedi’i drwsio ers hynny, ac mae’r adran gost isod yn enwi’r hyn a gostiodd.
Mae adrelease wedi’i adeiladu o dri tharged, gyda phedwerydd yn dal y profion, a’r rhaniad rhwng y tri yw’r holl bwynt.
Nid yw’r peiriant, AdReleaseKit, yn mewnforio dim o gwbl. Dim Foundation, dim Process, dim git. Mae chwilio am ddatganiadau mewnforio ar draws y modiwl yn dychwelyd dim un canlyniad. Cydlynu pur ydyw, ac am na all alw allan i gragen, ni all gyflawni gweithred na ellir ei dadwneud hyd yn oed pe bai byg yn dweud wrtho am wneud.
Yr haen I/O, AdReleaseLive, yw’r unig le y mae isbroses yn rhedeg, trwy un cyntefigyn (Subprocess.run). Mae pob berf git, pob galwad swift package, a’r alwad gh yn twndisio drwyddo. Yma y digwydd tagio, yn LiveGitGateway, ac yma yn unig.
Mae offeryn llinell orchymyn adrelease tenau yn eistedd ar ben y ddau.
Mae’r peiriant yn adeiladu’r graff dibyniaethau mewnol, yn canfod y set yr effeithir arni gyda thramwy cyrraeddadwyedd gwrthdro lled-yn-gyntaf a hedir gan y pecynnau a newidiwyd (AffectedSet), yn ei threfnu’n dopolegol, ac yn gyrru pob nod trwy drefn sefydlog (NodeReleaseSequencer): darparu coeden waith lân o origin/main, haeru ei bod yn lân, llwyfannu a lledaenu, gwirio, ymrwymo gyda set benodol o lwybrau, tagio, gwthio’r tag, gwthio’r gangen, agor y cais tynnu. Mae’r drefn honno’n sefydlog ac yn atomig o fewn un alwad. Mae’r peiriant yn berchen ar y drefn ac ar y gwarant nad oes dim pecyn dibynnol yn cael ei dagio allan o’i dro; y pwyntiau cyswllt byw sy’n berchen ar y git go iawn.
Mae’r gwarchodwr mynegai budr, y methiant a ddechreuodd hyn i gyd, yn byw yma fel rhagamod rhwystrol yn hytrach nag ôl-ystyriaeth. Caiff coeden waith ffres ei haeru’n lân cyn unrhyw olygu, ac mae’r ymrwymiad yn llwyfannu set benodol o lwybrau y mae’n rhaid i’w set a lwyfannwyd fod yn union hafal i’r set arfaethedig, neu mae’n terfynu (SafeCommitter, CommitGuard). Byddai’r ffeil grwydr a ysgubwyd i mewn i gais tynnu y tro cyntaf bellach yn ymddangos yn y set a lwyfannwyd, yn methu’r haeriad, ac yn rhwystro’r ymrwymiad.
Yna’r model. Mae’r bensaernïaeth yn ei dderbyn ar union ddau bwynt cyswllt, y ddau’n brotocolau Swift pur sy’n cymryd ac yn dychwelyd gwerthoedd data. Yn y fersiwn gyntaf a ryddhawyd mae un pwynt wedi’i wifro i fodel byw a’r llall i fonyn deterministig:
SemverDecider), y pwynt cyswllt byw heddiw. Mae’r model yn cynnig lefel ac mae’r peiriant yn gosod llawr iddi. Y lefel derfynol yw max(llawr deterministig, lefel a gynigiwyd), lle mae toriad API a adroddwyd yn gosod y llawr i major (SemverModel, SemverFloor). Gall y model godi uwchlaw’r llawr ond ni all byth suddo oddi tano, felly ni all newid sy’n torri gael ei ryddhau fel patch ar air model gwael.CompileRepairer), yr un cam y mae’r cod yn ei nodi fel yr unig gam model. Ar ôl i wiriad ar ôl y cynnydd fethu, dyma’r pwynt cyswllt lle byddai model yn cynnig golygiadau union-linyn i’r peiriant eu cymhwyso a’u hailwirio. Yn y fersiwn gyntaf a ryddhawyd, bonyn sy’n ildio a geir yn hytrach na model byw (mae LiveRepair yn diofyn i StubCompileRepairer), felly heddiw nid yw toriad yn cael ei drwsio. Mae’n atal y rhaeadr ac yn trosglwyddo’n ôl i berson. Mae’r pwynt cyswllt yn bodoli; mae v1 yn ei wifro i ddirprwy, nid i fodel. Mae’r adran gost yn dweud beth mae hynny’n ei gostio.Data yn unig y mae’r ddau bwynt cyswllt yn ei ddychwelyd, felly ni roddir GitGateway nac isbroses i’r model byth. Mae galw git yn amhosibl o’r lle y mae’r model yn eistedd. Fel mesur ychwanegol, mae’r gyrrwr hefyd yn cyfarwyddo’r asiant i beidio byth â theipio git ei hun, ond mae’r cyfarwyddyd hwnnw’n ddi-rym, oherwydd ni roddir y gallu yn y lle cyntaf. Mae’r alwad wirioneddol allan i fodel iaith yn byw o fewn sgil y gyrrwr, nid y peiriant; mae’r peiriant yn darparu’r protocolau ynghyd â dirprwyon deterministig.
Mae’r un strwythur yn penderfynu beth sy’n digwydd pan geisir trwsiad. Dim ond pan fydd ailwiriad yn pasio y mae’r cylch yn dychwelyd “wedi’i drwsio”. Mae unrhyw ganlyniad arall yn adfer y goeden waith ac yn dychwelyd cyn y cam tagio, ac yna mae’r gweithredwr yn stopio ac nid yw’n ceisio dim yn ddibynnol. Ni all y model berswadio’r peiriant i dagio pecyn nad yw’n crynhoi mwyach.
Mae’r peiriant yn berchen ar bob berf sy’n newid y byd. Mae’r model yn berchen ar ddwy farn, ac yn eu dychwelyd fel data.
Nid oes dim yma’n rhad ac am ddim. Daw’r diogelwch o symud barn i ddau bwynt cyswllt cul a’i gwrthod ym mhob man arall, ac mae’n werth bod yn fanwl gywir ynghylch ble mae’r bil yn glanio.
Mae’r budd yn amodol. Mae’r gwerth yn gymesur â pha mor fodiwlaidd a pha mor aml y mae graff y pecynnau’n newid. Rhedwch graff gwirioneddol fodiwlaidd sy’n cael ei ryddhau’n aml ac mae cost rhyddhad a rennir yn disgyn bron i ddim. Gadewch y pecynnau’n llonydd gan mwyaf ac yswiriant wedi’i adeiladu’n dda yn segura yw adrelease.
Yn y fersiwn gyntaf a ryddhawyd mae’r cam trwsio’n ildio yn hytrach na thrwsio. Bonyn yw’r trwsiwr crynhoad dibynnol, felly mae cynnydd major sy’n torri defnyddiwr yn atal y rhaeadr ac yn trosglwyddo’n ôl i berson. Mae’r gwarant atal-heb-dagio yn real ac wedi’i brofi yn y cod. Mae’r stori trwsio-a-pharhau wedi’i dylunio ond heb ei gwifro eto.
Dim ond mor finiog â’r adroddiad toriad y mae’n gorwedd arno y mae’r llawr semver. Caiff y llawr ei godi gan yr hyn y mae swift package diagnose-api-breaking-changes yn ei adrodd; nid yw rhediad amhendant yn ei godi, felly gall toriad y mae’r offeryn yn ei fethu gael ei ryddhau o hyd fel patch. Mae’r gwarant yn dal yn llym ar gyfer toriad a adroddwyd.
Mae “pob defnyddiwr dibynnol” yn golygu pob defnyddiwr yn y graff a reolir. Mae’r tramwy set-yr-effeithir-arni yn gyflawn dros y pecynnau a enwir yn y ffurfweddiad. Mae defnyddiwr y tu allan i’r set honno’n anweledig iddo, felly mae cadw’r ffurfweddiad yn onest wrth i’r graff dyfu yn dasg sefydlog ynddi’i hun.
Roedd angen dau ryddhad â llaw ar y rhediad go iawn cyntaf o hyd. Methodd pecynnau heb brofion y gwiriwr a chawsant eu rhyddhau â llaw. Mae’r cyfyngiad penodol hwnnw wedi’i drwsio bellach, ond mae’n fesur teg o faint o hyn sydd wedi setlo a faint sy’n dal i galedu.
Nid yr offeryn rhyddhau fu’r rhan ddiddorol erioed. Y siâp ydyw. Mae craidd deterministig sy’n berchen ar bob gweithred na ellir ei dadwneud, gyda model yn cael ei wahodd i mewn ar union y pwyntiau lle mae gwir angen barn ac yn cael ei gadw allan ym mhob man arall, yn batrwm sy’n ailddefnyddio’n dda ymhell y tu hwnt i dorri fersiynau pecynnau. Y peiriant rhyddhau yn syml yw lle’r oedd ei angen ar y stiwdio gyntaf, a lle’r oedd wedi rhedeg yn amlwg.
Mae’r safiad hwnnw’n rhedeg trwy ysgrifennu peirianneg arall y stiwdio hefyd. Mae’r gyfres dolennu dwfn yn gwneud yr un symudiad ar broblem wahanol: cadwch y penderfyniad clyfar yn bur ac yn brofadwy, a gadewch i’r strwythur, nid gofal, ddiystyru’r canlyniad gwael. Mae’r syniad a rennir yn ddigon plaen i’w ddweud unwaith. Rhowch y model lle mae’r farn. Cadwch ef i ffwrdd o’r liferi na ellir eu tynnu’n ôl.