Pagsubok sa Imprastraktura bilang Code sa Pulumi. Bahagi 2

Kamusta kayong lahat. Ngayon ibinabahagi namin sa iyo ang huling bahagi ng artikulo. "Pagsubok sa Imprastraktura bilang Code sa Pulumi", ang pagsasalin ay partikular na inihanda para sa mga mag-aaral ng kurso "Mga kasanayan at tool ng DevOps".

Pagsubok sa Imprastraktura bilang Code sa Pulumi. Bahagi 2

Pagsubok sa deployment

Ang istilo ng pagsubok na ito ay isang mahusay na diskarte at nagbibigay-daan sa amin na magsagawa ng white box testing upang subukan ang mga panloob na paggana ng aming code sa imprastraktura. Gayunpaman, medyo nililimitahan nito kung ano ang maaari naming subukan. Isinasagawa ang mga pagsubok batay sa in-memory deployment plan na ginawa ni Pulumi bago ang aktwal na deployment at samakatuwid ang deployment mismo ay hindi masusuri. Para sa mga ganitong kaso, may integration test framework ang Pulumi. At ang dalawang diskarte na ito ay mahusay na gumagana nang magkasama!

Ang Pulumi integration testing framework ay nakasulat sa Go, na kung paano namin sinusubukan ang karamihan sa aming internal code. Habang ang naunang tinalakay na diskarte sa pagsubok ng unit ay mas katulad ng pagsusuri sa puting kahon, ang pagsubok sa pagsasama ay isang itim na kahon. (Mayroon ding mga opsyon para sa mahigpit na panloob na pagsubok.) Ginawa ang balangkas na ito upang kumuha ng kumpletong programa ng Pulumi at magsagawa ng iba't ibang mga pagpapatakbo ng lifecycle dito, tulad ng pag-deploy ng bagong stack mula sa simula, pag-update nito na may mga variation, at pagtanggal nito, posibleng maraming beses . Regular naming pinapatakbo ang mga ito (halimbawa, sa gabi) at bilang mga pagsubok sa stress.

(Kami ginagawa namin ito, upang ang mga katulad na kakayahan sa pagsubok sa pagsasama ay magagamit sa katutubong SDK ng mga wika. Maaari mong gamitin ang Go integration testing framework anuman ang wika kung saan nakasulat ang iyong Pulumi program).

Sa pamamagitan ng pagpapatakbo ng programa gamit ang balangkas na ito maaari mong suriin ang sumusunod:

  • Ang iyong code ng proyekto ay syntactically tama at tumatakbo nang walang mga error.
  • Ang mga setting ng pagsasaayos ng stack at mga lihim ay gumagana at binibigyang-kahulugan nang tama.
  • Ang iyong proyekto ay maaaring matagumpay na mai-deploy sa cloud provider na iyong pinili.
  • Ang iyong proyekto ay maaaring matagumpay na ma-upgrade mula sa paunang estado sa N iba pang mga estado.
  • Ang iyong proyekto ay maaaring matagumpay na masira at maalis mula sa iyong cloud provider.

Tulad ng makikita natin sa lalong madaling panahon, ang balangkas na ito ay maaari ding gamitin upang maisagawa ang pagpapatunay ng runtime.

Simpleng pagsubok sa pagsasama

Upang makita ito sa pagkilos, titingnan natin ang repositoryo pulumi/examples, habang ginagamit ito ng aming team at ng komunidad ng Pulumi upang subukan ang aming sariling mga pull request, commit, at gabi-gabing build.

Nasa ibaba ang isang pinasimpleng pagsubok ng aming halimbawa na nagbibigay ng S3 bucket at ilang iba pang mga bagay:

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,
        },
    })
}

Ang pagsubok na ito ay dumadaan sa pangunahing lifecycle ng paggawa, pagbabago, at pagsira ng stack para sa isang folder aws-js-s3-folder. Aabutin ng humigit-kumulang isang minuto upang mag-ulat ng isang naipasa na pagsubok:

