Kiến thức cơ bản về bộ công cụ Cloud Foundation

1. Giới thiệu về CFT 101

b1d2ab0f35bb62a8.png

Lần cập nhật gần đây nhất: ngày 11 tháng 2 năm 2022

Cloud Foundation Toolkit là gì?

Về cơ bản, CFT cung cấp các mẫu theo phương pháp hay nhất để nhanh chóng bắt đầu trong Google Cloud Platform. Trong hướng dẫn này, bạn sẽ tìm hiểu cách đóng góp cho Cloud Foundation Toolkit.

Bạn cần có

  • Tài khoản GitHub.
  • Docker được cài đặt trên máy của bạn hoặc sử dụng Cloud Shell ( Cài đặt trên máy Mac, Cài đặt trên Windows)
  • Trình soạn thảo mã để chỉnh sửa mã (Ví dụ: Visual Studio Code)
  • Hiểu biết cơ bản về Git và GitHub
  • Có kinh nghiệm sử dụng Terraform và cơ sở hạ tầng dưới dạng mã
  • Quyền cấp vai trò Người tạo dự án cho Tài khoản dịch vụ
  • Một tổ chức Google Cloud, một thư mục kiểm thử và một tài khoản thanh toán

Sản phẩm bạn sẽ tạo ra

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách đóng góp cho Cloud Foundation Toolkit (CFT).

Bạn sẽ:

  • Thiết lập môi trường phát triển để đóng góp cho CFT
  • Thêm một tính năng vào mô-đun CFT
  • Thêm các kiểm thử cho tính năng đã thêm
  • Thực thi kiểm thử tích hợp trong CFT
  • Thực thi các kiểm thử tìm lỗi mã nguồn
  • Xác nhận mã cho GitHub và gửi Yêu cầu kéo (PR)

Bạn sẽ thực hiện tất cả các bước trên bằng cách thêm một tính năng mới vào mô-đun CFT Google Cloud Storage. Bạn sẽ thêm một nhãn có tên là "silly_label". Nhãn này sẽ tự động được thêm vào tất cả các vùng chứa được tạo thông qua mô-đun GCS CFT. Bạn cũng sẽ viết các bài kiểm thử để xác thực tính năng và đảm bảo tích hợp từ đầu đến cuối.

2. Thiết lập môi trường phát triển

Nếu muốn, bạn có thể sử dụng Cloud Shell cho mục đích phát triển. Nếu không muốn dùng Cloud Shell để đóng góp cho CFT, bạn có thể thiết lập môi trường phát triển trên máy của mình.

Thiết lập Git

GitHub dựa trên một hệ thống quản lý phiên bản (VCS) nguồn mở có tên là Git. Git chịu trách nhiệm về mọi hoạt động liên quan đến GitHub diễn ra cục bộ trên máy hoặc Cloud Shell của bạn.

  1. Khi sử dụng Cloud Shell, bạn không cần cài đặt git vì công cụ này đã được cài đặt sẵn.
$ git --version
# This will display the git version on the Cloud Shell.

Nếu đang thiết lập môi trường phát triển trên máy, bạn cần cài đặt Git.

Thiết lập tên người dùng và email trong Git

Git sử dụng tên người dùng để liên kết các cam kết với một danh tính. Tên người dùng Git không giống với tên người dùng GitHub.

Bạn có thể thay đổi tên được liên kết với các cam kết Git bằng lệnh git config. Việc thay đổi tên liên kết với các cam kết Git bằng git config sẽ chỉ ảnh hưởng đến các cam kết trong tương lai và sẽ không thay đổi tên được dùng cho các cam kết trước đây.

Bạn đã thiết lập Git thành công và có thể phân nhánh, tạo cũng như sao chép các nhánh. Chúng ta sẽ sử dụng Git một cách rộng rãi trong Lớp học lập trình này.

3. Phân nhánh Kho lưu trữ GCS của CFT

Phân nhánh một kho lưu trữ CFT

Bạn đã thiết lập Git trên máy cục bộ hoặc Cloud Shell ở bước trước. Bây giờ, bạn cần phân nhánh kho lưu trữ CFT của Google Cloud Storage để bắt đầu đóng góp.

Phân nhánh là bản sao của một kho lưu trữ. Việc phân nhánh một kho lưu trữ cho phép bạn thoải mái thử nghiệm các thay đổi mà không ảnh hưởng đến dự án ban đầu.

Thông thường, các nhánh rẽ được dùng để đề xuất thay đổi cho dự án của người khác hoặc dùng dự án của người khác làm điểm bắt đầu cho ý tưởng của riêng bạn.

