Infrastruktuuri testimine koodina Pulumi abil. Osa 2

Tere kĂ”igile. TĂ€na jagame teiega artikli viimast osa „Infrastruktuuri testimine koodina Pulumi abil“, mille tĂ”lge on ette valmistatud spetsiaalselt kursuse tudengite jaoks «DevOps praktikad ja tööriistad».

Infrastruktuuri testimine koodina Pulumi abil. Osa 2

Deployimise testimine

KĂ€ideldud testimisstiil on tĂ”hus lĂ€henemine, mis vĂ”imaldab meil teostada valge kasti testimist, et kontrollida meie infrastruktuurikoodi toimimist. Siiski piirab see veidi seda, mida saame kontrollida. Testid toimuvad Pulumi loodud in-memory deployimise plaani alusel enne tegelikku deployimist, mistĂ”ttu ei saa ise deployimist testida. Selliste juhtumite jaoks on Pulumis integreerimise testimise raamistiku sĂŒsteem. Need kaks lĂ€henemist toimivad suurepĂ€raselt koos!

Pulumi integreerimise testimise raamistiku on kirjutatud Go-s ja just selle abil testime suure osa meie sisekoodist. Kui varem kĂ€sitletud modulaarne testimine oli rohkem nagu valge kasti testimine, siis integreerimise testimine on must kasti testimine. (On ka vĂ”imalusi pĂ”hjalikuks sisetestimiseks.) See raamistik loodi selleks, et vĂ”tta terve Pulumi programm ja teostada selle suhtes erinevaid elutsĂŒkli toiminguid, nagu nĂ€iteks uue steigi deployimine nullist, selle uuendamine variatsioonidega ja eemaldamine, vĂ”imalikult mitu korda. KĂ€itame neid regulaarselt (nĂ€iteks öösel) ja stressitestidena.

(Me töötame selle nimel, et sarnased integreerimise testimise vÔimalused oleksid olemas lÀhtekoodis. Saate kasutada Go integreerimise testimise raamistiku sÔltumatult sellest, millises keeles on teie Pulumi programm kirjutatud).

Selle raamistiku abil programmi kÀivitades vÔite kontrollida jÀrgmist:

  • Teie projekti kood on sĂŒntaktiliselt korrektne ja töötab vigadeta.
  • Steigi ja saladuste konfiguratsiooniseaded toimivad ja tĂ”lgendatakse Ă”igesti.
  • Teie projekt suudab edukalt deployida valitud pilveteenuse pakkuja juures.
  • Teie projekt suudab edukalt uuendada algsest olekust N teise olekuni.
  • Teie projekt saab edukalt hĂ€vitada ja eemaldada oma pilveteenuse pakkujast.

Nagu peagi nÀeme, saab seda raamistiku kasutada ka runtime valideerimiseks.

Lihtne integreerimistest

Et nÀha, kuidas see töötab, vaatame reposiitiumi pulumi/examples, kuna meie Pulumi meeskond ja kogukond kasutavad seda enda pull-requestide, commit'ide ja öiste ehituste testimiseks.

Allpool on meie nÀite lihtsustatud test, mis teeb S3 bucket'i ja mÔnede teiste objektide varustamise:

example_test.go:

package test
 
import (
    "os"
    "path"
    "testing"
 
    "github.com/pulumi/pulumi/pkg/testing/integration"
)
 
func TestExamples(t *testing.T) {
    awsRegion := os.Getenv("AWS_REGION")
    if awsRegion == "" {
        awsRegion = "us-west-1"
    }
    cwd, _ := os.Getwd()
    integration.ProgramTest(t, &integration.ProgramTestOptions{
        Quick:       true,
        SkipRefresh: true,
        Dir:         path.Join(cwd, "..", "..", "aws-js-s3-folder"),
        Config: map[string]string{
            "aws:region": awsRegion,
        },
    })
}

See test lĂ€bib aluslikku elutsĂŒklit, kus luuakse, muudetakse ja hĂ€vitatakse stack kaustas aws-js-s3-folder. See vĂ”tab umbes minuti, et teavitada möödunud testist:

$ go test .
PASS
ok      ... 43.993s

