ชุดเครื่องมือพื้นฐานระบบคลาวด์ 101

1. ข้อมูลเบื้องต้นเกี่ยวกับ CFT 101

b1d2ab0f35bb62a8.png

อัปเดตล่าสุด 11-02-2022

Cloud Foundation Toolkit คืออะไร

โดยพื้นฐานแล้ว CFT มีเทมเพลตแนวทางปฏิบัติแนะนำเพื่อเริ่มต้นใช้งาน Google Cloud Platform อย่างรวดเร็ว ในบทแนะนำนี้ คุณจะได้เรียนรู้วิธีมีส่วนร่วมในการใช้ Cloud Foundation Toolkit

สิ่งที่คุณต้องมี

  • บัญชี GitHub
  • ติดตั้ง Docker บนเครื่องหรือใช้ Cloud Shell ( ติดตั้ง Mac, ติดตั้ง Windows)
  • ตัวแก้ไขโค้ดสำหรับการแก้ไขโค้ด (เช่น โค้ด Visual Studio)
  • มีความคุ้นเคยกับ Git และ GitHub ในระดับพื้นฐาน
  • ประสบการณ์บางส่วนในการใช้ Terraform และโครงสร้างพื้นฐานเป็นโค้ด
  • สิทธิ์ในการมอบบทบาทผู้สร้างโปรเจ็กต์แก่บัญชีบริการ
  • องค์กร Google Cloud, โฟลเดอร์ทดสอบ และบัญชีสำหรับการเรียกเก็บเงิน

สิ่งที่คุณจะสร้าง

ใน Codelab นี้ คุณจะได้ดูวิธีมีส่วนร่วมใน Cloud Foundation Toolkit (CFT)

คุณจะ:

  • ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์สำหรับการมีส่วนร่วมใน CFT
  • เพิ่มฟีเจอร์ลงในโมดูล CFT
  • เพิ่มการทดสอบสำหรับฟีเจอร์ที่เพิ่ม
  • ดำเนินการทดสอบการผสานรวมใน CFT
  • ดำเนินการทดสอบ Lint
  • คอมมิตโค้ดไปยัง GitHub และส่งคำขอพุล (PR)

คุณจะดำเนินการตามขั้นตอนด้านบนทั้งหมดได้โดยเพิ่มฟีเจอร์ใหม่ในโมดูล CFT ของ Google Cloud Storage คุณจะเพิ่มป้ายกำกับที่เรียกว่า "silly_label" ซึ่งระบบจะเพิ่มไปยังที่เก็บข้อมูลทั้งหมดที่สร้างขึ้นผ่านโมดูล GCS CFT โดยอัตโนมัติ นอกจากนี้ คุณยังจะได้เขียนการทดสอบเพื่อตรวจสอบความถูกต้องของฟีเจอร์และทำให้การผสานรวมตั้งแต่ต้นจนจบ

2. ตั้งค่าสภาพแวดล้อมสำหรับนักพัฒนาซอฟต์แวร์

คุณใช้ Cloud Shell เพื่อการพัฒนาได้ หากต้องการ หากไม่ต้องการใช้ Cloud Shell เพื่อมีส่วนร่วมใน CFT คุณสามารถตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์บนเครื่องได้

ตั้งค่า Git

GitHub สร้างขึ้นตามระบบควบคุมเวอร์ชันโอเพนซอร์ส (VCS) ที่เรียกว่า Git Git จะรับผิดชอบต่อทุกอย่างที่เกี่ยวข้องกับ GitHub ซึ่งเกิดขึ้นในเครื่องหรือ Cloud Shell

  1. เมื่อใช้ Cloud Shell คุณไม่จำเป็นต้องติดตั้ง Git เนื่องจากมีการติดตั้งไว้ล่วงหน้าแล้ว
$ git --version
# This will display the git version on the Cloud Shell.

หากคุณกำลังตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์บนเครื่อง คุณจะต้องติดตั้ง Git

การตั้งค่าชื่อผู้ใช้และอีเมลใน Git

Git ใช้ชื่อผู้ใช้เพื่อเชื่อมโยงคอมมิตกับข้อมูลประจำตัว ชื่อผู้ใช้ Git ไม่เหมือนกับชื่อผู้ใช้ GitHub ของคุณ