Ví dụ: bạn có thể dùng nhánh rẽ để đề xuất các thay đổi liên quan đến việc sửa lỗi. Để khắc phục lỗi, bạn có thể:

  • Phân nhánh kho lưu trữ.
  • Khắc phục vấn đề.
  • Gửi yêu cầu kéo cho chủ sở hữu dự án.

Các bước để phân nhánh kho lưu trữ CFT:

  1. Mở trình duyệt web rồi chuyển đến kho lưu trữ terraform-google-modules/terraform-google-cloud-storage. Chúng ta sẽ sử dụng kho lưu trữ này trong toàn bộ Lớp học lập trình.
  2. Ở góc trên cùng bên phải của trang, hãy nhấp vào Phân nhánh.

9dc18f15ca662b56.png

  1. Bạn sẽ thấy một lựa chọn về nơi bạn muốn tạo bản sao, hãy chọn hồ sơ của bạn và kho lưu trữ sẽ được tạo bản sao.

Sao chép nhánh rẽ của bạn xuống máy

Phân nhánh mà bạn tạo là bản sao của kho lưu trữ mô-đun GCS. Bây giờ, bạn sẽ sao chép kho lưu trữ này vào môi trường cục bộ để thêm tính năng mới.

Các bước để sao chép nhánh của bạn:

  1. Mở trình duyệt web rồi chuyển đến nhánh của bạn trên terraform-google-modules/terraform-google-cloud-storage.
  2. Ở góc trên cùng bên phải, bạn sẽ thấy nút "Code" (Mã), hãy nhấp vào nút này.

98f8be8df319dcd8.png

  1. Sau khi bạn nhấp vào nút "Code" (Mã), hãy nhấp vào biểu tượng "Copy" (Sao chép) để sao chép URL của nhánh. Bạn sẽ dùng URL này để sao chép nhánh rẽ vào môi trường cục bộ.

e61e1da6371f2a1d.png

  1. Truy cập vào một cửa sổ dòng lệnh trong VSCode hoặc máy của bạn rồi sao chép nhánh.
$ git clone <url>
# This command will clone your fork locally.
# Paste the copied URL from the previous step.
  1. Sau khi sao chép nhánh rẽ của bạn xuống máy, bạn nên chuyển vào kho lưu trữ, tạo một nhánh mới từ nhánh rẽ và thực hiện các thay đổi về mã cho nhánh tạm thời.

Theo quy ước, bạn có thể đặt tên cho nhánh của mình như sau:

  • Đối với yêu cầu về tính năng: feature/feature-name
  • Đối với bản cập nhật nội bộ, internal/change-name
  • Đối với các bản sửa lỗi: bugfix/issue-name

Vì đang thêm một tính năng mới, nên bạn có thể gọi nhánh tạm thời là feature/silly_label

$ cd terraform-google-cloud-storage
# This command takes you into the cloned directory on your local machine.

$ git branch
# This command tells your current branch
# When you run this for the first time after you have cloned, your 
# output should say "master", that is your fork.

$ git checkout -b feature/silly_label
# This command creates a new branch on your fork and switches your 
# branch to the newly created branch.

$ git branch
# This command will confirm your current branch to be "feature/silly_label"

Giờ đây, bạn đã thiết lập xong mọi thứ để bắt đầu làm việc trên Cloud Foundation Toolkit!

4. Tạo môi trường kiểm thử

Quy trình phát triển CFT tiêu chuẩn dựa trên việc sử dụng một dự án kiểm thử riêng biệt để kiểm thử. Bước này sẽ hướng dẫn bạn tạo dự án kiểm thử (dựa trên cấu hình tiêu chuẩn) thông qua tài khoản dịch vụ.

0. Cài đặt Docker Engine

Nếu đang sử dụng máy cho mục đích phát triển, bạn cần cài đặt Docker Engine.

1. Cài đặt Google Cloud SDK

Bạn không cần cài đặt Google Cloud SDK nếu đang sử dụng Cloud Shell của GCP.

Truy cập vào Google Cloud SDK rồi tải trình cài đặt tương tác xuống cho nền tảng của bạn.

2. Đặt cấu hình

Để tạo một môi trường kiểm thử, bạn sẽ cần có một Tổ chức Google Cloud, một thư mục kiểm thử và một tài khoản thanh toán. Bạn cần đặt các giá trị này thông qua các biến môi trường:

export TF_VAR_org_id="your_org_id"
export TF_VAR_folder_id="your_folder_id"
export TF_VAR_billing_account="your_billing_account_id"

3. Thiết lập Tài khoản dịch vụ

Trước khi tạo môi trường kiểm thử, bạn cần tải khoá tài khoản dịch vụ xuống môi trường kiểm thử. Tài khoản dịch vụ này sẽ cần có các vai trò Project Creator (Người tạo dự án), Billing Account User (Người dùng tài khoản thanh toán)Organization Viewer (Người xem tổ chức). Các bước này giúp bạn tạo tài khoản dịch vụ mới, nhưng bạn cũng có thể sử dụng lại một tài khoản hiện có.