$ go test .
PASS
ok      ... 43.993s

Maraming mga opsyon para i-customize ang gawi ng mga pagsubok na ito. Tingnan ang buong listahan ng mga opsyon. sa istruktura ProgramTestOptions. Halimbawa, maaari mong i-configure ang Jaeger endpoint upang masubaybayan ang (Tracing), ipahiwatig na inaasahan mong mabibigo ang pagsubok kung negatibo ang pagsubok (ExpectFailure), maglapat ng isang serye ng "mga pag-edit" sa programa para sa sunud-sunod na paglipat ng mga estado (EditDirs) at marami pang iba. Tingnan natin kung paano gamitin ang mga ito upang subukan ang iyong deployment ng application.

Sinusuri ang mga katangian ng mapagkukunan

Tinitiyak ng pagsasama-samang tinalakay sa itaas na ang aming programa ay "gumagana"β€”hindi ito bumagsak. Ngunit paano kung gusto nating suriin ang mga katangian ng nagresultang stack? Halimbawa, na ang ilang mga uri ng mga mapagkukunan ay na-provision (o hindi pa) at mayroon silang ilang mga katangian.

Parametro ExtraRuntimeValidation para sa ProgramTestOptions nagbibigay-daan sa amin na tingnan ang post-deployment state na naitala ni Pulumi para makagawa kami ng mga karagdagang pagsusuri. Kabilang dito ang kumpletong snapshot ng estado ng resultang stack, kabilang ang configuration, na-export na mga halaga ng output, lahat ng mga mapagkukunan at mga halaga ng kanilang ari-arian, at lahat ng mga dependency sa pagitan ng mga mapagkukunan.

Upang makakita ng pangunahing halimbawa nito, tingnan natin kung ang aming programa ay lumilikha ng isa S3 Balde:

  integration.ProgramTest(t, &integration.ProgramTestOptions{
        // as before...
        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, "Expected to find a single AWS S3 Bucket")
        },
    })

Ngayon, kapag nagpatakbo kami ng go test, hindi lamang ito dadaan sa isang baterya ng mga pagsubok sa lifecycle, ngunit gayundin, pagkatapos matagumpay na i-deploy ang stack, magsasagawa ito ng karagdagang pagsusuri sa resultang estado.

Mga pagsubok sa runtime

Sa ngayon, ang lahat ng mga pagsubok ay puro tungkol sa pag-uugali sa pag-deploy at ang modelo ng mapagkukunan ng Pulumi. Paano kung gusto mong i-verify na gumagana talaga ang iyong naka-provision na imprastraktura? Halimbawa, na ang virtual machine ay tumatakbo, ang S3 bucket ay naglalaman ng kung ano ang inaasahan namin, at iba pa.

Maaaring nahulaan mo na kung paano ito gagawin: opsyon ExtraRuntimeValidation para sa ProgramTestOptions - ito ay isang magandang pagkakataon para dito. Sa puntong ito, nagpapatakbo ka ng custom na Go test na may access sa buong estado ng mga mapagkukunan ng iyong program. Kasama sa estado na ito ang impormasyon gaya ng mga virtual machine na IP address, URL, at lahat ng kailangan para aktwal na makipag-ugnayan sa mga nagresultang cloud application at imprastraktura.

Halimbawa, ini-export ng aming test program ang property webEndpoint tinawag na balde websiteUrl, na kung saan ay ang buong URL kung saan maaari naming makuha ang na-configure index document. Bagama't maaari kaming maghukay sa file ng estado upang mahanap bucket at direktang basahin ang pag-aari na iyon, ngunit sa maraming pagkakataon ang aming mga stack ay nag-e-export ng mga kapaki-pakinabang na katangian tulad nito na sa tingin namin ay madaling gamitin para sa pagsuri:

integration.ProgramTest(t, &integration.ProgramTestOptions{
            // as before ...
        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), "Hello, Pulumi!")
        },
    })