On palju parameetreid, et kohandada nende testide kĂ€itumist. TĂ€ielik valik valikuid vaata struktuuris ProgramTestOptions. NĂ€iteks saate seadistada Jaeger lĂ”pp-punkti jĂ€lgimiseks (Tracing), mĂ€rkida, et ootate testi ebaĂ”nnestumist negatiivse testimise puhul (ExpectFailure), rakendada seeria "muudatusi" programmi jaoks jĂ€rjestikuste olekute ĂŒlemineku jaoks (EditDirs) ja palju muud. Vaatame, kuidas neid kasutada rakenduse juurutamise kontrollimiseks.

Resursside omaduste kontrollimine

Ühendamine, millest rÀÀgiti, tagab, et meie programm "töötab" — see ei ebaĂ”nnestu. Aga mis siis, kui soovime kontrollida saadud stack'i omadusi? NĂ€iteks, et teatud tĂŒĂŒpi ressursid on (vĂ”i ei ole) loodud ning et neil on teatud omadused.

Parameeter ExtraRuntimeValidation jaoks ProgramTestOptions laseb meil vaadata Pulumi jÀÀdvustatud olekut pĂ€rast juurutamist (post-deployment state), et saaksime teha tĂ€iendavaid kontrollimisi. See hĂ”lmab tĂ€ielikku tulemuste stack'i oleku ĂŒlevaadet, sealhulgas konfiguratsiooni, eksporditud vĂ€ljundvÀÀrtusi, kĂ”iki ressursside ja nende omaduste vÀÀrtusi ning ressursi vahelisi sĂ”ltuvusi.

Et nĂ€ha selle pĂ”hijoonist, kontrollime, et meie programm loob ĂŒhe S3 Bucket:

  integration.ProgramTest(t, &integration.ProgramTestOptions{
        \/\/ nagu enne...
        ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
            var foundBuckets int
            for _, res := range stack.Deployment.Resources {
                if res.Type == "aws:s3\/bucket:Bucket" {
                    foundBuckets++
                }
            }
            assert.Equal(t, 1, foundBuckets, "Ootame, et leiame ĂŒhe AWS S3 Ă€mbri")
        },
    })

NĂŒĂŒd, kui me kĂ€ivitame go test, ei lĂ€he see lihtsalt lĂ€bi testide, vaid pĂ€rast lahtiĂŒtlemise edukat sooritamist viib see lĂ€bi ka tĂ€iendava kontrolli lĂ”pptulemuse kohta.

Runtime-testid

Kuni siiani olid kÔik testid seotud ainult juurutamise kÀitumise ja Pulumi ressursimudeliga. Mis toimub, kui soovite kontrollida, et teie ettevalmistatud infrastruktuur tÔesti töötab? NÀiteks, et virtuaalne masin töötab, S3 Àmbri sisu vastab meie ootustele jms.

VĂ”ite juba aimata, kuidas seda teha: valik ExtraRuntimeValidation jaoks ProgramTestOptions — on selle jaoks suurepĂ€rane vĂ”imalus. Selle etapi jooksul kĂ€itate oma programmi tĂ€iendava Go testi, millel on juurdepÀÀs kĂ”ikide teie ressursside olekule. See olek sisaldab teavet, nagu virtuaalsete masinate IP-aadressid, URL-id ja kĂ”ik, mis on vajalik tĂ”eliseks suhtlemiseks saadud pilve rakenduste ja infrastruktuuriga.

NÀiteks meie testprogramm ekspordib omaduse webEndpoint Àmber nimega websiteUrl, mis on tÀielik URL, mille kaudu me saame juurdepÀÀsu seadistatud index document. Kuigi me vÔiksime uurida olekufaili, et leida bucket'i ja lugeda seda omadust otse, siis paljudel juhtudel ekspordivad meie stekid kasulikud omadused, nÀiteks see, mida on mugav kasutada kontrollimiseks:

