Pulumi көмегімен код ретінде инфрақұрылымды сынау. 2 бөлім

Бәріңе сәлем. Бүгін біз сіздермен мақаланың соңғы бөлімімен бөлісеміз. «Инфрақұрылымды Pulumi-мен код ретінде сынау», аудармасы курс студенттері үшін арнайы дайындалған «DevOps тәжірибелері мен құралдары».

Pulumi көмегімен код ретінде инфрақұрылымды сынау. 2 бөлім

Қолдану сынағы

Тестілеудің бұл стилі қуатты тәсіл болып табылады және инфрақұрылымдық кодтың қалай жұмыс істейтінін тексеру үшін ақ жолақты тестілеуді орындауға мүмкіндік береді. Дегенмен, бұл біз сынайтын нәрселерді біршама шектейді. Сынақтар нақты орналастыру алдында Pulumi жасаған жадтағы орналастыру жоспары негізінде орындалады, сондықтан орналастырудың өзін тексеру мүмкін емес. Мұндай жағдайлар үшін Пулумиде интеграциялық сынақ жүйесі бар. Және бұл екі тәсіл бірге тамаша жұмыс істейді!

Pulumi интеграциялық тестілеу жүйесі Go бағдарламасында жазылған, осылайша біз ішкі кодымыздың көпшілігін тексереміз. Бұрын талқыланған бірлік тестілеу тәсілі ақ жәшік сынағы сияқты болғанымен, интеграциялық тестілеу қара жәшік болып табылады. (Қатаң ішкі тестілеудің опциялары да бар.) Бұл құрылым толық Plumi бағдарламасын қабылдау және оған жаңа стекті нөлден орналастыру, оны нұсқалармен жаңарту және оны бірнеше рет жою сияқты өмірлік циклдің әртүрлі әрекеттерін орындау үшін жасалған. . Біз оларды жүйелі түрде (мысалы, түнде) және стресс-тест ретінде жүргіземіз.

(Біз біз онымен жұмыс істеп жатырмыз, осылайша ұқсас интеграциялық тестілеу мүмкіндіктері тілдердің жергілікті SDK жүйесінде қолжетімді болады. Pulumi бағдарламаңыз қай тілде жазылғанына қарамастан Go интеграциялық тестілеу негізін пайдалана аласыз).

Осы негізді пайдаланып бағдарламаны іске қосу арқылы сіз мыналарды тексере аласыз:

  • Жоба коды синтаксистік тұрғыдан дұрыс және қатесіз жұмыс істейді.
  • Стек пен құпияларды конфигурациялау параметрлері жұмыс істейді және дұрыс түсіндіріледі.
  • Жобаңызды таңдаған бұлт провайдерінде сәтті орналастыруға болады.
  • Жобаңызды бастапқы күйден N басқа күйге дейін сәтті жаңартуға болады.
  • Сіздің жобаңыз сәтті жойылуы және бұлттық провайдеріңізден жойылуы мүмкін.

Жақында көретініміздей, бұл құрылымды орындау уақытын тексеруді орындау үшін де пайдалануға болады.

Қарапайым интеграция тесті

Мұны әрекетте көру үшін біз репозиторийді қарастырамыз pulumi/examples, өйткені біздің команда және Пулуми қауымдастығы оны жеке тарту сұрауларымызды, міндеттемелерімізді және түнгі құрастыруларымызды тексеру үшін пайдаланады.

Төменде біздің жеңілдетілген сынақ берілген S3 шелегін және кейбір басқа нысандарды қамтамасыз ететін мысал:

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

Бұл сынақ қалта үшін стек жасау, өзгерту және жоюдың негізгі өмірлік циклінен өтеді aws-js-s3-folder. Өтілген сынақ туралы есеп беруге шамамен бір минут кетеді:

$ go test .
PASS
ok      ... 43.993s

Бұл сынақтардың әрекетін теңшеудің көптеген нұсқалары бар. Опциялардың толық тізімін қараңыз. құрылымында ProgramTestOptions. Мысалы, Jaeger соңғы нүктесін бақылау үшін конфигурациялауға болады (Tracing), егер сынақ теріс болса, сынақ сәтсіз болады деп күтетініңізді көрсетіңіз (ExpectFailure), күйлердің дәйекті өтуі үшін бағдарламаға «өңдеу» сериясын қолданыңыз (EditDirs) және т.б. Қолданбаны орналастыруды тексеру үшін оларды қалай пайдалану керектігін көрейік.

Ресурс қасиеттерін тексеру

Жоғарыда талқыланған интеграция бағдарламамыздың «жұмыс істеуін» қамтамасыз етеді - ол бұзылмайды. Ал егер алынған стектің қасиеттерін тексергіміз келсе ше? Мысалы, ресурстардың белгілі бір түрлері қамтамасыз етілген (немесе жоқ) және олардың белгілі атрибуттары бар.

Параметр ExtraRuntimeValidation үшін ProgramTestOptions қосымша тексерулер жасай алатындай Пулуми жазып алған орналастырудан кейінгі күйді қарауға мүмкіндік береді. Бұл конфигурацияны, экспортталған шығыс мәндерін, барлық ресурстарды және олардың сипат мәндерін және ресурстар арасындағы барлық тәуелділіктерді қоса алғанда, нәтиже стектің күйінің толық суретін қамтиды.

Мұның негізгі мысалын көру үшін біздің бағдарламамыз оны жасайтынын тексерейік S3 шелек:

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

Енді біз go testын іске қосқан кезде, ол тек өмірлік цикл сынақтарының батареясынан өтіп қана қоймайды, сонымен қатар стек сәтті орналастырғаннан кейін, ол алынған күйге қосымша тексеру жүргізеді.

