Kiểm tra cơ sở hạ tầng dưới dạng mã với Pulumi. Phần 2

Chào mọi người. Hôm nay chúng tôi chia sẻ với bạn phần cuối cùng của bài viết. "Thử nghiệm cơ sở hạ tầng dưới dạng mã với Pulumi", bản dịch được chuẩn bị riêng cho sinh viên khóa học "Các phương pháp và công cụ DevOps".

Kiểm tra cơ sở hạ tầng dưới dạng mã với Pulumi. Phần 2

Thử nghiệm triển khai

Phong cách thử nghiệm này là một cách tiếp cận mạnh mẽ và cho phép chúng tôi thực hiện thử nghiệm hộp trắng để kiểm tra cốt lõi về cách hoạt động của mã cơ sở hạ tầng của chúng tôi. Tuy nhiên, nó phần nào hạn chế những gì chúng ta có thể kiểm tra. Các thử nghiệm được thực hiện dựa trên kế hoạch triển khai trong bộ nhớ do Pulumi tạo trước khi triển khai thực tế và do đó bản thân việc triển khai không thể được thử nghiệm. Đối với những trường hợp như vậy, Pulumi có khung kiểm tra tích hợp. Và hai cách tiếp cận này phối hợp rất tốt với nhau!

Khung thử nghiệm tích hợp Pulumi được viết bằng Go, đây là cách chúng tôi kiểm tra hầu hết mã nội bộ của mình. Trong khi phương pháp thử nghiệm đơn vị được thảo luận trước đây giống thử nghiệm hộp trắng hơn thì thử nghiệm tích hợp là hộp đen. (Ngoài ra còn có các tùy chọn để thử nghiệm nội bộ nghiêm ngặt.) Khung này được tạo để thực hiện một chương trình Pulumi hoàn chỉnh và thực hiện các hoạt động khác nhau trong vòng đời của nó, chẳng hạn như triển khai một ngăn xếp mới từ đầu, cập nhật nó với các biến thể và xóa nó, có thể nhiều lần . Chúng tôi chạy chúng thường xuyên (ví dụ: vào ban đêm) và dưới dạng các bài kiểm tra căng thẳng.

(Chúng tôi chúng tôi đang làm việc đó, để khả năng thử nghiệm tích hợp tương tự có sẵn trong SDK gốc của các ngôn ngữ. Bạn có thể sử dụng khung kiểm tra tích hợp Go bất kể ngôn ngữ mà chương trình Pulumi của bạn được viết).

Bằng cách chạy chương trình sử dụng framework này, bạn có thể kiểm tra những điều sau:

  • Mã dự án của bạn có cú pháp chính xác và chạy không có lỗi.
  • Cài đặt cấu hình ngăn xếp và bí mật hoạt động và được diễn giải chính xác.
  • Dự án của bạn có thể được triển khai thành công trong nhà cung cấp đám mây mà bạn chọn.
  • Dự án của bạn có thể được nâng cấp thành công từ trạng thái ban đầu lên N trạng thái khác.
  • Dự án của bạn có thể bị hủy và xóa thành công khỏi nhà cung cấp đám mây của bạn.

Như chúng ta sẽ thấy ngay sau đây, khung này cũng có thể được sử dụng để thực hiện xác thực thời gian chạy.

Kiểm tra tích hợp đơn giản

Để thấy điều này hoạt động, chúng ta sẽ xem xét kho lưu trữ pulumi/examples, vì nhóm của chúng tôi và cộng đồng Pulumi sử dụng nó để kiểm tra các yêu cầu kéo, cam kết và bản dựng hàng đêm của chính chúng tôi.

Dưới đây là một bài kiểm tra đơn giản của chúng tôi ví dụ cung cấp nhóm S3 và một số đối tượng khác:

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

Thử nghiệm này trải qua vòng đời cơ bản của việc tạo, sửa đổi và hủy ngăn xếp cho một thư mục aws-js-s3-folder. Sẽ mất khoảng một phút để báo cáo bài kiểm tra đã vượt qua:

$ go test .
PASS
ok      ... 43.993s

Có nhiều tùy chọn để tùy chỉnh hành vi của các thử nghiệm này. Xem danh sách đầy đủ các tùy chọn. trong cấu trúc ProgramTestOptions. Ví dụ: bạn có thể định cấu hình điểm cuối Jaeger để theo dõi (Tracing), cho biết rằng bạn mong đợi thử nghiệm sẽ thất bại nếu thử nghiệm âm tính (ExpectFailure), áp dụng một loạt “chỉnh sửa” cho chương trình để chuyển đổi tuần tự các trạng thái (EditDirs) và nhiều hơn nữa. Hãy xem cách sử dụng chúng để kiểm tra việc triển khai ứng dụng của bạn.

Kiểm tra thuộc tính tài nguyên

Việc tích hợp được thảo luận ở trên đảm bảo rằng chương trình của chúng tôi “hoạt động”—không gặp sự cố. Nhưng nếu chúng ta muốn kiểm tra các thuộc tính của ngăn xếp kết quả thì sao? Ví dụ: một số loại tài nguyên nhất định đã (hoặc chưa) được cung cấp và chúng có các thuộc tính nhất định.

Thông số ExtraRuntimeValidation cho ProgramTestOptions cho phép chúng tôi xem trạng thái sau triển khai được Pulumi ghi lại để chúng tôi có thể thực hiện các kiểm tra bổ sung. Điều này bao gồm ảnh chụp nhanh hoàn chỉnh về trạng thái của ngăn xếp kết quả, bao gồm cấu hình, giá trị đầu ra được xuất, tất cả tài nguyên và giá trị thuộc tính của chúng cũng như tất cả sự phụ thuộc giữa các tài nguyên.

Để xem một ví dụ cơ bản về điều này, hãy kiểm tra xem chương trình của chúng ta có tạo một Nhóm 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")
        },
    })

Bây giờ, khi chúng tôi chạy thử nghiệm, nó sẽ không chỉ trải qua một loạt các thử nghiệm vòng đời mà còn sau khi triển khai thành công ngăn xếp, nó sẽ thực hiện kiểm tra bổ sung về trạng thái kết quả.

Kiểm tra thời gian chạy

Cho đến nay, tất cả các thử nghiệm đều thuần túy về hành vi triển khai và mô hình tài nguyên Pulumi. Điều gì sẽ xảy ra nếu bạn muốn xác minh rằng cơ sở hạ tầng được cung cấp của bạn thực sự hoạt động? Ví dụ: máy ảo đang chạy, nhóm S3 chứa những gì chúng ta mong đợi, v.v.

Có thể bạn đã đoán được cách thực hiện việc này: tùy chọn ExtraRuntimeValidation cho ProgramTestOptions - đây là một cơ hội tuyệt vời cho việc này. Tại thời điểm này, bạn chạy thử nghiệm Go tùy chỉnh với quyền truy cập vào toàn bộ trạng thái tài nguyên của chương trình. Trạng thái này bao gồm các thông tin như địa chỉ IP của máy ảo, URL và mọi thứ cần thiết để thực sự tương tác với cơ sở hạ tầng và ứng dụng đám mây.

Ví dụ: chương trình thử nghiệm của chúng tôi xuất thuộc tính webEndpoint xô được gọi là websiteUrl, đây là URL đầy đủ nơi chúng tôi có thể lấy cấu hình index document. Mặc dù chúng ta có thể đào sâu vào tệp trạng thái để tìm bucket và đọc trực tiếp thuộc tính đó, nhưng trong nhiều trường hợp, ngăn xếp của chúng tôi xuất các thuộc tính hữu ích như thế này mà chúng tôi thấy thuận tiện khi sử dụng để kiểm tra:

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

Giống như các lần kiểm tra thời gian chạy trước của chúng tôi, lần kiểm tra này sẽ được thực thi ngay sau khi nâng ngăn xếp lên, tất cả chỉ để đáp lại một lệnh gọi đơn giản go test. Và đó chỉ là phần nổi của tảng băng chìm—mọi tính năng kiểm tra cờ vây mà bạn có thể viết bằng mã đều có sẵn.