คุณสามารถเปลี่ยนชื่อที่เชื่อมโยงกับคอมมิตของ Git ได้โดยใช้คำสั่งการกำหนดค่า git การเปลี่ยนชื่อที่เชื่อมโยงกับการคอมมิต Git ของคุณโดยใช้ git config จะส่งผลต่อการคอมมิตในอนาคตเท่านั้น และจะไม่เปลี่ยนชื่อที่ใช้สำหรับคอมมิตที่ผ่านมา

คุณตั้งค่า Git สำเร็จแล้วและคุณน่าจะแยกแยะ สร้าง และโคลน Branch ได้ เราจะใช้ Git อย่างกว้างขวางใน Codelab นี้

3. ที่เก็บ GCS ของ Fork CFT

แยกที่เก็บ CFT

คุณตั้งค่า Git บนเครื่องภายในหรือ Cloud Shell ได้ในขั้นตอนก่อนหน้า ตอนนี้คุณต้องแยกที่เก็บ CFT ของ Google Cloud Storage เพื่อเริ่มมีส่วนร่วม

Fork คือสำเนาของที่เก็บ การฟอร์แมตที่เก็บช่วยให้คุณทดสอบการเปลี่ยนแปลงได้อย่างอิสระโดยไม่ส่งผลกระทบต่อโปรเจ็กต์ต้นฉบับ

โดยส่วนใหญ่มักใช้ส้อมเพื่อเสนอการเปลี่ยนแปลงให้กับโปรเจ็กต์ของผู้อื่นหรือใช้โปรเจ็กต์ของผู้อื่นเป็นจุดเริ่มต้นสำหรับแนวคิดของคุณเอง

ตัวอย่างเช่น คุณใช้ส้อมเพื่อเสนอการเปลี่ยนแปลงที่เกี่ยวข้องกับการแก้ไขข้อบกพร่องได้ วิธีแก้ไขข้อบกพร่องมีดังนี้

  • แยกที่เก็บ
  • แก้ไขปัญหา
  • ส่งคำขอพุลไปยังเจ้าของโปรเจ็กต์

ขั้นตอนในการปลอมแปลงที่เก็บ CFT มีดังนี้

  1. เปิดเว็บเบราว์เซอร์และไปที่ที่เก็บ terraform-google-modules/terraform-google-cloud-storage เราจะใช้ที่เก็บนี้สําหรับ Codelab ทั้งหมด
  2. คลิกแยกที่มุมขวาบนของหน้า

9dc18f15ca662b56.png

  1. คุณจะเห็นตัวเลือกตำแหน่งที่ต้องการให้แยกหน้าจอ เลือกโปรไฟล์ และที่เก็บจะถูกแยกออก

โคลนส้อมในเครื่อง

แยกที่คุณสร้างเป็นสำเนาของที่เก็บโมดูล GCS คุณจะโคลนที่เก็บนี้ไปยังสภาพแวดล้อมในเครื่องเพื่อเพิ่มฟีเจอร์ใหม่ได้แล้ว

ขั้นตอนการโคลนส้อมมีดังนี้

  1. เปิดเว็บเบราว์เซอร์และไปยังแยกใน terraform-google-modules/terraform-google-cloud-storage
  2. คุณจะเห็น "โค้ด" ที่มุมขวาบน ให้คลิกปุ่ม

98f8be8df319dcd8.png

  1. หลังจากคลิก "โค้ด" คลิกปุ่ม "คัดลอก" เพื่อคัดลอก URL ของส้อม คุณจะใช้ URL นี้เพื่อโคลนส้อมไปยังสภาพแวดล้อมในเครื่อง

e61e1da6371f2a1d.png

  1. ไปที่เทอร์มินัลใน VSCode หรือเครื่อง แล้วโคลนส้อม
$ git clone <url>
# This command will clone your fork locally.
# Paste the copied URL from the previous step.
  1. เมื่อโคลนส้อมในเครื่องแล้ว คุณควรไปที่ที่เก็บ สร้างสาขาใหม่ออกจากแยก และแก้ไขโค้ดใน Branch ชั่วคราว

ตามหลักแล้ว คุณสามารถตั้งชื่อสาขาดังนี้

  • สำหรับคำขอฟีเจอร์: feature/feature-name
  • สำหรับการอัปเดตภายใน internal/change-name
  • สำหรับการแก้ไขข้อบกพร่อง: bugfix/issue-name

เนื่องจากกำลังเพิ่มฟีเจอร์ใหม่ คุณสามารถโทรหาสาขาชั่วคราว 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"

ตอนนี้คุณพร้อมที่จะเริ่มทำ Cloud Foundation Toolkit แล้ว

4. สร้างสภาพแวดล้อมการทดสอบ

กระบวนการพัฒนา CFT มาตรฐานจะอิงตามการใช้โปรเจ็กต์ทดสอบแบบแยกในการทดสอบ ขั้นตอนนี้จะแนะนำขั้นตอนการสร้างโปรเจ็กต์ทดสอบ (ตามการกำหนดค่ามาตรฐาน) ผ่านบัญชีบริการ

0. ติดตั้ง Docker Engine

หากคุณใช้เครื่องเพื่อการพัฒนา คุณต้องติดตั้ง Docker Engine

1. ติดตั้ง Google Cloud SDK

คุณไม่จำเป็นต้องติดตั้ง Google Cloud SDK หากใช้ Cloud Shell ของ GCP

ไปที่ Google Cloud SDK และดาวน์โหลดโปรแกรมติดตั้งแบบอินเทอร์แอกทีฟสำหรับแพลตฟอร์ม

2. กำหนดค่า

หากต้องการสร้างสภาพแวดล้อมการทดสอบ คุณจะต้องมีองค์กร Google Cloud, โฟลเดอร์ทดสอบ และบัญชีสำหรับการเรียกเก็บเงิน ค่าเหล่านี้ต้องตั้งค่าผ่านตัวแปรสภาพแวดล้อม

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. ตั้งค่าบัญชีบริการ

ก่อนสร้างสภาพแวดล้อมการทดสอบ คุณต้องดาวน์โหลดคีย์บัญชีบริการลงในสภาพแวดล้อมการทดสอบ บัญชีบริการนี้จะต้องมีบทบาทผู้สร้างโปรเจ็กต์ ผู้ใช้บัญชีสำหรับการเรียกเก็บเงิน และผู้ดูองค์กร ขั้นตอนเหล่านี้ช่วยให้คุณสร้างบัญชีบริการใหม่ แต่คุณอาจนำบัญชีที่มีอยู่กลับมาใช้ใหม่ได้

3.1 สร้างหรือเลือกโปรเจ็กต์ GCP สำหรับ Seed

ก่อนสร้างบัญชีบริการ คุณต้องเลือกโปรเจ็กต์เพื่อโฮสต์บัญชีดังกล่าว นอกจากนี้ คุณยังสร้างโปรเจ็กต์ใหม่ได้อีกด้วย

gcloud config set core/project YOUR_PROJECT_ID

3.2 เปิดใช้ Google Cloud API

เปิดใช้ Google Cloud API ต่อไปนี้ในโปรเจ็กต์ Seed ของคุณ:

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

3.3 สร้างบัญชีบริการ

สร้างบัญชีบริการใหม่เพื่อจัดการสภาพแวดล้อมการทดสอบ ดังนี้

# 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

ยืนยันว่าระบบสร้างบัญชีบริการแล้ว โดยทำดังนี้

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

3.4 มอบบทบาทผู้สร้างโปรเจ็กต์ ผู้ใช้บัญชีสำหรับการเรียกเก็บเงิน และผู้ดูองค์กรให้แก่บัญชีบริการ ดังนี้

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"

ตอนนี้คุณก็มีบัญชีบริการที่สามารถใช้จัดการสภาพแวดล้อมการทดสอบได้แล้ว

4. เตรียมข้อมูลเข้าสู่ระบบ Terraform

คุณต้องดาวน์โหลดคีย์บัญชีบริการลงใน Shell เพื่อสร้างสภาพแวดล้อมการทดสอบ

4.1 คีย์บัญชีบริการ

สร้างและดาวน์โหลดคีย์บัญชีบริการสำหรับ Terraform

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

4.2 ตั้งค่าข้อมูลเข้าสู่ระบบ Terraform

ระบุคีย์ให้กับ Terraform โดยใช้ตัวแปรสภาพแวดล้อม SERVICE_ACCOUNT_JSON โดยกำหนดค่าเป็น contents ของคีย์บัญชีบริการ

export SERVICE_ACCOUNT_JSON=$(< cft.json)

