Co to znamená
Nasazení spustitelného souboru je jeden objekt YAML v sekci nasazení vrstvy, čtený proti kontraktu deployment/v1. majordomus doctor odmítne objekt, který by nemohl fungovat nebo nesmí existovat, se zjištěním FAIL v kategorii deployment, které pojmenuje důvod:
- klíč, který kontrakt nemá, včetně pole vymyšleného pro uložení tokenu;
- verze schématu jiná než ta, kterou tento nástroj čte;
- pole, které uvádí každé nasazení, chybí;
- naslouchací rozhraní, které není ani
loopback, aniall; - port mimo neprivilegovaný rozsah, protože nasazený proces neběží jako root;
- běží víc strojů, než nasazení má;
- zdravotní trasa zapsaná jako URL místo cesty;
- hodnota, která vypadá jako přihlašovací údaj, v poli, které existuje;
- dva objekty nárokující jednu identitu.
init založí sekci s jejím kontraktem a bez objektů, prázdná sekce není nález a platný objekt přidaný jako jeden soubor je přijat a započítán pomocí doctor.
Princip
mj_validate_deployments v lib/deployment.sh je validátor, který deklaruje vendorované pravidlo majordomus.deployment-contract, dispatchovaný z doctor a watch. Zploští každý objekt, porovná jeho klíče s share/allow/deployment.txt (allow-list generovaný ze schématu smlouvy, nikdy ne ručně psaný) a pak kontroluje verzi schématu, povinná pole, rozhraní, rozsah portů, počty strojů, health routy, hodnoty odpovídající známým prefixům přihlašovacích údajů a už viděné identity. Každé porušení je nález FAIL v kategorii deployment s důvodem a příkazem, který ukáže dotčené řádky.
test/cases/84_deployment_contract.sh to dokazuje mutací. Inicializuje repozitář, potvrdí, že prázdná sekce není nález, přidá jedno platné nasazení a potvrdí, že doctor je přijme a započítá, pak na tento objekt postupně aplikuje každé výše uvedené porušení a vyžaduje, aby je doctor odmítlo s pojmenovaným důvodem. Kontroluje také, že allow-list je projekcí schématu a že obnovený objekt je znovu přijat, takže o každém odmítnutí je známo, že pochází z mutace, a ne z tvaru fixture.
Jak to vidět
majordomus doctor # FAIL deployment <object> — <reason>
bash test/run.sh 84_deployment_contract # the refusals, one mutation at a time
cat share/allow/deployment.txt # the keys the contract allowsCo nepokrývá
Případ páruje každé odmítnutí podle jeho důvodu, ne podle objektu, který jmenuje. Nález, který jmenoval špatný soubor nebo žádný, by jím stále prošel, takže to, který objekt odmítnutí jmenuje, není součástí této záruky. Nekontroluje stavový kód, který doctor při odmítnutí vrací, a neukazuje, že přijatý objekt dosáhne indexu nebo výpisu objektů.
Toto je ta polovina smlouvy, která se rozhoduje bez toolchainu Rustu. Zda nasazení funguje právě proti tomuto repozitáři, zda jeho health trasy jsou trasy, které schopnost registruje, a zda jeho vstupy balíčku a buildu existují v pracovním prostoru, rozhoduje apps/majordomus-cli/src/deploy/mod.rs a dokazují testy onoho modulu, ne tento případ.
Kontrola přihlašovacích údajů porovnává prefixy známých formátů tokenů. Tajemství ve formátu, který nezná, zapsané do pole, které kontrakt dovoluje, se jako takové nepozná.
Nedokazuje, že vygenerovaná definice kontejneru a její ignore soubor odpovídají objektu; to drží majordomus generate --check a dokazuje to jeho vlastní případ. Nic tu nekontaktuje hostingového poskytovatele ani nedokazuje, že se nasazení, jakmile je přijato, spustí.
Proč existuje
Nasazení, které nemůže fungovat, má stát selhávající test, ne neúspěšný rollout, a přihlašovací údaj nesmí nikdy skončit v souboru, který nese každý klon repozitáře. Obě selhání je levné najít, dokud se objekt píše, a drahé po nasazení, takže smlouva je uzavřená a kontroluje se lokálně a každé odmítnutí jmenuje svůj důvod, takže oprava je jedna úprava, ne vyšetřování.