3.1 Tạo hoặc chọn dự án GCP ban đầu

Trước khi tạo tài khoản dịch vụ, bạn cần chọn một dự án để lưu trữ tài khoản đó. Bạn cũng có thể tạo một dự án mới.

gcloud config set core/project YOUR_PROJECT_ID

3.2 Bật các API của Google Cloud

Bật các API Google Cloud sau đây trên dự án ban đầu của bạn:

gcloud services enable cloudresourcemanager.googleapis.com
gcloud services enable iam.googleapis.com
gcloud services enable cloudbilling.googleapis.com

3.3 Tạo tài khoản dịch vụ

Tạo một tài khoản dịch vụ mới để quản lý môi trường kiểm thử:

# Creating a service account for CFT.
gcloud iam service-accounts create cft-onboarding \
  --description="CFT Onboarding Terraform Service Account" \
  --display-name="CFT Onboarding"

# Assign SERVICE_ACCOUNT environment variable for later steps
export SERVICE_ACCOUNT=cft-onboarding@$(gcloud config get-value core/project).iam.gserviceaccount.com

Xác minh rằng bạn đã tạo tài khoản dịch vụ:

gcloud iam service-accounts list --filter="EMAIL=${SERVICE_ACCOUNT}"

3.4 Cấp vai trò Người tạo dự án, Người dùng tài khoản thanh toán và Người xem tổ chức cho Tài khoản dịch vụ:

gcloud resource-manager folders add-iam-policy-binding ${TF_VAR_folder_id} \
  --member="serviceAccount:${SERVICE_ACCOUNT}" \
  --role="roles/resourcemanager.projectCreator"
gcloud organizations add-iam-policy-binding ${TF_VAR_org_id} \
  --member="serviceAccount:${SERVICE_ACCOUNT}" \
  --role="roles/billing.user"
gcloud beta billing accounts add-iam-policy-binding ${TF_VAR_billing_account} \
  --member="serviceAccount:${SERVICE_ACCOUNT}" \
  --role="roles/billing.user"
gcloud organizations add-iam-policy-binding ${TF_VAR_org_id} \
  --member="serviceAccount:${SERVICE_ACCOUNT}" \
  --role="roles/resourcemanager.organizationViewer"

Giờ đây, bạn đã có một Tài khoản dịch vụ có thể dùng để quản lý môi trường thử nghiệm.

4. Chuẩn bị thông tin đăng nhập Terraform

Để tạo môi trường kiểm thử, bạn cần tải khoá tài khoản dịch vụ xuống shell.

4.1 Khoá tài khoản dịch vụ

Tạo và tải khoá tài khoản dịch vụ xuống cho Terraform

gcloud iam service-accounts keys create cft.json --iam-account=${SERVICE_ACCOUNT}

4.2 Thiết lập thông tin đăng nhập Terraform

Cung cấp khoá cho Terraform bằng biến môi trường SERVICE_ACCOUNT_JSON, đặt giá trị thành nội dung của khoá tài khoản dịch vụ.

export SERVICE_ACCOUNT_JSON=$(< cft.json)

Sau khi lưu trữ thông tin về thông tin đăng nhập trong biến môi trường, hãy xoá tệp khoá. Bạn có thể tạo lại khoá sau này nếu cần bằng cách sử dụng lệnh tương tự như trên.

rm -rf cft.json

5. Tạo dự án kiểm thử cho việc triển khai Terraform

Giờ đây, khi đã chuẩn bị xong mọi thứ, bạn có thể tạo dự án kiểm thử bằng một lệnh duy nhất. Chạy lệnh này từ thư mục gốc terraform-google-cloud-storage:

make docker_test_prepare

Bạn sẽ thấy đầu ra bên dưới khi chạy make docker_test_prepare. Ở cuối, bạn sẽ nhận được test project_id đã được tạo, nơi bạn sẽ triển khai và kiểm thử mô-đun Cloud Storage bằng tính năng mới. Nếu bạn gặp vấn đề khi liên kết tài khoản thanh toán, hãy tham khảo các bước khắc phục sự cố.

macbookpro3:terraform-google-cloud-storage user$ make docker_test_prepare
docker run --rm -it \
                -e SERVICE_ACCOUNT_JSON \
                -e TF_VAR_org_id \
                -e TF_VAR_folder_id \
                -e TF_VAR_billing_account \
                -v /Users/cft/terraform-google-cloud-storage:/workspace \
                gcr.io/cloud-foundation-cicd/cft/developer-tools:0.8.0 \
                /usr/local/bin/execute_with_credentials.sh prepare_environment