integration.ProgramTest(t, &integration.ProgramTestOptions{
            \/\/ nagu enne ...
        ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
            url := "http:\/\/" + stack.Outputs["websiteUrl"].(string)
            resp, err := http.Get(url)
            if !assert.NoError(t, err) {
                return
            }
            if !assert.Equal(t, 200, resp.StatusCode) {
                return
            }
            defer resp.Body.Close()
            body, err := ioutil.ReadAll(resp.Body)
            if !assert.NoError(t, err) {
                return
            }
            assert.Contains(t, string(body), "Tere, Pulumi!")
        },
    })

Nagu meie eelnevad runtime-kontrollid, toimub see kontroll kohe pĂ€rast steki tĂ”stmist ja kĂ”ik see reageerib lihtsale kutsungile go test. Ja see on vaid jÀÀmĂ€e tipp — kĂ”ik Go testimisvĂ”imalused on saadaval, mida saate kodeerida.

JĂ€tkuv infrastruktuuri integreerimine

Hea on vĂ”imalus kĂ€ivitada teste sĂŒlearvutis, kui infrastruktuuris tehakse palju muudatusi, et neid enne koodi ĂŒlevaatusele saatmist kontrollida. Kuid meie ja paljud meie kliendid katsetame infrastruktuuri arenduse elutsĂŒkli erinevates etappides:

  • Iga avatud puhvrikĂŒsimise jaoks testi enne ĂŒhinemist.
  • Iga commit'i vastusena, et kontrollida, et ĂŒhinemine toimus Ă”igesti.
  • Perioodiliselt, nĂ€iteks öösiti vĂ”i iganĂ€dalaselt tĂ€iendavate testide jaoks.
  • Kuna osa jĂ”udlustestimisest vĂ”i stressitestimisest, mis tavaliselt kestab pikema aja ja kĂ€ivitab teste paralleelselt ja/vĂ”i juurutab sama programmi mitu korda.

IgaĂŒhe jaoks toetab Pulumi integreerimist teie lemmik jĂ€rjepideva integreerimise sĂŒsteemiga. JĂ€tkuva integreerimisega saad sama testide katvuse oma infrastruktuurile, nagu ka rakendustarkvarale.

Pulumi toetab levinud CI-sĂŒsteeme. Siin on mĂ”ned neist:

Rohkema teabe saamiseks vaadake dokumentatsiooni Continuous Delivery.

Efemeersed keskkonnad

VÀga vÔimas vÔimalus, mis avatakse, on vÔime juurutada efemeerseid keskkondi eranditult vastuvÔtutestimise eesmÀrkidel. Kontseptsioon projektidest ja virnadest Pulumi on kavandatud selliselt, et oleks lihtne juurutada ja hÀvitada tÀielikult isoleeritud ja sÔltumatuid keskkondi, kÔik vaid mÔne lihtsa CLI-kÀsu vÔi integreerimistestimise raamistiku abil.

Kui kasutate GitHubi, siis Pulumi pakub GitHubi rakendust, mis aitab teil ĂŒhenduda vastuvĂ”tutestimisega puhvrikĂŒsimustes teie CI torujuhtmes. Paigaldage rakendus GitHubi hoidlas ja Pulumi teie CI-sse ning puhvrikĂŒsimustes lisatakse teavet infrastruktuuri eelvaate, uuenduste ja testimistulemuste kohta:

Infrastruktuuri testimine koodina Pulumi abil. Osa 2

Pulumi kasutamisel teie pÔhivastuvÔtutestide jaoks on teil uued automatiseerimisvÔimalused, mis parandavad meeskonna tootlikkust ja annavad kindlustunde muudatuste kvaliteedi osas.

KokkuvÔte

Selles artiklis nĂ€gime, et ĂŒldotstarbeliste programmeerimiskeelte kasutamisel saavad meile kĂ€tte palju tarkvaraarenduse meetodeid, mis on olnud meie rakenduste arendamisel kasulikud. Need hĂ”lmavad modulaarset testimist, integreerimistestimist ning nende koostööd ulatuslikuks runtime-testimiseks. Teste on lihtne kĂ€ivitada nĂ”udmisel vĂ”i oma CI-sĂŒsteemis.

Pulumi — avatud lĂ€htekoodiga tarkvara, mida on tasuta kasutada ja mis töötab teie lemmikprogrammide ja -pilvede abil — proovige seda tĂ€na!

→ Esimene osa

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster