1. ข้อมูลเบื้องต้นเกี่ยวกับ CFT 101
อัปเดตล่าสุด: 11-02-2022
Cloud Foundation Toolkit คืออะไร
โดยพื้นฐานแล้ว CFT มีเทมเพลตแนวทางปฏิบัติแนะนำเพื่อเริ่มต้นใช้งาน Google Cloud Platform อย่างรวดเร็ว ในบทแนะนำนี้ คุณจะได้เรียนรู้วิธีมีส่วนร่วมในการใช้ Cloud Foundation Toolkit
สิ่งที่ต้องมี
- บัญชี GitHub
- ติดตั้ง Docker ในเครื่องหรือใช้ Cloud Shell ( การติดตั้งใน Mac, การติดตั้งใน Windows)
- เครื่องมือแก้ไขโค้ดสำหรับแก้ไขโค้ด (เช่น Visual Studio Code)
- มีความคุ้นเคยกับ Git และ GitHub ในระดับพื้นฐาน
- มีประสบการณ์เกี่ยวกับ Terraform และโครงสร้างพื้นฐานเป็นโค้ดบ้าง
- สิทธิ์ในการมอบบทบาทผู้สร้างโปรเจ็กต์ให้กับบัญชีบริการ
- องค์กร Google Cloud, โฟลเดอร์ทดสอบ และบัญชีสำหรับการเรียกเก็บเงิน
สิ่งที่คุณจะสร้าง
ใน Codelab นี้ คุณจะได้ดูวิธีมีส่วนร่วมใน Cloud Foundation Toolkit (CFT)
สิ่งที่จะเกิดขึ้นกับคุณมีดังนี้
- ตั้งค่าสภาพแวดล้อมการทํางานสําหรับการมีส่วนร่วมใน CFT
- เพิ่มฟีเจอร์ลงในโมดูล CFT
- เพิ่มการทดสอบสําหรับฟีเจอร์ที่เพิ่ม
- ดำเนินการทดสอบการผสานรวมใน CFT
- เรียกใช้การทดสอบ Lint
- คอมมิตโค้ดไปยัง GitHub และส่งคำขอพุล (PR)
คุณจะดำเนินการตามขั้นตอนด้านบนทั้งหมดได้โดยเพิ่มฟีเจอร์ใหม่ลงในโมดูล CFT ของ Google Cloud Storage คุณจะเพิ่มป้ายกำกับชื่อ "silly_label"
ซึ่งระบบจะเพิ่มลงในที่เก็บข้อมูลทั้งหมดที่สร้างผ่านโมดูล CFT ของ GCS โดยอัตโนมัติ นอกจากนี้ คุณยังจะได้เขียนการทดสอบเพื่อตรวจสอบฟีเจอร์และตรวจสอบการผสานรวมจากต้นทางถึงปลายทาง
2. ตั้งค่าสภาพแวดล้อมสำหรับนักพัฒนาซอฟต์แวร์
คุณใช้ Cloud Shell เพื่อการพัฒนาได้ หากต้องการ หากไม่ต้องการใช้ Cloud Shell เพื่อมีส่วนร่วมใน CFT คุณสามารถตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์บนเครื่องได้
ตั้งค่า Git
GitHub สร้างขึ้นตามระบบควบคุมเวอร์ชันโอเพนซอร์ส (VCS) ที่เรียกว่า Git Git จะรับผิดชอบต่อทุกอย่างที่เกี่ยวข้องกับ GitHub ซึ่งเกิดขึ้นในเครื่องหรือ Cloud Shell
- เมื่อใช้ 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 เรียบร้อยแล้ว และควรที่จะแยกสาขา สร้าง และโคลนสาขาได้ เราจะใช้ Git อย่างกว้างขวางใน Codelab นี้
3. แยกที่เก็บข้อมูล GCS ของ CFT
แยกที่เก็บ CFT
คุณตั้งค่า Git บนเครื่องภายในหรือ Cloud Shell ได้ในขั้นตอนก่อนหน้า ตอนนี้คุณต้องแยกรีโป CFT ของ Google Cloud Storage เพื่อเริ่มมีส่วนร่วม
การแยกเป็นสำเนาของที่เก็บ การแยกที่เก็บช่วยให้คุณทดสอบการเปลี่ยนแปลงได้อย่างอิสระโดยไม่ส่งผลต่อโปรเจ็กต์เดิม
โดยทั่วไปแล้ว การแยกไปใช้งานจะใช้เพื่อเสนอการเปลี่ยนแปลงในโปรเจ็กต์ของผู้อื่น หรือเพื่อใช้โปรเจ็กต์ของผู้อื่นเป็นจุดเริ่มต้นสำหรับไอเดียของคุณเอง
ตัวอย่างเช่น คุณใช้ส้อมเพื่อเสนอการเปลี่ยนแปลงที่เกี่ยวข้องกับการแก้ไขข้อบกพร่องได้ วิธีแก้ไขข้อบกพร่องมีดังนี้
- แยกที่เก็บ
- แก้ไขปัญหา
- ส่งคำขอดึงข้อมูลไปยังเจ้าของโปรเจ็กต์
ขั้นตอนในการแยกรีโป CFT
- เปิดเว็บเบราว์เซอร์และไปที่ที่เก็บข้อมูล terraform-google-modules/terraform-google-cloud-storage เราจะใช้ที่เก็บข้อมูลนี้ตลอดทั้ง Codelab
- คลิกแยกที่มุมขวาบนของหน้า
- คุณจะเห็นตัวเลือกตำแหน่งที่ต้องการให้แยกหน้าจอ เลือกโปรไฟล์ และที่เก็บจะถูกแยกออก
โคลนการแยกของคุณในเครื่อง
การแยกที่สร้างขึ้นคือสําเนาของที่เก็บโมดูล GCS คุณจะโคลนที่เก็บนี้ไปยังสภาพแวดล้อมในเครื่องเพื่อเพิ่มฟีเจอร์ใหม่ได้แล้ว
ขั้นตอนในการโคลนข้อมูล Fork มีดังนี้
- เปิดเว็บเบราว์เซอร์และไปที่โฟลว์ของคุณใน terraform-google-modules/terraform-google-cloud-storage
- ที่มุมขวาบน คุณจะเห็นปุ่ม "โค้ด" ให้คลิกปุ่มดังกล่าว
- หลังจากคลิกปุ่ม "โค้ด" แล้ว ให้คลิกไอคอน "คัดลอก" เพื่อคัดลอก URL ของการแยก คุณจะใช้ URL นี้เพื่อโคลนส้อมไปยังสภาพแวดล้อมในเครื่อง
- ไปที่เทอร์มินัลใน VSCode หรือเครื่อง แล้วโคลนส้อม
$ git clone <url>
# This command will clone your fork locally.
# Paste the copied URL from the previous step.
- เมื่อโคลนข้อมูล Fork ไว้ในเครื่องแล้ว คุณควรไปที่รีโป สร้างสาขาใหม่จาก Fork และทําการเปลี่ยนแปลงโค้ดในสาขาชั่วคราว
ตามธรรมเนียมแล้ว คุณสามารถตั้งชื่อสาขาได้ดังนี้
- สำหรับคำขอฟีเจอร์:
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 หลัก
ก่อนสร้างบัญชีบริการ คุณต้องเลือกโปรเจ็กต์ที่จะโฮสต์บัญชี นอกจากนี้ คุณยังสร้างโปรเจ็กต์ใหม่ได้อีกด้วย
gcloud config set core/project YOUR_PROJECT_ID
3.2 เปิดใช้ Google Cloud API
เปิดใช้ Google Cloud API ต่อไปนี้ในโปรเจ็กต์ต้นทาง
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
หากต้องการสร้างสภาพแวดล้อมการทดสอบ คุณต้องดาวน์โหลดคีย์บัญชีบริการลงในเชลล์
4.1 คีย์บัญชีบริการ
สร้างและดาวน์โหลดคีย์บัญชีบริการสำหรับ Terraform
gcloud iam service-accounts keys create cft.json --iam-account=${SERVICE_ACCOUNT}
4.2 ตั้งค่าข้อมูลเข้าสู่ระบบ Terraform
ระบุคีย์ให้กับ Terraform โดยใช้ตัวแปรสภาพแวดล้อม SERVICE_ACCOUNT_JSON
โดยตั้งค่าเป็นเนื้อหาของคีย์บัญชีบริการ
export SERVICE_ACCOUNT_JSON=$(< cft.json)
หลังจากจัดเก็บข้อมูลเข้าสู่ระบบไว้ในตัวแปรสภาพแวดล้อมแล้ว ให้นำไฟล์คีย์ออก คุณสร้างคีย์อีกครั้งในภายหลังได้หากจำเป็นโดยใช้คำสั่งเดียวกันด้านบน
rm -rf cft.json
5. สร้างโปรเจ็กต์ทดสอบสําหรับการทําให้ Terraform ใช้งานได้
เมื่อเตรียมทุกอย่างเรียบร้อยแล้ว คุณสามารถสร้างโปรเจ็กต์ทดสอบด้วยคําสั่งเดียว เรียกใช้คำสั่งนี้จากรากของไดเรกทอรี terraform-google-cloud-storage
make docker_test_prepare
คุณจะเห็นเอาต์พุตด้านล่างเมื่อเรียกใช้ make docker_test_prepare
ในตอนท้าย คุณจะได้รับ test_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 ตามที่คุณเห็นด้านล่างในโครงสร้างโฟลเดอร์
เนื่องจาก "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 ใน variables.tf ที่คุณเห็นในโครงสร้างโฟลเดอร์ด้านบน
คัดลอกและวางโค้ดด้านล่างลงในบรรทัด 31 ใน variables.tf และตรวจสอบว่าคุณมีอักขระบรรทัดใหม่เหนือและใต้บล็อกตัวแปรที่เพิ่ม
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" ลงใน examples/multiple-buckets/main.tf
ระบบจะใช้ตัวอย่างนี้ในขั้นตอนถัดไปเพื่อทำการทดสอบการผสานรวม
คัดลอกบรรทัด silly_label ของตัวแปรด้านล่างไปยังบรรทัดที่ 27 ใน main.tf ที่ terraform-google-cloud-storage/examples/multiple-buckets/ ตามที่เห็นในโครงสร้างโฟลเดอร์
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 ซึ่งอยู่ในโครงสร้างโฟลเดอร์ด้านล่าง
คุณเพิ่ม "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 เพื่อความสะดวก
กลยุทธ์ทั่วไปสำหรับการทดสอบเหล่านี้คือการยืนยันลักษณะการทํางานของโมดูลตัวอย่าง เพื่อให้มั่นใจว่าโมดูลรูท โมดูลย่อย และโมดูลตัวอย่างทํางานได้อย่างถูกต้อง
ในการดําเนินการแบบอินเทอร์แอกทีฟ คุณจะดําเนินการแต่ละขั้นตอนผ่านคําสั่งหลายรายการ
- เรียกใช้
make docker_run
เพื่อเริ่มการทดสอบคอนเทนเนอร์ Docker ในโหมดอินเทอร์แอกทีฟ
Make เป็นเครื่องมืออัตโนมัติของบิลด์ที่จะสร้างโปรแกรมสั่งการและไลบรารีจากซอร์สโค้ดโดยอัตโนมัติด้วยการอ่านไฟล์ที่เรียกว่า Makefiles ซึ่งระบุวิธีดึงข้อมูลโปรแกรมเป้าหมาย เมื่อคุณทำการเปลี่ยนแปลงไฟล์ ระบบจะอัปเดตคอนเทนเนอร์ Docker โดยอัตโนมัติ
เมื่อเรียกใช้ make docker_run
จะเป็นการสร้างเวิร์กスペースในคอนเทนเนอร์ Docker และเปิดใช้งานข้อมูลเข้าสู่ระบบสําหรับบัญชีบริการ ระบบจะใช้เวิร์กスペースในขั้นตอนถัดไปเพื่อทำการทดสอบ
คุณจะเห็นเอาต์พุตด้านล่างในเทอร์มินัล
Activated service account credentials for: [cft@<PROJECT_ID>.iam.gserviceaccount.com]
- เรียกใช้
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
- เรียกใช้
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)
- เรียกใช้
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
- เรียกใช้
cft test run <EXAMPLE_NAME> --stage verify
เพื่อยืนยันว่าตัวอย่างสร้างโครงสร้างพื้นฐานตามที่คาดไว้
ขั้นตอนนี้จะเรียกใช้ฟังก์ชัน 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
- เรียกใช้
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
- เรียกใช้
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) ในที่เก็บหลักหลังจากคอมมิตโค้ดไปยังที่เก็บแล้ว
เมื่อคุณประชาสัมพันธ์ ผู้ดูแลระบบที่เก็บจะได้รับแจ้งให้ตรวจสอบการเปลี่ยนแปลงโค้ดที่เสนอ นอกจากนี้ คุณยังเพิ่มผู้ใช้คนอื่นๆ เป็นผู้ตรวจสอบเพื่อรับความคิดเห็นเกี่ยวกับการเปลี่ยนแปลงโค้ดได้ด้วย PR จะทริกเกอร์ Cloud Build ซึ่งจะทำการทดสอบในรีโป
ผู้ตรวจสอบโค้ดจะแสดงความคิดเห็นเกี่ยวกับโค้ดและให้คุณแก้ไขหากจำเป็นต้องเปลี่ยนแปลงบางอย่างตามแนวทางปฏิบัติแนะนำและเอกสารประกอบ โดยอิงตามการเปลี่ยนแปลงโค้ดของคุณ ผู้ดูแลระบบจะตรวจสอบการเปลี่ยนแปลงโค้ดของคุณ ตรวจสอบว่าโค้ดเป็นไปตามข้อกำหนดของรีโป และอาจขอให้คุณทำการเปลี่ยนแปลงบางอย่างอีกครั้งก่อนที่จะผสานโค้ดของคุณลงในรีโปหลัก
ทำตามขั้นตอนต่อไปนี้เพื่อคอมมิตโค้ดไปยังสาขาที่แยกออกมาและพุชโค้ดไปยังสาขาที่แยกออกมา
- ขั้นตอนแรกคือเพิ่มไฟล์ที่เปลี่ยนแปลงลงในที่เก็บข้อมูลในเครื่อง
$ 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
- ไฟล์ของคุณเสร็จสมบูรณ์แล้ว ขั้นตอนถัดไปคุณจะต้องดำเนินการเปลี่ยนแปลง
$ 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.
- พุชการเปลี่ยนแปลงที่คอมมิตไว้ในที่เก็บข้อมูลในเครื่องไปยัง 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
การเปลี่ยนแปลงโค้ดของคุณพร้อมสำหรับคำขอดึงข้อมูลแล้ว
ทําตามขั้นตอนต่อไปนี้เพื่อสร้าง PR ไปยัง terraform-google-modules/terraform-google-cloud-storage repo:
- ไปที่หน้าหลักของที่เก็บในเว็บเบราว์เซอร์
- คุณจะเห็นคำแนะนำผ่านแบนเนอร์ให้เปิด PR จากสาขาที่แยกออกมา คลิก "เปรียบเทียบและดึงคำขอ"
- ป้อนชื่อและคำอธิบายคำขอดึงข้อมูลเพื่ออธิบายการเปลี่ยนแปลงโค้ด คุณควรใช้คำที่เฉพาะเจาะจงมากที่สุดและใช้ชื่อที่กระชับ
- ในการสร้างคำขอพุลที่พร้อมตรวจสอบ ให้คลิก "สร้างคำขอพุล"
- คุณจะเห็นทริกเกอร์ Cloud Build ที่ทำงานอยู่ซึ่งทริกเกอร์โดย PR
- โปรดดูเอกสารอย่างเป็นทางการของ GitHub เกี่ยวกับการเปิดคำขอดึงข้อมูลจากสาขาหากพบปัญหา
คุณได้พุชการเปลี่ยนแปลงโค้ดแรกไปยังสาขาที่แยกออกมาและส่ง PR CFT รายการแรกเทียบกับสาขาหลักเรียบร้อยแล้ว
12. ขอแสดงความยินดี
ขอแสดงความยินดี คุณเพิ่มฟีเจอร์ในโมดูล CFT เรียบร้อยแล้วและส่งเอกสารประชาสัมพันธ์เพื่อรับการตรวจสอบ
คุณเพิ่มฟีเจอร์ลงในโมดูล CFT, ทดสอบในเครื่องผ่านตัวอย่าง และทำการทดสอบก่อนที่จะยืนยันโค้ดไปยัง GitHub สุดท้าย คุณส่ง PR เพื่อรับการตรวจสอบและผสานรวมครั้งสุดท้ายใน CFT
ตอนนี้คุณก็ได้ทราบขั้นตอนสำคัญในการเริ่มต้นใช้งาน Cloud Foundation Toolkit แล้ว