Activated service account credentials for: [cft-onboarding@<project_id>.iam.gserviceaccount.com]
Activated service account credentials for: [cft-onboarding@<project_id>.iam.gserviceaccount.com]
Initializing modules...

Initializing the backend...

Initializing provider plugins...

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.

* provider.google-beta: version = "~> 3.9"
* provider.null: version = "~> 2.1"
* provider.random: version = "~> 2.2"

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
module.project.module.project-factory.null_resource.preconditions: Refreshing state... [id=8723188031607443970]
module.project.module.project-factory.null_resource.shared_vpc_subnet_invalid_name[0]: Refreshing state... [id=5109975723938185892]
module.project.module.gsuite_group.data.google_organization.org[0]: Refreshing state...
module.project.module.project-factory.random_id.random_project_id_suffix: Refreshing state... [id=rnk]
module.project.module.project-factory.google_project.main: Refreshing state... [id=<project-id>]
module.project.module.project-factory.google_project_service.project_services[0]: Refreshing state... [id=<project-id>/storage-api.googleapis.com]
module.project.module.project-factory.google_project_service.project_services[1]: Refreshing state... [id=<project-id>/cloudresourcemanager.googleapis.com]
module.project.module.project-factory.google_project_service.project_services[2]: Refreshing state... [id=<project-id>/compute.googleapis.com]
module.project.module.project-factory.data.null_data_source.default_service_account: Refreshing state...
module.project.module.project-factory.google_service_account.default_service_account: Refreshing state... [id=projects/ci-cloud-storage-ae79/serviceAccounts/project-service-account@<project-id>.iam.gserv
iceaccount.com]
module.project.module.project-factory.google_project_service.project_services[3]: Refreshing state... [id=<project-id>/serviceusage.googleapis.com]
module.project.module.project-factory.null_resource.delete_default_compute_service_account[0]: Refreshing state... [id=3576396874950891283]
google_service_account.int_test: Refreshing state... [id=projects/<project-id>/serviceAccounts/cft-onboarding@<project-id>.iam.gserviceaccount.com]
google_service_account_key.int_test: Refreshing state... [id=projects/<project-id>/serviceAccounts/cft-onboarding@<project-id>.iam.gserviceaccount.com/keys/351009a1e011e88049ab2097994d1c627a61
6961]
google_project_iam_member.int_test[1]: Refreshing state... [id=<project-id>/roles/iam.serviceAccountUser/serviceaccount:cft-onboarding@<project-id>.iam.gserviceaccount.com]
google_project_iam_member.int_test[0]: Refreshing state... [id=<project-id>/roles/storage.admin/serviceaccount:cft-onboarding@<project-id>.iam.gserviceaccount.com]

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

project_id = <test-project-id>
sa_key = <sensitive>
Found test/setup/make_source.sh. Using it for additional explicit environment configuration.

Giờ đây, bạn đã tạo một dự án kiểm thử được tham chiếu theo project_id như bạn có thể thấy trên đầu ra của bảng điều khiển. Môi trường phát triển và kiểm thử của bạn đã được thiết lập.

5. Thêm một tính năng mới vào mô-đun CFT

Giờ đây, môi trường phát triển và kiểm thử của bạn đã được thiết lập, hãy bắt đầu thêm tính năng "silly_label" vào mô-đun CFT google-cloud-storage.

Đảm bảo bạn đang ở trong terraform-google-cloud-storage và mở tệp main.tf như bạn thấy bên dưới trong cấu trúc thư mục.

ac1dba25408abd09.png

Vì "silly_label" là một nhãn, nên bạn sẽ thêm tính năng này vào dòng 27 trong biến "labels" trong main.tf, như bạn thấy bên dưới:

terraform-google-cloud-storage/main.tf

resource "google_storage_bucket" "buckets" {
 <...>
 storage_class = var.storage_class
 // CODELAB:Add silly label in labels variable
 labels        = merge(var.labels, { name = replace("${local.prefix}${lower(each.value)}", ".", "-") }, { "silly" = var.silly_label })
 force_destroy = lookup(
 <...>
}

Giờ đây, bạn sẽ thêm biến silly_label vào variables.tf mà bạn thấy trong cấu trúc thư mục ở trên.

Sao chép và dán mã bên dưới, rồi thêm mã đó vào dòng 31 trong variables.tf và đảm bảo bạn có một ký tự dòng mới ở phía trên và phía dưới khối biến mà bạn thêm.

terraform-google-cloud-storage/variables.tf

variable "names" {
 description = "Bucket name suffixes."
 type        = list(string)
}

// CODELAB: Add "silly_label" variable to variables.tf between "names" and "location"
variable "silly_label" {
 description = "Sample label for bucket."
 type        = string
}

variable "location" {
 description = "Bucket location."
 default     = "EU"
}

6. Thêm tính năng mới vào ví dụ về vùng lưu trữ

Bạn đã thêm tính năng vào main.tf của mô-đun và giờ đây, bạn sẽ kiểm thử tính năng đã thêm thông qua một ví dụ.

Bạn cần thêm "silly_label" vào examples/multiple-buckets/main.tf

Ví dụ này sẽ được dùng trong bước tiếp theo để thực hiện kiểm thử tích hợp.

Sao chép và dán dòng biến silly_label bên dưới vào dòng 27 trong main.tf tại terraform-google-cloud-storage/examples/multiple-buckets/ như trong cấu trúc thư mục:

5224fefbbcc61d89.png

terraform-google-cloud-storage/examples/multiple-buckets/main.tf

module "cloud_storage" {
 <...>
 // CODELAB: Add "silly_label" as an example to main.tf.
 silly_label        = "awesome"

 <..>
}

7. Cập nhật kiểm thử bản thiết kế để kiểm tra tính năng

Bạn đã thêm tính năng vào main.tf của mô-đun, sau đó thêm tính năng vào ví dụ multiple_buckets. Giờ đây, bạn cần kiểm thử tính năng của mình thông qua một bài kiểm thử tích hợp bản thiết kế được viết bằng Golang.

Bạn sẽ thêm các kiểm thử mới vào tệp multiple_buckets_test.go trong cấu trúc thư mục bên dưới:

72ea272d4792405.png

Bạn đã thêm "silly_label" vào tất cả các vùng chứa được tạo thông qua mô-đun multiple_buckets và giờ bạn cần viết các kiểm thử để kiểm thử tính năng mới.

Trong mã bên dưới, bạn sẽ nhận được nhãn của từng vùng chứa thông qua lệnh gcloud alpha storage, sau đó kiểm tra đầu ra mà lệnh này trả về.

test/integration/multiple_buckets/multiple_buckets_test.go

func TestMultipleBuckets(t *testing.T) {
 <..>
op := gcloud.Run(t, fmt.Sprintf("alpha storage ls --buckets gs://%s", bucketName), gcloudArgs).Array()[0]

// verify silly label on each bucket
assert.Equal("awesome", op.Get("metadata.labels.silly").String(), "should have silly label set to awesome")

// verify lifecycle rules
...
}

8. Thực thi kiểm thử tích hợp trong CFT

Kiểm thử tích hợp

Bài kiểm thử tích hợp được dùng để xác minh hành vi của mô-đun gốc, mô-đun con và ví dụ. Các nội dung bổ sung, thay đổi và bản sửa lỗi phải đi kèm với các kiểm thử.

Các kiểm thử tích hợp được viết bằng khung kiểm thử bản thiết kế và chạy bằng CFT CLI. Các công cụ này được đóng gói trong một hình ảnh Docker để thuận tiện cho bạn.

Chiến lược chung cho các kiểm thử này là xác minh hành vi của các mô-đun ví dụ, nhờ đó đảm bảo rằng mô-đun gốc, các mô-đun con và mô-đun ví dụ đều hoạt động đúng chức năng.

Trong quá trình thực thi tương tác, bạn thực thi từng bước thông qua nhiều lệnh.

  1. Chạy make docker_run để khởi động vùng chứa Docker thử nghiệm ở chế độ tương tác.

Make là một công cụ tự động hoá quy trình tạo bản dựng. Công cụ này tự động tạo các chương trình và thư viện có thể thực thi từ mã nguồn bằng cách đọc các tệp có tên là Makefile. Các tệp này chỉ định cách lấy chương trình mục tiêu. Khi bạn thực hiện các thay đổi đối với tệp, vùng chứa Docker phải tự động cập nhật.

Khi chạy make docker_run, bạn sẽ tạo một không gian làm việc trong vùng chứa Docker và kích hoạt thông tin xác thực cho tài khoản dịch vụ của mình. Không gian làm việc này sẽ được dùng trong các bước tiếp theo để chạy kiểm thử.

Bạn sẽ thấy kết quả sau đây trong thiết bị đầu cuối:

Activated service account credentials for: [cft@<PROJECT_ID>.iam.gserviceaccount.com]
  1. Chạy module-swapper -registry-prefix=terraform-google-modules để điều chỉnh các tệp main.tf mẫu nhằm nhập các mô-đun từ tệp cục bộ thay vì các mô-đun đã xuất bản.

Bạn sẽ thấy kết quả như sau trong thiết bị đầu cuối:

[root@<CONTAINER_ID> workspace]# module-swapper -registry-prefix=terraform-google-modules
2025/08/04 19:26:29 Module name set from remote to cloud-storage
2025/08/04 19:26:29 Modifications made to file /workspace/examples/multiple_buckets/main.tf
2025/08/04 19:26:29 --- Original
+++ Modified
@@ -21,7 +21,7 @@
 }
 
 module "cloud_storage" {
-  source = "terraform-google-modules/cloud-storage/google"
+  source = "../.."
   # [restore-marker]   version = "~> 10.0"
 
   project_id = var.project_id
  1. Chạy cft test list để liệt kê tất cả các bài kiểm thử bản thiết kế trong không gian làm việc của bạn.

Bạn sẽ thấy kết quả sau đây trong thiết bị đầu cuối:

[root@CONTAINER_ID workspace]# cft test list
 NAME                           | CONFIG                    | LOCATION                                                   
--------------------------------+---------------------------+------------------------------------------------------------
 TestAll/examples/simple_bucket | examples/simple_bucket    | test/integration/discover_test.go                          
 TestMultipleBuckets            | examples/multiple_buckets | test/integration/multiple_buckets/multiple_buckets_test.go 

  1. Chạy cft test run <EXAMPLE_NAME> --stage init để khởi chạy ví dụ. Trong trường hợp này, để khởi chạy lượt chạy thử nghiệm TestMultipleBuckets, hãy dùng cft test run TestMultipleBuckets --stage init. Ngoài ra, bạn có thể dùng cờ --verbose để nhận thêm thông tin khi chạy thử nghiệm.

Giai đoạn khởi tạo này sẽ khởi tạo ví dụ về Terraform.

Bạn sẽ thấy đầu ra bên dưới trong thiết bị đầu cuối.

[root@<CONTAINER_ID> workspace]# cft test run TestMultipleBuckets --stage init --verbose
INFO[02-09|08:24:31] using test-dir: test/integration 
...
TestMultipleBuckets 2022-02-09T08:24:35Z command.go:179: Terraform has been successfully initialized!
...
TestMultipleBuckets 2022-02-09T08:24:35Z command.go:100: Running command terraform with args [validate]
TestMultipleBuckets 2022-02-09T08:24:36Z command.go:179: Success! The configuration is valid.
...
--- PASS: TestMultipleBuckets (4.05s)
  1. Chạy cft test run <EXAMPLE_NAME> --stage apply để áp dụng mô-đun ví dụ.

Bước này áp dụng ví dụ được khởi tạo ở giai đoạn trước cho dự án GCP đã tạo trước đó trong Lớp học lập trình.

Bạn sẽ thấy đầu ra bên dưới trong thiết bị đầu cuối.

[root@<CONTAINER_ID> workspace]# cft test run TestMultipleBuckets --stage apply --verbose
INFO[02-09|08:28:11] using test-dir: test/integration
...
TestMultipleBuckets 2022-02-09T08:28:19Z command.go:179: Apply complete! Resources: 6 added, 0 changed, 0 destroyed.
TestMultipleBuckets 2022-02-09T08:28:19Z command.go:179: 
TestMultipleBuckets 2022-02-09T08:28:19Z command.go:179: Outputs:
TestMultipleBuckets 2022-02-09T08:28:19Z command.go:179: 
TestMultipleBuckets 2022-02-09T08:28:19Z command.go:179: names = {
TestMultipleBuckets 2022-02-09T08:28:19Z command.go:179:   "one" = "multiple-buckets-erp1-eu-one"
...
--- PASS: TestMultipleBuckets (6.51s)
PASS
ok      github.com/terraform-google-modules/terraform-google-cloud-storage/test/integration/multiple_buckets    6.548s
  1. Chạy cft test run <EXAMPLE_NAME> --stage verify để xác minh rằng ví dụ đã tạo cơ sở hạ tầng dự kiến.

Bước này sẽ chạy hàm xác minh trong TestMultipleBuckets. Thông thường, quá trình xác minh được thực hiện bằng cách thực thi một lệnh gcloud để truy xuất đầu ra JSON cho trạng thái hiện tại của một tài nguyên và xác nhận rằng trạng thái hiện tại giống như trạng thái được khai báo trong ví dụ.

Nếu gặp phải lỗi, bạn sẽ thấy những gì được mong đợi và những gì lệnh nhận được cho thử nghiệm.

Bạn sẽ thấy đầu ra bên dưới trong thiết bị đầu cuối.

[root@<CONTAINER_ID> workspace]# cft test run TestMultipleBuckets --stage verify --verbose
INFO[02-09|08:30:19] using test-dir: test/integration
...
TestMultipleBuckets 2022-02-09T08:30:27Z command.go:100: Running command terraform with args [output -no-color -json names_list]
TestMultipleBuckets 2022-02-09T08:30:27Z command.go:179: ["multiple-buckets-erp1-eu-one","multiple-buckets-erp1-eu-two"]
TestMultipleBuckets 2022-02-09T08:30:27Z command.go:100: Running command gcloud with args [alpha storage ls --buckets gs://multiple-buckets-erp1-eu-one --project ci-cloud-storage-8ce9 --json]
TestMultipleBuckets 2022-02-09T08:30:28Z command.go:179: [
TestMultipleBuckets 2022-02-09T08:30:28Z command.go:179: {
TestMultipleBuckets 2022-02-09T08:30:28Z command.go:179:   "url": "gs://multiple-buckets-erp1-eu-one/",
...
TestMultipleBuckets 2022-02-09T08:30:33Z command.go:179: ]
2022/02/09 08:30:33 RUN_STAGE env var set to verify
2022/02/09 08:30:33 Skipping stage teardown
--- PASS: TestMultipleBuckets (12.32s)
PASS
ok      github.com/terraform-google-modules/terraform-google-cloud-storage/test/integration/multiple_buckets    12.359s
  1. Chạy cft test run <EXAMPLE_NAME> --stage teardown để tháo rời ví dụ.

Bước này sẽ huỷ cơ sở hạ tầng mà bạn đã tạo ở các bước trên. Bước này cũng sẽ xoá các vùng chứa GCS đã được tạo trong dự án cùng với nhãn mà bạn đã thêm vào mô-đun GCS.

Bạn có thể xem đầu ra bên dưới trong thiết bị đầu cuối.

[root@<CONTAINER_ID> workspace]# cft test run TestMultipleBuckets --stage teardown --verbose
INFO[02-09|08:36:02] using test-dir: test/integration
...
TestMultipleBuckets 2022-02-09T08:36:06Z command.go:100: Running command terraform with args [destroy -auto-approve -input=false -lock=false]
TestMultipleBuckets 2022-02-09T08:36:07Z command.go:179: module.cloud_storage.random_id.bucket_suffix: Refreshing state... [id=mNA]
TestMultipleBuckets 2022-02-09T08:36:07Z command.go:179: random_string.prefix: Refreshing state... [id=erp1]
TestMultipleBuckets 2022-02-09T08:36:08Z command.go:179: module.cloud_storage.google_storage_bucket.buckets["two"]: Refreshing state... [id=multiple-buckets-erp1-eu-two]
...
TestMultipleBuckets 2022-02-09T08:36:10Z command.go:179: Destroy complete! Resources: 6 destroyed.
TestMultipleBuckets 2022-02-09T08:36:10Z command.go:179: 
--- PASS: TestMultipleBuckets (6.62s)
PASS
ok      github.com/terraform-google-modules/terraform-google-cloud-storage/test/integration/multiple_buckets    6.654s
  1. Chạy module-swapper -registry-prefix=terraform-google-modules -restore để huỷ các điều chỉnh đối với tệp main.tf ví dụ kể từ lần gần đây nhất bạn chạy module-swapper.
[root@<CONTAINER_ID> workspace]# module-swapper -registry-prefix=terraform-google-modules -restore
2025/08/04 19:30:41 Module name set from remote to cloud-storage
2025/08/04 19:36:32 Modifications made to file /workspace/examples/multiple_buckets/main.tf
2025/08/04 19:36:32 --- Original
+++ Modified
@@ -21,8 +21,8 @@
 }
 
 module "cloud_storage" {
-  source = "../.."
-   version = "~> 10.0"
+  source  = "terraform-google-modules/cloud-storage/google"
+  version = "~> 10.0"
 
   project_id = var.project_id
 
  1. Chạy exit để thoát khỏi vùng chứa kiểm thử.

9. Tạo tài liệu cho đầu vào và đầu ra

Các bảng Đầu vào và Đầu ra trong tệp README của mô-đun gốc, mô-đun con và mô-đun ví dụ được tạo tự động dựa trên variablesoutputs của các mô-đun tương ứng. Bạn phải làm mới các bảng này nếu giao diện mô-đun thay đổi.

Chạy:

make generate_docs
# This will generate new Inputs and Outputs tables

10. Thực thi các kiểm thử tìm lỗi mã nguồn trong CFT

Linter là một công cụ phân tích mã nguồn để gắn cờ các lỗi lập trình, lỗi, lỗi về phong cách và cấu trúc đáng ngờ.

Nhiều tệp trong kho lưu trữ có thể được kiểm tra hoặc định dạng để duy trì tiêu chuẩn chất lượng. Để đảm bảo chất lượng trong CFT, bạn sẽ sử dụng một bài kiểm thử lỗi mã nguồn.

Chạy:

make docker_test_lint
# This will run all lint tests on your repo

11. Gửi yêu cầu lấy dữ liệu trên GitHub

Giờ đây, bạn đã thay đổi mã cục bộ và kiểm thử mã thông qua các bài kiểm thử tích hợp, bạn sẽ muốn xuất bản mã này lên kho lưu trữ chính.

Để cung cấp mã trên kho lưu trữ chính, bạn cần xác nhận các thay đổi về mã cho nhánh của mình và đẩy mã đó vào kho lưu trữ chính. Để thêm mã vào kho lưu trữ chính mà bạn đã phân nhánh khi bắt đầu Lớp học lập trình, bạn sẽ gửi một Yêu cầu kéo (PR) trên kho lưu trữ chính sau khi xác nhận mã vào kho lưu trữ của mình.

Khi bạn tạo một PR, quản trị viên kho lưu trữ sẽ nhận được thông báo để xem xét các thay đổi về mã được đề xuất. Ngoài ra, bạn cũng có thể thêm những người dùng khác làm người đánh giá để nhận ý kiến phản hồi về các thay đổi đối với mã của bạn. Yêu cầu kéo sẽ kích hoạt Cloud Build để chạy các kiểm thử trên kho lưu trữ.

Dựa trên những thay đổi về mã của bạn, người đánh giá mã sẽ đưa ra nhận xét về mã của bạn và yêu cầu bạn sửa đổi nếu cần thay đổi điều gì đó dựa trên các phương pháp hay nhất và tài liệu. Quản trị viên sẽ xem xét các thay đổi về mã của bạn, đảm bảo mã của bạn tuân thủ kho lưu trữ và có thể yêu cầu bạn thực hiện một số thay đổi trước khi hợp nhất mã của bạn vào kho lưu trữ chính.

Thực hiện các bước sau để xác nhận mã cho nhánh được phân nhánh và đẩy mã vào nhánh được phân nhánh:

  1. Bước đầu tiên là thêm các tệp đã thay đổi vào kho lưu trữ cục bộ.
$ git add main.tf
$ git add README.md
$ git add variables.tf
$ git add examples/multiple-buckets/main.tf
$ git add test/integration/multiple_buckets/multiple_buckets_test.go
# The ‘git add' command adds the file in the local repository and 
# stages the file for commit. To unstage a file, use git reset HEAD YOUR-FILE
  1. Các tệp của bạn hiện đã được dàn xếp, tiếp theo bạn sẽ xác nhận các thay đổi.
$ git commit -m "First CFT commit"
# This will commit the staged changes and prepares them to be pushed 
# to a remote repository. To remove this commit and modify the file, 
# use 'git reset --soft HEAD~1' and commit and add the file again.
  1. Đẩy các thay đổi đã xác nhận trong kho lưu trữ cục bộ lên GitHub để tạo Yêu cầu kéo (PR).
$ git push -u origin feature/silly_label
# Pushes the changes in your local repository up to the remote
# repository you specified as the origin

Giờ đây, các thay đổi về mã của bạn đã sẵn sàng cho một Yêu cầu kéo!

Thực hiện các bước sau để tạo một PR cho terraform-google-modules/terraform-google-cloud-storage repo:

  1. Trong trình duyệt web, hãy chuyển đến trang chính của repo.
  2. Bạn sẽ thấy một đề xuất qua biểu ngữ để mở một PR từ nhánh của bạn. Nhấp vào "So sánh và yêu cầu kéo".

60e7ae0cbc11588e.png

  1. Nhập tiêu đề và nội dung mô tả cho yêu cầu kéo để mô tả các thay đổi về mã của bạn. Hãy nêu cụ thể nhất có thể nhưng vẫn phải súc tích.

f4302385e9e1776a.png

  1. Để tạo một yêu cầu kéo đã sẵn sàng để xem xét, hãy nhấp vào "Tạo yêu cầu kéo".
  2. Bạn sẽ thấy các Trình kích hoạt Cloud Build đang chạy do được kích hoạt vì PR.
  3. Hãy tham khảo tài liệu chính thức của GitHub về cách mở yêu cầu gộp các thay đổi mà bạn thực hiện vào mã nguồn ban đầu từ các nhánh nếu bạn gặp vấn đề.

Bạn đã đẩy thành công thay đổi mã đầu tiên vào nhánh được phân tách và tạo PR CFT đầu tiên cho nhánh chính!

12. Xin chúc mừng

Xin chúc mừng, bạn đã thêm thành công một tính năng vào mô-đun CFT và gửi một PR để xem xét!

Bạn đã thêm một tính năng vào mô-đun CFT, kiểm thử tính năng đó cục bộ thông qua một ví dụ và thực hiện các kiểm thử trước khi xác nhận mã của bạn vào GitHub. Cuối cùng, bạn đã tạo một PR để xem xét và hợp nhất cuối cùng vào CFT.

Giờ đây, bạn đã biết các bước quan trọng để bắt đầu sử dụng Cloud Foundation Toolkit.