หลังจากจัดเก็บข้อมูลเข้าสู่ระบบในตัวแปรสภาพแวดล้อมแล้ว ให้นำไฟล์คีย์ออก คุณสร้างคีย์อีกครั้งได้ในภายหลังหากจำเป็นโดยใช้คำสั่งเดียวกันข้างต้น

rm -rf cft.json

5. สร้างโปรเจ็กต์ทดสอบสำหรับการทำให้ Terraform ใช้งานได้

เมื่อเตรียมทุกอย่างเรียบร้อยแล้ว คุณก็สร้างโปรเจ็กต์ทดสอบได้ด้วยคำสั่งเดียว เรียกใช้คำสั่งนี้จากรูทของไดเรกทอรี terraform-google-cloud-storage

make docker_test_prepare

คุณจะเห็นเอาต์พุตด้านล่างเมื่อเรียกใช้ make docker_test_prepare ซึ่งในตอนท้ายคุณจะได้รับรหัส project_id ทดสอบที่สร้างขึ้นเพื่อให้คุณนำไปปรับใช้และทดสอบโมดูล Cloud Storage ด้วยฟีเจอร์ใหม่ หากพบปัญหาเกี่ยวกับการลิงก์บัญชีสำหรับการเรียกเก็บเงิน โปรดดูขั้นตอนการแก้ปัญหา

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.

ตอนนี้คุณได้สร้างโปรเจ็กต์ทดสอบซึ่งอ้างอิงโดย project_id ตามที่คุณเห็นบนเอาต์พุตคอนโซล ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์และการทดสอบแล้ว

5. เพิ่มฟีเจอร์ใหม่ลงในโมดูล CFT

ตอนนี้สภาพแวดล้อมการพัฒนาและการทดสอบได้รับการตั้งค่าแล้ว มาเริ่มเพิ่ม "silly_label" กัน ลงในโมดูล CFT ของ google-cloud-storage

ตรวจสอบว่าคุณอยู่ใน terraform-google-cloud-storage และเปิดไฟล์ main.tf ตามที่คุณเห็นด้านล่างในโครงสร้างโฟลเดอร์

ac1dba25408abd09.png

ตั้งแต่ "silly_label" เป็นป้ายกำกับ คุณจะเพิ่มคุณลักษณะในบรรทัดที่ 27 ในตัวแปร "labels" ใน main.tf ดังที่แสดงด้านล่าง

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(
 <...>
}

ในขั้นตอนนี้ ให้เพิ่มตัวแปร silly_label ในตัวแปรตัวแปร เมื่อเห็นในโครงสร้างโฟลเดอร์ด้านบน

คัดลอกและวางโค้ดด้านล่างแล้วเพิ่มลงในบรรทัดที่ 31 ในตัวแปร และตรวจสอบว่ามีอักขระบรรทัดใหม่ด้านบนและด้านล่างบล็อกตัวแปรที่เพิ่ม

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. เพิ่มฟีเจอร์ใหม่ในตัวอย่างที่เก็บข้อมูลของพื้นที่เก็บข้อมูล

คุณเพิ่มฟีเจอร์ใน main.tf ของโมดูลแล้ว และตอนนี้ คุณจะได้ทดสอบฟีเจอร์ที่เพิ่มเข้ามาผ่านตัวอย่าง

ป้ายกำกับ "silly_label" จะต้องเพิ่มลงในตัวอย่าง/multiple-buckets/main.tf

ระบบจะใช้ตัวอย่างนี้ในขั้นตอนถัดไปเพื่อทำการทดสอบการผสานรวม

คัดลอกและวางบรรทัด silly_label ของตัวแปรด้านล่างไปยังบรรทัดที่ 27 ใน main.tf ที่ terraform-google-cloud-storage/examples/multiple-buckets/ ตามที่เห็นในโครงสร้างโฟลเดอร์

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. อัปเดตการทดสอบพิมพ์เขียวเพื่อตรวจสอบฟีเจอร์

คุณเพิ่มฟีเจอร์ลงใน main.tf ของโมดูลแล้ว จากนั้นเพิ่มฟีเจอร์ในตัวอย่าง Multiple_buckets ในตอนนี้คุณต้องทดสอบฟีเจอร์ของคุณผ่านการทดสอบการผสานรวมแบบพิมพ์เขียวที่เขียนใน Golang

คุณจะเพิ่มการทดสอบใหม่ในไฟล์ Multiple_buckets_test.go ซึ่งอยู่ในโครงสร้างโฟลเดอร์ด้านล่าง

72ea272d4792405.png

คุณเพิ่ม "silly_label" ในที่เก็บข้อมูลทั้งหมดที่กำลังสร้างผ่านโมดูล Multiple_buckets และตอนนี้คุณต้องเขียนการทดสอบเพื่อทดสอบฟีเจอร์ใหม่

ในโค้ดด้านล่าง คุณจะได้รับป้ายกำกับของที่เก็บข้อมูลแต่ละชุดผ่านคำสั่ง gcloud alpha Storage จากนั้นตรวจสอบผลลัพธ์ที่แสดงผลจากคำสั่ง

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. ดำเนินการทดสอบการผสานรวมใน CFT

การทดสอบการผสานรวม

การทดสอบการผสานรวมใช้เพื่อยืนยันลักษณะการทำงานของโมดูลรูท โมดูลย่อย และตัวอย่าง การเพิ่ม การเปลี่ยนแปลง และการแก้ไขควรมีการทดสอบด้วย

การทดสอบการผสานรวมเขียนโดยใช้เฟรมเวิร์กการทดสอบพิมพ์เขียว และเรียกใช้โดยใช้ CFT CLI เครื่องมือเหล่านี้มีแพ็กเกจอยู่ในอิมเมจ Docker เพื่อความสะดวก

กลยุทธ์ทั่วไปสําหรับการทดสอบเหล่านี้คือการตรวจสอบลักษณะการทํางานของโมดูลตัวอย่าง จึงช่วยให้มั่นใจว่าโมดูลรูท โมดูลย่อย และโมดูลตัวอย่างมีฟังก์ชันการทำงานที่ถูกต้องทั้งหมด

ในการเรียกใช้แบบอินเทอร์แอกทีฟ คุณจะเรียกใช้แต่ละขั้นตอนผ่านคำสั่งหลายรายการ

  1. เรียกใช้ make docker_run เพื่อเริ่มต้นการทดสอบคอนเทนเนอร์ Docker ในโหมดอินเทอร์แอกทีฟ

Make เป็นเครื่องมืออัตโนมัติของบิลด์ที่จะสร้างโปรแกรมสั่งการและไลบรารีจากซอร์สโค้ดโดยอัตโนมัติด้วยการอ่านไฟล์ที่เรียกว่า Makefiles ซึ่งระบุวิธีดึงข้อมูลโปรแกรมเป้าหมาย เมื่อคุณทำการเปลี่ยนแปลงไฟล์ ระบบจะอัปเดตคอนเทนเนอร์ Docker โดยอัตโนมัติ

เมื่อเรียกใช้ make docker_run คุณจะสร้างพื้นที่ทำงานในคอนเทนเนอร์ Docker และเปิดใช้งานข้อมูลเข้าสู่ระบบสำหรับบัญชีบริการ ระบบจะใช้พื้นที่ทำงานในขั้นตอนถัดไปเพื่อทำการทดสอบ

คุณจะเห็นเอาต์พุตด้านล่างในเทอร์มินัล

Activated service account credentials for: [cft@<PROJECT_ID>.iam.gserviceaccount.com]
  1. เรียกใช้ cft test list เพื่อแสดงรายการการทดสอบพิมพ์เขียวทั้งหมดในพื้นที่ทำงานของคุณ

คุณจะเห็นเอาต์พุตด้านล่างในเทอร์มินัล