Орындалу уақыты сынақтары

Осы уақытқа дейін барлық сынақтар қолдану тәртібі мен Пулуми ресурс үлгісіне қатысты болды. Қамтамасыз етілген инфрақұрылымның шынымен жұмыс істейтінін тексергіңіз келсе ше? Мысалы, виртуалды машина жұмыс істеп тұр, S3 шелегі біз күткен нәрсені қамтиды және т.б.

Сіз мұны қалай істеу керектігін алдын ала болжаған шығарсыз: опция ExtraRuntimeValidation үшін ProgramTestOptions - бұл үлкен мүмкіндік. Осы кезде бағдарлама ресурстарының толық күйіне қатынасумен теңшелетін Go сынағын іске қосасыз. Бұл күйге виртуалды машинаның IP мекенжайлары, URL мекенжайлары және нәтижелі бұлттық қолданбалармен және инфрақұрылыммен іс жүзінде әрекеттесу үшін қажетті барлық нәрсе сияқты ақпарат кіреді.

Мысалы, біздің сынақ бағдарламамыз сипатты экспорттайды webEndpoint шелек шақырылды websiteUrl, ол конфигурацияланғанын алуға болатын толық URL мекенжайы index document. Біз табу үшін мемлекеттік файлды қазып алар едік bucket және бұл сипатты тікелей оқыңыз, бірақ көптеген жағдайларда біздің стектер тексеру үшін пайдалану ыңғайлы деп санайтын пайдалы қасиеттерді экспорттайды:

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

Біздің алдыңғы орындалу уақытын тексерулер сияқты, бұл тексеру стекті көтергеннен кейін бірден орындалады, барлығы қарапайым қоңырауға жауап ретінде go test. Және бұл айсбергтің бір ұшы ғана — кодта жазуға болатын Go сынақ мүмкіндіктерінің барлығы қолжетімді.

Үздіксіз инфрақұрылымдық интеграция

Кодты қарап шығуға жібермес бұрын оларды сынау үшін көптеген инфрақұрылымдық өзгерістер жасалып жатқанда, ноутбукта сынақтарды жүргізу мүмкіндігі жақсы. Бірақ біз және біздің көптеген клиенттеріміз дамудың өмірлік циклінің әртүрлі кезеңдерінде инфрақұрылымды сынаймыз:

  • Біріктірмес бұрын тестілеуге арналған әрбір ашық тарту сұрауында.
  • Әрбір міндеттемеге жауап ретінде біріктірудің дұрыс орындалғанын екі рет тексеру үшін.
  • Мерзімді түрде, мысалы, түнде немесе қосымша тестілеу үшін апта сайын.
  • Әдетте ұзақ уақыт бойы жұмыс істейтін және сынақтарды параллельді орындайтын және/немесе бір бағдарламаны бірнеше рет орналастыратын өнімділік немесе стресс-тестілеу бөлігі ретінде.

Олардың әрқайсысы үшін Pulumi таңдаулы үздіксіз интеграциялық жүйемен интеграцияны қолдайды. Үздіксіз біріктіру арқылы бұл сізге қолданбалы бағдарламалық құрал сияқты инфрақұрылым үшін бірдей сынақ қамтуын береді.

Пулумиде жалпы CI жүйелеріне қолдау көрсетіледі. Мұнда олардың кейбіреулері бар:

Толық ақпарат алу үшін құжаттаманы қараңыз Үздіксіз жеткізу.

Эфемерлік орталар

Ашылатын өте қуатты мүмкіндік - эфемерлік орталарды қабылдау сынақтары үшін ғана қолдану мүмкіндігі. Тұжырымдама жобалар мен стектер Pulumi толығымен оқшауланған және тәуелсіз орталарды оңай орналастыруға және жоюға арналған, барлығы бірнеше қарапайым CLI пәрмендерінде немесе интеграциялық тестілеу құрылымын пайдаланады.

Егер сіз GitHub-ты пайдалансаңыз, Pulumi ұсынады GitHub қолданбасы, ол CI құбыр желісіндегі сұрауларды тарту үшін қабылдау сынақтарын қосуға көмектеседі. Қолданбаны GitHub репозиторийіне орнатыңыз, сонда Пулуми CI және пул сұрауларыңызға инфрақұрылымды алдын ала қарау, жаңартулар және сынақ нәтижелері туралы ақпаратты қосады:

Pulumi көмегімен код ретінде инфрақұрылымды сынау. 2 бөлім

Негізгі қабылдау сынақтары үшін Pulumi қолданбасын пайдаланған кезде, сіз топ өнімділігін арттыратын және өзгертулер сапасына сенімділік беретін жаңа автоматтандыру мүмкіндіктеріне ие боласыз.

Нәтиже

Бұл мақалада біз жалпы мақсаттағы бағдарламалау тілдерін пайдалану арқылы біздің қолданбаларды әзірлеуде пайдалы болатын көптеген бағдарламалық жасақтаманы әзірлеу әдістері бізге қолжетімді болатынын көрдік. Олар бірлік тестілеуін, интеграциялық тестілеуді және олардың ауқымды жұмыс уақытын тексеру үшін бірге жұмыс істеу жолын қамтиды. Сынақтарды сұраныс бойынша немесе CI жүйеңізде орындау оңай.

Пулуми - ашық бастапқы бағдарламалық қамтамасыз ету, пайдалануға тегін және сүйікті бағдарламалау тілдерімен және бұлттарыңызбен жұмыс істейді - бүгін көріңіз!

Бірінші бөлім

Ақпарат көзі: www.habr.com

пікір қалдыру