Tích hợp cơ sở hạ tầng liên tục

Thật tốt khi có thể chạy thử nghiệm trên máy tính xách tay khi có nhiều thay đổi về cơ sở hạ tầng đang được thực hiện để kiểm tra chúng trước khi gửi chúng đi xem xét mã. Tuy nhiên, chúng tôi và nhiều khách hàng của mình đang thử nghiệm cơ sở hạ tầng ở các giai đoạn khác nhau trong vòng đời phát triển:

  • Trong mọi yêu cầu kéo mở để kiểm tra trước khi hợp nhất.
  • Để đáp lại từng cam kết, hãy kiểm tra kỹ xem việc hợp nhất đã được thực hiện chính xác chưa.
  • Định kỳ, chẳng hạn như vào ban đêm hoặc hàng tuần để kiểm tra bổ sung.
  • Là một phần của kiểm thử hiệu năng hoặc căng thẳng, thường chạy trong thời gian dài và chạy thử nghiệm song song và/hoặc triển khai cùng một chương trình nhiều lần.

Đối với mỗi điều này, Pulumi hỗ trợ tích hợp với hệ thống tích hợp liên tục yêu thích của bạn. Với sự tích hợp liên tục, điều này mang lại cho bạn phạm vi kiểm tra tương tự đối với cơ sở hạ tầng cũng như đối với phần mềm ứng dụng của bạn.

Pulumi có hỗ trợ cho các hệ thống CI phổ biến. Dưới đây là một số trong số họ:

Để biết thêm thông tin chi tiết, vui lòng tham khảo tài liệu dành cho Giao hàng liên tục.

Môi trường phù du

Một cơ hội rất mạnh mẽ mở ra là khả năng triển khai các môi trường tạm thời chỉ nhằm mục đích thử nghiệm chấp nhận. Ý tưởng dự án và ngăn xếp Pulumi được thiết kế để dễ dàng triển khai và phá bỏ các môi trường hoàn toàn biệt lập và độc lập, tất cả chỉ bằng một vài lệnh CLI đơn giản hoặc sử dụng khung thử nghiệm tích hợp.

Nếu bạn sử dụng GitHub thì Pulumi sẽ cung cấp Ứng dụng GitHub, điều này sẽ giúp bạn kết nối thử nghiệm chấp nhận với các yêu cầu kéo trong quy trình CI của bạn. Chỉ cần cài đặt ứng dụng trong kho GitHub và Pulumi sẽ thêm thông tin về các bản xem trước, cập nhật và kết quả kiểm tra cơ sở hạ tầng vào các yêu cầu nhóm và CI của bạn:

Kiểm tra cơ sở hạ tầng dưới dạng mã với Pulumi. Phần 2

Khi sử dụng Pulumi cho các thử nghiệm chấp nhận cốt lõi của mình, bạn sẽ có được các khả năng tự động hóa mới giúp cải thiện năng suất của nhóm và giúp bạn tự tin về chất lượng các thay đổi của mình.

Tổng

Trong bài viết này, chúng ta đã thấy rằng bằng cách sử dụng các ngôn ngữ lập trình có mục đích chung, chúng ta có thể sử dụng nhiều kỹ thuật phát triển phần mềm hữu ích trong việc phát triển ứng dụng của mình. Chúng bao gồm thử nghiệm đơn vị, thử nghiệm tích hợp và cách chúng phối hợp với nhau để thực hiện thử nghiệm thời gian chạy mở rộng. Các bài kiểm tra rất dễ chạy theo yêu cầu hoặc trong hệ thống CI của bạn.

bột giấy - phần mềm nguồn mở, miễn phí sử dụng và hoạt động với các ngôn ngữ lập trình và đám mây yêu thích của bạn - thử nó ngay hôm nay!

Phần đầu tiên

Nguồn: www.habr.com

Thêm một lời nhận xét