[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. เรียกใช้ cft test run <EXAMPLE_NAME> --stage init เพื่อเริ่มต้นตัวอย่าง ในกรณีนี้เพื่อเริ่มต้นการทดสอบ TestMultipleBuckets cft test run TestMultipleBuckets --stage init คุณยังใช้แฟล็ก --verbose เพิ่มเติมเพื่อรับข้อมูลเพิ่มเติมขณะทำการทดสอบได้ด้วย

ขั้นตอนเริ่มต้นนี้จะเริ่มต้นตัวอย่าง Terraform

คุณจะเห็นเอาต์พุตด้านล่างในเทอร์มินัล

[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. เรียกใช้ cft test run <EXAMPLE_NAME> --stage apply เพื่อใช้โมดูลตัวอย่าง

ขั้นตอนนี้จะใช้ตัวอย่างที่เริ่มต้นในขั้นตอนก่อนหน้ากับโปรเจ็กต์ GCP ที่สร้างขึ้นก่อนหน้านี้ใน Codelab

คุณจะเห็นเอาต์พุตด้านล่างในเทอร์มินัล

[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. เรียกใช้ cft test run <EXAMPLE_NAME> --stage verify เพื่อยืนยันว่าตัวอย่างได้สร้างโครงสร้างพื้นฐานที่คาดไว้

ขั้นตอนนี้จะเรียกใช้ฟังก์ชันยืนยันใน TestMultipleBuckets การยืนยันมักจะทำผ่านการเรียกใช้คำสั่ง gcloud เพื่อดึงเอาต์พุต JSON สำหรับสถานะปัจจุบันของทรัพยากรและยืนยันว่าสถานะปัจจุบันเป็นไปตามที่ประกาศในตัวอย่าง

หากคุณพบข้อผิดพลาด คุณจะเห็นสิ่งที่คาดหวังและสิ่งที่ได้รับโดยคำสั่งสำหรับการทดสอบ

คุณจะเห็นเอาต์พุตด้านล่างในเทอร์มินัล

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. เรียกใช้ cft test run <EXAMPLE_NAME> --stage teardown เพื่อแยกตัวอย่าง

ขั้นตอนนี้จะทำลายโครงสร้างพื้นฐานที่คุณสร้างไว้ในขั้นตอนข้างต้น ขั้นตอนนี้จะทำลายที่เก็บข้อมูล GCS ที่สร้างขึ้นในโปรเจ็กต์ รวมถึงป้ายกำกับที่คุณเพิ่มไว้ในโมดูล GCS

คุณดูเอาต์พุตด้านล่างได้ในเทอร์มินัล

[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. เรียกใช้ exit เพื่อออกจากคอนเทนเนอร์ทดสอบ

9. การสร้างเอกสารสำหรับอินพุตและเอาต์พุต

ตารางอินพุตและเอาต์พุตใน README ของโมดูลรูท โมดูลย่อย และโมดูลตัวอย่างจะสร้างขึ้นโดยอัตโนมัติตาม variables และ outputs ของโมดูลที่เกี่ยวข้อง ตารางเหล่านี้ต้องรีเฟรชหากมีการเปลี่ยนแปลงอินเทอร์เฟซโมดูล

เรียกใช้:

make generate_docs
# This will generate new Inputs and Outputs tables

10. ดำเนินการทดสอบ Lint ใน CFT

โปรแกรมวิเคราะห์โค้ดเป็นเครื่องมือที่วิเคราะห์ซอร์สโค้ดเพื่อระบุข้อผิดพลาดในการเขียนโปรแกรม ข้อบกพร่อง ข้อผิดพลาดด้านสไตล์ และโครงสร้างที่น่าสงสัย

ไฟล์จำนวนมากในที่เก็บสามารถแปลงรูปแบบเป็นโค้ดหรือจัดรูปแบบเพื่อรักษามาตรฐานคุณภาพ โปรดใช้การทดสอบ Lint เพื่อให้ได้คุณภาพใน CFT

เรียกใช้:

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

11. การส่งการประชาสัมพันธ์ใน GitHub

ตอนนี้คุณได้เปลี่ยนโค้ดในเครื่องและทดสอบโค้ดผ่านการทดสอบการผสานรวมแล้ว คุณคงจะต้องการเผยแพร่โค้ดนี้ไปยังที่เก็บหลัก

หากต้องการทำให้โค้ดพร้อมใช้งานในที่เก็บหลัก คุณจะต้องทำการเปลี่ยนแปลงโค้ดกับสาขาและพุชไปยังที่เก็บหลัก หากต้องการเพิ่มโค้ดไปยังที่เก็บหลักที่คุณแยกตอนเริ่ม Codelab คุณจะต้องเพิ่มคำขอพุล (PR) ในที่เก็บหลักหลังจากคอมมิตโค้ดไปยังที่เก็บแล้ว

เมื่อคุณประชาสัมพันธ์ ผู้ดูแลระบบที่เก็บจะได้รับแจ้งให้ตรวจสอบการเปลี่ยนแปลงโค้ดที่เสนอ นอกจากนี้ คุณยังเพิ่มผู้ใช้รายอื่นๆ เป็นผู้ตรวจสอบเพื่อรับความคิดเห็นเกี่ยวกับการเปลี่ยนแปลงโค้ดได้ด้วย ฝ่ายประชาสัมพันธ์จะทริกเกอร์ Cloud Build ซึ่งจะทำการทดสอบในที่เก็บ

ผู้ตรวจสอบโค้ดจะแสดงความคิดเห็นเกี่ยวกับโค้ดของคุณและขอให้คุณทำการแก้ไขหากมีสิ่งใดจำเป็นต้องเปลี่ยนแปลงตามแนวทางปฏิบัติแนะนำและเอกสารประกอบ โดยอิงจากการเปลี่ยนแปลงโค้ดของคุณ ผู้ดูแลระบบจะตรวจสอบการเปลี่ยนแปลงโค้ดเพื่อให้แน่ใจว่าโค้ดของคุณสอดคล้องกับที่เก็บ และอาจขอให้คุณทำการเปลี่ยนแปลงบางอย่างอีกครั้งก่อนที่จะรวมโค้ดไว้ในที่เก็บหลัก

ทำตามขั้นตอนต่อไปนี้เพื่อคอมมิตโค้ดไปยัง Branch ที่ถูกแยกและพุชโค้ดไปยัง Branch ของ Fork

  1. ขั้นตอนแรกคือการเพิ่มไฟล์ที่มีการเปลี่ยนแปลงลงในที่เก็บในเครื่อง
$ 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. ไฟล์ของคุณเสร็จสมบูรณ์แล้ว ขั้นตอนถัดไปคุณจะต้องดำเนินการเปลี่ยนแปลง
$ 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. พุชการเปลี่ยนแปลงที่คอมมิตในที่เก็บในเครื่องไปยัง GitHub เพื่อสร้างคำขอพุล (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

การเปลี่ยนแปลงโค้ดของคุณพร้อมสำหรับการดึงคำขอแล้ว

ทำตามขั้นตอนต่อไปนี้เพื่อสร้างการประชาสัมพันธ์ไปยังที่เก็บ terraform-google-modules/terraform-google-cloud-storage

  1. ไปที่หน้าหลักของที่เก็บในเว็บเบราว์เซอร์
  2. คุณจะเห็นคำแนะนำผ่านแบนเนอร์เพื่อเปิดประชาสัมพันธ์จากส้อมของคุณ คลิก "เปรียบเทียบและดึงคำขอ"

60e7ae0cbc11588e.png

  1. ป้อนชื่อและคำอธิบายคำขอดึงเพื่ออธิบายการเปลี่ยนแปลงโค้ด ใช้ข้อความที่กระชับมากที่สุดเท่าที่จะทำได้

329342f7e9d64410.png

  1. ในการสร้างคำขอพุลที่พร้อมตรวจสอบ ให้คลิก "สร้างคำขอพุล"
  2. คุณจะเห็นทริกเกอร์ Cloud Build ทำงานอยู่ ซึ่งมีการทริกเกอร์เนื่องจาก PR
  3. โปรดดูเอกสาร GitHub อย่างเป็นทางการเกี่ยวกับการเปิดการดึงคำขอจาก Forks หากพบปัญหา

คุณพุชการเปลี่ยนแปลงโค้ดครั้งแรกไปยังสาขาที่แยกเป็น 2 ส่วนและเพิ่ม CFT PR แรกไปยังสาขาหลักเรียบร้อยแล้ว

12. ขอแสดงความยินดี

ขอแสดงความยินดี คุณเพิ่มฟีเจอร์ในโมดูล CFT เรียบร้อยแล้วและส่งเอกสารประชาสัมพันธ์เพื่อรับการตรวจสอบ

คุณเพิ่มฟีเจอร์ลงในโมดูล CFT, ทดสอบในเครื่องผ่านตัวอย่าง และทำการทดสอบก่อนที่จะยืนยันโค้ดไปยัง GitHub สุดท้าย คุณได้ยื่นการประชาสัมพันธ์ให้ตรวจสอบ และรวมตัวเป็น CFT ในขั้นสุดท้าย

ตอนนี้คุณก็ได้ทราบขั้นตอนสำคัญในการเริ่มต้นใช้งาน Cloud Foundation Toolkit แล้ว