Tulad ng aming mga nakaraang runtime check, ang pagsusuri na ito ay isasagawa kaagad pagkatapos itaas ang stack, lahat bilang tugon sa isang simpleng tawag go test. At iyon lang ang dulo ng icebergβ€”bawat feature ng Go test na maaari mong isulat sa code ay available.

Tuloy-tuloy na Infrastructure Integration

Mahusay na makapagpatakbo ng mga pagsubok sa isang laptop kapag maraming pagbabago sa imprastraktura ang ginagawa upang subukan ang mga ito bago isumite ang mga ito para sa pagsusuri ng code. Ngunit kami at marami sa aming mga kliyente ay sumusubok sa imprastraktura sa iba't ibang yugto ng ikot ng buhay ng pag-unlad:

  • Sa bawat bukas na kahilingan sa paghila para sa pagsubok bago pagsamahin.
  • Bilang tugon sa bawat commit, i-double-check kung nagawa nang tama ang pagsasanib.
  • Pana-panahon, tulad ng sa gabi o lingguhan para sa karagdagang pagsusuri.
  • Bilang bahagi ng pagsubok sa pagganap o stress, na karaniwang tumatakbo sa mahabang panahon at nagpapatakbo ng mga pagsubok nang magkatulad at/o nagde-deploy ng parehong programa nang maraming beses.

Para sa bawat isa sa mga ito, sinusuportahan ng Pulumi ang pagsasama sa iyong paboritong tuluy-tuloy na sistema ng pagsasama. Sa patuloy na pagsasama, binibigyan ka nito ng parehong saklaw ng pagsubok para sa iyong imprastraktura gaya ng para sa software ng iyong aplikasyon.

Ang Pulumi ay may suporta para sa mga karaniwang CI system. Narito ang ilan sa mga ito:

Para sa mas detalyadong impormasyon, mangyaring sumangguni sa dokumentasyon para sa Patuloy na Paghahatid.

Pansamantalang Kapaligiran

Ang isang napakalakas na pagkakataon na nagbubukas ay ang kakayahang mag-deploy ng mga ephemeral na kapaligiran para lamang sa mga layunin ng pagsubok sa pagtanggap. Konsepto mga proyekto at stack Idinisenyo ang Pulumi upang madaling i-deploy at sirain ang ganap na hiwalay at independiyenteng mga kapaligiran, lahat sa ilang simpleng CLI command o gamit ang isang integration testing framework.

Kung gumagamit ka ng GitHub, nag-aalok si Pulumi GitHub App, na tutulong sa iyong ikonekta ang pagsubok sa pagtanggap upang hilahin ang mga kahilingan sa loob ng iyong pipeline ng CI. I-install lang ang application sa repositoryo ng GitHub, at magdaragdag si Pulumi ng impormasyon tungkol sa mga preview ng imprastraktura, update at resulta ng pagsubok sa iyong mga kahilingan sa CI at pool:

Pagsubok sa Imprastraktura bilang Code sa Pulumi. Bahagi 2

Kapag ginamit mo ang Pulumi para sa iyong mga pangunahing pagsubok sa pagtanggap, makakakuha ka ng mga bagong kakayahan sa automation na magpapahusay sa pagiging produktibo ng team at magbibigay sa iyo ng kumpiyansa sa kalidad ng iyong mga pagbabago.

Kabuuan

Sa artikulong ito, nakita namin na sa pamamagitan ng paggamit ng mga pangkalahatang layunin na programming language, maraming mga diskarte sa pagbuo ng software ang magagamit sa amin na naging kapaki-pakinabang sa pagbuo ng aming mga application. Kasama sa mga ito ang unit testing, integration testing, at kung paano sila nagtutulungan upang magsagawa ng malawak na runtime testing. Ang mga pagsubok ay madaling tumakbo on demand o sa iyong CI system.

Pulumi - open source software, malayang gamitin at gumagana sa iyong mga paboritong programming language at cloud - subukan ito ngayon!

β†’ Ang unang bahagi

Pinagmulan: www.habr.com

Magdagdag ng komento