Cloud Foundation Toolkit 101

1. مقدمه ای بر CFT 101

ea557448aaa1fffc.png

آخرین به روز رسانی: 03-03-2020

Cloud Foundation Toolkit چیست؟

در اصل، CFT بهترین الگوها را برای شروع سریع در Google Cloud Platform ارائه می دهد. در این آموزش، نحوه مشارکت در Cloud Foundation Toolkit را خواهید آموخت.

آنچه شما نیاز دارید

  • یک حساب GitHub
  • Docker نصب شده روی دستگاه شما ( نصب مک ، نصب ویندوز )
  • ویرایشگر کد برای ویرایش کد (مثال: کد ویژوال استودیو )
  • آشنایی اولیه با Git و GitHub
  • برخی تجربه با Terraform و زیرساخت به عنوان کد
  • اجازه اعطای نقش سازنده پروژه به یک حساب سرویس

چیزی که خواهی ساخت

در این نرم‌افزار، شما می‌خواهید یاد بگیرید که چگونه در Cloud Foundation Toolkit (CFT) مشارکت کنید.

شما:

  • یک محیط توسعه دهنده برای مشارکت در CFT راه اندازی کنید
  • یک ویژگی به ماژول CFT اضافه کنید
  • آزمایش هایی را برای ویژگی اضافه شده اضافه کنید
  • انجام تست های یکپارچه سازی در CFT
  • تست های پرز را اجرا کنید
  • کد را به 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 از یک نام کاربری برای مرتبط کردن commit ها با یک هویت استفاده می کند. نام کاربری Git با نام کاربری GitHub شما یکسان نیست.

با استفاده از دستور git config می توانید نام مرتبط با commit های Git خود را تغییر دهید. تغییر نام مرتبط با commit های Git شما با استفاده از git config تنها بر commit های آینده تاثیر می گذارد و نام مورد استفاده برای commit های گذشته را تغییر نمی دهد.

Git را با موفقیت راه‌اندازی کرده‌اید و باید بتوانید شاخه‌ها را فورک، ایجاد و شبیه‌سازی کنید. ما از Git به طور گسترده در این Codelab استفاده خواهیم کرد.

3. Fork CFT's GCS Repository

یک مخزن CFT را فورک کنید

شما Git را در دستگاه محلی یا Cloud Shell خود در مرحله قبلی راه اندازی می کنید. اکنون باید مخزن CFT Google Cloud Storage را جدا کنید تا شروع به مشارکت کنید.

چنگال یک کپی از یک مخزن است. Forking یک مخزن به شما امکان می دهد آزادانه تغییرات را بدون تأثیر بر پروژه اصلی آزمایش کنید.

معمولاً از فورک ها برای پیشنهاد تغییرات در پروژه شخص دیگری یا استفاده از پروژه شخص دیگری به عنوان نقطه شروع ایده خود استفاده می شود.

برای مثال، می‌توانید از فورک‌ها برای پیشنهاد تغییرات مربوط به رفع اشکال استفاده کنید. برای رفع یک باگ، می توانید:

  • مخزن را چنگال کنید.
  • درستش کن
  • یک درخواست کشش به مالک پروژه ارسال کنید.

مراحل تشکیل یک مخزن CFT:

  1. مرورگر وب خود را باز کنید و به مخزن terraform-google-modules/terraform-google-cloud-storage بروید. ما از این مخزن برای کل Codelab استفاده خواهیم کرد.
  2. در گوشه سمت راست بالای صفحه، روی Fork کلیک کنید.

e3894c6de6a732b4.png

  1. گزینه ای به شما ارائه می شود که در آن می خواهید چنگال را داشته باشید، نمایه خود را انتخاب کنید و مخزن فورک خواهد شد.

چنگال خود را به صورت محلی کلون کنید

فورکی که ایجاد کردید یک کپی از مخزن ماژول GCS است. اکنون این مخزن را در محیط محلی خود کلون می کنید تا ویژگی جدید خود را اضافه کنید.

مراحل کلون کردن چنگال:

  1. مرورگر وب خود را باز کنید و به فورک خود در terraform-google-modules/terraform-google-cloud-storage بروید.
  2. در گوشه سمت راست بالا دکمه "Clone or download" را پیدا خواهید کرد، روی آن کلیک کنید.

3bfa87b9f7f01f61.png

  1. بعد از اینکه روی دکمه "Clone or download" کلیک کردید، روی نماد "Notepad" کلیک کنید تا URL فورک کپی شود. شما از این URL برای شبیه سازی فورک خود در محیط محلی خود استفاده خواهید کرد.

dbf3682d004e0ee0.png

  1. به ترمینال در VSCode یا دستگاه خود بروید و فورک را شبیه سازی کنید.
$ git clone <url>
# This command will clone your fork locally.
# Paste the copied URL from the previous step.
  1. اکنون که فورک خود را به صورت محلی کلون کرده اید، باید به مخزن خود بروید، یک شاخه جدید از فورک ایجاد کنید و کد را در شاخه موقت تغییر دهید.

طبق قرارداد، می توانید شعبه خود را به صورت زیر نام گذاری کنید:

  • برای درخواست های ویژگی: 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 را نصب کنید

اگر از GCP Cloud Shell استفاده می کنید، نیازی به نصب Google Cloud SDK ندارید.

به 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 حساب سرویس خود را تنظیم کنید

قبل از ایجاد یک محیط آزمایشی، باید یک کلید حساب کاربری را در محیط آزمایشی خود دانلود کنید. این حساب سرویس به نقش‌های Project Creator، Billing Account User و Organization Viewer نیاز دارد. این مراحل به شما کمک می‌کند یک حساب سرویس جدید ایجاد کنید، اما می‌توانید از یک حساب موجود نیز استفاده مجدد کنید.

3.1 پروژه Seed GCP را ایجاد یا انتخاب کنید

قبل از ایجاد حساب سرویس خود، باید پروژه ای را برای میزبانی آن انتخاب کنید. همچنین می توانید یک پروژه جدید ایجاد کنید.

gcloud config set core/project YOUR_PROJECT_ID

3.2 Google Cloud APIs را فعال کنید

APIهای Google Cloud زیر را در پروژه 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 organizations add-iam-policy-binding ${TF_VAR_org_id} \
  --member="serviceAccount:${SERVICE_ACCOUNT}" \
  --role="roles/resourcemanager.organizationViewer"

اکنون یک حساب سرویس دارید که می تواند برای مدیریت محیط تست استفاده شود.

4. نقش کاربر حساب صورتحساب را در منبع حساب صورتحساب اختصاص دهید

4.1 سیاست IAM حساب صورت‌حساب را واکشی کنید

الزامات خط مشی IAM موجود در حساب صورت‌حساب را دانلود کنید

gcloud beta billing accounts get-iam-policy ${TF_VAR_billing_account} | tee policy.yml

4.2 خط‌مشی را به‌روزرسانی کنید تا حساب سرویس را نیز شامل شود

فایل policy.yml را به‌روزرسانی کنید تا یک اتصال جدید برای حساب سرویس با roles/billing.user اضافه کنید.

bindings:
- members:
  - serviceAccount:cft-onboarding@<YOUR_PROJECT_ID>.iam.gserviceaccount.com
  role: roles/billing.user

4.3 خط مشی حساب صورتحساب را به روز کنید

تغییرات را روی حساب صورتحساب اعمال کنید

gcloud beta billing accounts set-iam-policy ${TF_VAR_billing_account} policy.yml

5. اعتبار Terraform را آماده کنید

برای ایجاد محیط تست، باید کلید حساب کاربری سرویس را در پوسته خود دانلود کنید.

5.1 کلید حساب خدمات

یک کلید حساب کاربری برای Terraform ایجاد و دانلود کنید

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

5.2 راه اندازی اعتبار Terraform

کلید Terraform را با استفاده از متغیر محیطی SERVICE_ACCOUNT_JSON تامین کنید و مقدار را برای محتویات کلید حساب سرویس خود تنظیم کنید.

export SERVICE_ACCOUNT_JSON=$(< cft.json)

6. پروژه آزمایشی برای استقرار Terraform ایجاد کنید

اکنون که همه چیز آماده است، می توانید با یک دستور پروژه آزمایشی را ایجاد کنید. این دستور را از ریشه دایرکتوری terraform-google-cloud-storage اجرا کنید:

make docker_test_prepare

هنگامی که make docker_test_prepare را اجرا می کنید خروجی زیر را خواهید دید، در پایان پروژه_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 را همانطور که در زیر می بینید در ساختار پوشه باز کنید.

17f2d3b9893be853.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(element(var.names, count.index))}", ".", "-") }, { "silly" = var.silly_label })
 force_destroy = lookup(
 <...>
}

حالا متغیر silly_label را در variables.tf که در ساختار پوشه بالا می بینید اضافه می کنید.

کد زیر را کپی کنید و آن را به خط 29 در 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/ کپی کنید، همانطور که در ساختار پوشه مشاهده می شود:

408cb1365b2a0793.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. برای بررسی ویژگی یک تست Inspect بنویسید

شما ویژگی خود را به main.tf ماژول اضافه کرده اید و سپس ویژگی را به مثال multiple_buckets اضافه کرده اید تا از طریق فیکسچر آزمایش شود. شما باید ویژگی خود را از طریق یک تست ادغام InSpec که به زبان Ruby نوشته شده است آزمایش کنید.

شما تست های جدید خود را در فایل gsutil.rb که در ساختار پوشه زیر یافت می شود اضافه خواهید کرد:

b2bfeb203477e0c8.png

شما "silly_label" را روی همه سطل‌هایی که از طریق ماژول multiple_buckets ایجاد می‌شوند اضافه کرده‌اید و اکنون باید تست‌هایی بنویسید تا ویژگی جدید را آزمایش کنید.

در کد زیر، برچسب هر سطل را از طریق دستور gsutil دریافت می کنید و سپس خروجی برگشتی از دستور را بررسی می کنید.

terraform-google-cloud-storage/test/integration/multiple-buckets/controls/gsutil.rb

control "gsutil" do
 <..>

# CODELAB: Copy paste the below test in gsutil.rb to test silly_label feature.

# command to get the labels for bucket_1
describe command("gsutil label get gs://#{attribute("names_list")[0]}") do
   //check if the command gave a valid response
   its(:exit_status) { should eq 0 }
   its(:stderr) { should eq "" }

   //parse the command's output into JSON
   let!(:data) do
     if subject.exit_status == 0
         JSON.parse(subject.stdout)
     else
         {}
     end
   end

   # check if bucket_1 has the new "silly" label with the value "awesome"
   describe "bucket_1" do
   it "has label" do
       data.each do |bucket|
           expect(data["silly"]).to include("awesome")
       end
     end
   end
 end

8. تست های یکپارچه سازی در CFT را اجرا کنید

تست یکپارچه سازی

تست های یکپارچه سازی برای بررسی رفتار ماژول ریشه، زیر ماژول ها و ماژول های نمونه استفاده می شود. اضافات، تغییرات و اصلاحات باید همراه با آزمایش باشد.

تست‌های ادغام با استفاده از Kitchen ، Kitchen-Terraform و InSpec اجرا می‌شوند. این ابزارها برای راحتی در داخل یک تصویر داکر بسته بندی شده اند.

استراتژی کلی برای این تست‌ها این است که رفتار ماژول‌های مثال را تأیید کنیم، بنابراین اطمینان حاصل کنیم که ماژول ریشه، زیرماژول‌ها و ماژول‌های نمونه همگی از نظر عملکردی درست هستند.

در اجرای تعاملی، شما هر مرحله را از طریق چند دستور اجرا می کنید.

  1. برای شروع آزمایش کانتینر Docker در حالت تعاملی make docker_run اجرا کنید.

Make یک ابزار اتوماسیون ساخت است که به طور خودکار برنامه‌ها و کتابخانه‌های اجرایی را از کد منبع با خواندن فایل‌هایی به نام Makefiles می‌سازد که نحوه استخراج برنامه هدف را مشخص می‌کند. هنگامی که فایل را تغییر می دهید، ظرف docker باید به طور خودکار به روز شود.

هنگامی که make docker_run اجرا می کنید، یک فضای کاری در ظرف docker خود ایجاد می کنید و اعتبارنامه ها را برای حساب سرویس خود فعال می کنید. از فضای کاری در مراحل بعدی برای اجرای تست ها استفاده خواهد شد.

خروجی زیر را در ترمینال خود خواهید دید:

Activated service account credentials for: [cft@<PROJECT_ID>.iam.gserviceaccount.com]
  1. kitchen_do list را اجرا کنید تا تمام موارد موجود در فضای کاری خود را که حاوی تست های یکپارچه سازی هستند فهرست کنید.
     You will see the below output in your terminal.
    
[root@<CONTAINER_ID> workspace]# kitchen_do list
Automatically setting inputs from outputs of test/setup
Found test/source.sh. Using it for additional explicit environment configuration.
Activated service account credentials for: [cft@<PROJECT_ID>.iam.gserviceaccount.com]
Instance                  Driver     Provisioner  Verifier   Transport  Last Action  Last Error
multiple-buckets-default  Terraform  Terraform    Terraform  Ssh        Verified     <None>
  1. برای مقداردهی اولیه دایرکتوری کاری برای یک ماژول مثال kitchen_do create <EXAMPLE_NAME> اجرا کنید.

این مرحله آشپزخانه را مقداردهی اولیه می کند و ترافورم را در فضای کاری مقداردهی اولیه می کند.

خروجی زیر را در ترمینال خود خواهید دید.

[root@<CONTAINER_ID> workspace]# kitchen_do create multiple-buckets-default
Automatically setting inputs from outputs of test/setup
Found test/source.sh. Using it for additional explicit environment configuration.
Activated service account credentials for: [cft@<PROJECT_ID>.iam.gserviceaccount.com]
-----> Starting Kitchen (v1.24.0)
-----> Creating <multiple-buckets-default>...
       Terraform v0.12.12
       + provider.google v3.10.0
       
       Your version of Terraform is out of date! The latest version
       is 0.12.21. You can update by downloading from www.terraform.io/downloads.html
$$$$$$ Running command `terraform init -input=false -lock=true -lock-timeout=0s  -upgrade -force-copy -backend=true  -get=true -get-plugins=true -verify-plugins=true` in directory /workspace/test/fi
xtures/multiple_buckets
       Upgrading modules...
       - example in ../../../examples/multiple_buckets
       - example.cloud_storage in ../../..
       
       Initializing the backend...
       
       Initializing provider plugins...
       - Checking for available provider plugins...
       - Downloading plugin for provider "google" (hashicorp/google) 2.18.1...
       - Downloading plugin for provider "random" (hashicorp/random) 2.2.1...
       
       Terraform has been successfully initialized!
$$$$$$ Running command `terraform workspace select kitchen-terraform-multiple-buckets-default` in directory /workspace/test/fixtures/multiple_buckets
       Finished creating <multiple-buckets-default> (0m11.01s).
-----> Kitchen is finished. (0m12.62s)
  1. برای اعمال ماژول مثال kitchen_do converge <EXAMPLE_NAME> را اجرا کنید.

این مرحله فضای کاری terraform را که در مرحله قبل ایجاد شده بود به پروژه GCP که قبلاً در Codelab ایجاد شده بود اعمال می کند.

خروجی زیر را در ترمینال خود خواهید دید.

[root@<CONTAINER_ID> workspace]# kitchen_do converge multiple-buckets-default
Automatically setting inputs from outputs of test/setup
Found test/source.sh. Using it for additional explicit environment configuration.
Activated service account credentials for: [cft@<YOUR_PROJECT_ID>.iam.gserviceaccount.com]
-----> Starting Kitchen (v1.24.0)
-----> Converging <multiple-buckets-default>...
       Terraform v0.12.20
       + provider.google v3.9.0
       
       Your version of Terraform is out of date! The latest version
       is 0.12.21. You can update by downloading from https://www.terraform.io/downloads.html
$$$$$$ Running command `terraform workspace select kitchen-terraform-multiple-buckets-default` in directory /workspace/test/fixtures/multiple_buckets
$$$$$$ Running command `terraform get -update` in directory /workspace/test/fixtures/multiple_buckets
       - example in ../../../examples/multiple_buckets
       - example.cloud_storage in ../../..
$$$$$$ Running command `terraform validate   ` in directory /workspace/test/fixtures/multiple_buckets
       Success! The configuration is valid.
       
$$$$$$ Running command `terraform apply -lock=true -lock-timeout=0s -input=false -auto-approve=true  -parallelism=10 -refresh=true  ` in directory /workspace/test/fixtures/multiple_buckets
       random_pet.main: Creating...
       random_pet.main: Creation complete after 0s [id=<BUCKET-ID>]
       module.example.module.cloud_storage.google_storage_bucket.buckets[0]: Creating...
       module.example.module.cloud_storage.google_storage_bucket.buckets[1]: Creating...
       module.example.module.cloud_storage.google_storage_bucket.buckets[1]: Creation complete after 3s [id=<BUCKET-ID-01>]
       module.example.module.cloud_storage.google_storage_bucket.buckets[0]: Creation complete after 3s [id=<BUCKET-ID-02>]
       
       Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
       
       Outputs:
       
       names = {
         "one" = "<BUCKET-ID-01>"
         "two" = "<BUCKET-ID-02>"
       }
       names_list = [
         "<BUCKET-NAME-01>",
         "<BUCKET-NAME-02>",
       ]
       project_id = ci-cloud-storage-ae79
       Finished converging <multiple-buckets-default> (0m7.17s).
-----> Kitchen is finished. (0m8.77s)
  1. برای آزمایش ماژول نمونه kitchen_do verify <EXAMPLE_NAME> را اجرا کنید.

این مرحله از طریق فایل gsutils.rb که شامل تست‌هایی برای ماژول multiple_buckets است اجرا می‌شود. هر آزمایش دارای یک دستور gsutil است که در برابر پروژه آزمایشی که قبلاً با استفاده از تنظیمات اعتبار حساب سرویس ایجاد کرده اید اجرا می شود.

اگر خطایی دریافت کردید، خواهید دید که چه چیزی مورد انتظار بود و چه چیزی توسط فرمان برای تست دریافت شد.

خروجی زیر را در ترمینال خود خواهید دید.

multiple_buckets local: Verifying

Profile: multiple_buckets
Version: (not specified)
Target:  local://

  ✔  gsutil: gsutil
     ✔  Command: `gsutil ls -p <PROJECT_ID>` exit_status should eq 0
     ✔  Command: `gsutil ls -p <PROJECT_ID>` stderr should eq ""
     ✔  Command: `gsutil ls -p <PROJECT_ID>` stdout should include "multiple-buckets-mzgy-eu-one"
     ✔  Command: `gsutil ls -p <PROJECT_ID>` stdout should include "<BUCKET-ID-01>"
     ✔  Command: `gsutil bucketpolicyonly get gs://<BUCKET-ID-01>` exit_status should eq 0
     ✔  Command: `gsutil bucketpolicyonly get gs://<BUCKET-ID-01>` stderr should eq ""
     ✔  Command: `gsutil bucketpolicyonly get gs://<BUCKET-ID-01>` stdout should include "Enabled: True"
     ✔  Command: `gsutil bucketpolicyonly get gs://<BUCKET-ID-02>` exit_status should eq 0
     ✔  Command: `gsutil bucketpolicyonly get gs://<BUCKET-ID-02>` stderr should eq ""
     ✔  Command: `gsutil bucketpolicyonly get gs://<BUCKET-ID-02>` stdout should include "Enabled: False"
     ✔  Command: `gsutil label get gs://<BUCKET-ID-01>` exit_status should eq 0
     ✔  Command: `gsutil label get gs://<BUCKET-ID-01>` stderr should eq ""
     ✔  Command: `gsutil label get gs://<BUCKET-ID-01>` bucket_1 has label
     ✔  Command: `gsutil label get gs://<BUCKET-ID-02>` exit_status should eq 0
     ✔  Command: `gsutil label get gs://<BUCKET-ID-02>` stderr should eq ""
     ✔  Command: `gsutil label get gs://<BUCKET-ID-02>` bucket_2 has label
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-01>` should eq "NEARLINE"
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-01>` should eq "SetStorageClass"
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-01>` should eq 10
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-01>` should eq false
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-01>` should eq ["MULTI_REGIONAL", "STANDARD", "DURABLE_REDUCED_AVAILABILITY"]
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-01>` exit_status should eq 0
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-01>` stderr should eq ""
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-02>` should eq "NEARLINE"
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-02>` should eq "SetStorageClass"
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-02>` should eq 10
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-02>` should eq false
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-02>` should eq ["MULTI_REGIONAL", "STANDARD", "DURABLE_REDUCED_AVAILABILITY"]
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-02>` exit_status should eq 0
     ✔  Command: `gsutil lifecycle get gs://<BUCKET-ID-02>` stderr should eq ""


Profile Summary: 1 successful control, 0 control failures, 0 controls skipped
Test Summary: 30 successful, 0 failures, 0 skipped
       Finished verifying <multiple-buckets-default> (0m8.83s).
-----> Kitchen is finished. (0m16.61s)
  1. برای از بین بردن حالت ماژول نمونه kitchen_do destroy <EXAMPLE_NAME> .

این مرحله فضای کاری که در مراحل بالا ایجاد کرده اید را از بین می برد. این مرحله همچنین سطل های GCS ایجاد شده در پروژه را به همراه برچسبی که به ماژول GCS اضافه کرده اید از بین می برد.

می توانید خروجی زیر را در ترمینال خود مشاهده کنید.

[root@<CONTAINER_ID> workspace]# kitchen_do destroy multiple-buckets-default
Automatically setting inputs from outputs of test/setup
Found test/source.sh. Using it for additional explicit environment configuration.
Activated service account credentials for: [ci-cloud-storage@ci-cloud-storage-54ab.iam.gserviceaccount.com]
-----> Starting Kitchen (v1.24.0)
-----> Destroying <multiple-buckets-default>...
       Terraform v0.12.12
       + provider.google v3.10.0
       
       Your version of Terraform is out of date! The latest version
       is 0.12.21. You can update by downloading from www.terraform.io/downloads.html
$$$$$$ Running command `terraform init -input=false -lock=true -lock-timeout=0s  -force-copy -backend=true  -get=true -get-plugins=true -verify-plugins=true` in directory /workspace/test/fixtures/mu
ltiple_buckets
       Initializing modules...
       
       Initializing the backend...
       
       Initializing provider plugins...
       
       Terraform has been successfully initialized!
$$$$$$ Running command `terraform workspace select kitchen-terraform-multiple-buckets-default` in directory /workspace/test/fixtures/multiple_buckets
$$$$$$ Running command `terraform destroy -auto-approve -lock=true -lock-timeout=0s -input=false  -parallelism=10 -refresh=true  ` in directory /workspace/test/fixtures/multiple_buckets
       random_string.prefix: Refreshing state... [id=mzgy]
       module.example.module.cloud_storage.google_storage_bucket.buckets[0]: Refreshing state... [id=<BUCKET-ID-01>]
       module.example.module.cloud_storage.google_storage_bucket.buckets[1]: Refreshing state... [id=<BUCKET-ID-02>]
       module.example.module.cloud_storage.google_storage_bucket.buckets[0]: Destroying... [id=<BUCKET-ID-01>]
       module.example.module.cloud_storage.google_storage_bucket.buckets[1]: Destroying... [id=<BUCKET-ID-02>]
       module.example.module.cloud_storage.google_storage_bucket.buckets[0]: Destruction complete after 1s
       module.example.module.cloud_storage.google_storage_bucket.buckets[1]: Destruction complete after 2s
       random_string.prefix: Destroying... [id=mzgy]
       random_string.prefix: Destruction complete after 0s
       
       Destroy complete! Resources: 3 destroyed.
$$$$$$ Running command `terraform workspace select default` in directory /workspace/test/fixtures/multiple_buckets
       Switched to workspace "default".
$$$$$$ Running command `terraform workspace delete kitchen-terraform-multiple-buckets-default` in directory /workspace/test/fixtures/multiple_buckets
       Deleted workspace "kitchen-terraform-multiple-buckets-default"!
       Finished destroying <multiple-buckets-default> (0m6.49s).
-----> Kitchen is finished. (0m8.10s)

9. ایجاد اسناد برای ورودی ها و خروجی ها

جداول ورودی و خروجی در README های ماژول ریشه، زیر ماژول ها و ماژول های نمونه به طور خودکار بر اساس variables و outputs ماژول های مربوطه تولید می شوند. در صورت تغییر رابط های ماژول، این جداول باید به روز شوند.

اجرا کنید:

make generate_docs
# This will generate new Inputs and Outputs tables

10. تست های پرز در CFT را اجرا کنید

Linter ابزاری است که کد منبع را تجزیه و تحلیل می کند تا خطاهای برنامه نویسی، اشکالات، خطاهای سبکی و ساختارهای مشکوک را پرچم گذاری کند.

بسیاری از فایل‌های موجود در مخزن را می‌توان برای حفظ کیفیت استاندارد پرده یا قالب‌بندی کرد. برای اطمینان از کیفیت در CFT، از تست پرز استفاده می کنید.

اجرا کنید:

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

11. ارسال روابط عمومی در Github

اکنون که کد خود را به صورت محلی تغییر داده اید و آن را از طریق تست های یکپارچه سازی آزمایش کرده اید، می خواهید این کد را در مخزن اصلی منتشر کنید.

برای در دسترس قرار دادن کد خود در مخزن اصلی، باید تغییرات کد را در شعبه خود انجام دهید و آن را به مخزن اصلی فشار دهید. برای اینکه کد شما به مخزن اصلی که در ابتدای Codelab فورک کرده اید اضافه شود، پس از تخصیص کد به مخزن خود، یک Pull Request (PR) در مخزن اصلی مطرح می کنید.

هنگامی که یک PR را مطرح می کنید، به مدیر repo اطلاع داده می شود تا تغییرات کد پیشنهادی را بررسی کند. علاوه بر این، می توانید کاربران دیگری را نیز به عنوان بازبین اضافه کنید تا در مورد تغییرات کد خود بازخورد دریافت کنید. روابط عمومی یک Cloud Build را راه‌اندازی می‌کند که آزمایش‌هایی را روی مخزن اجرا می‌کند.

بر اساس تغییرات کد شما، بازبینان کد نظراتی را در مورد کد شما ارائه می‌کنند و در صورت نیاز به تغییر بر اساس بهترین شیوه‌ها و مستندات، تغییراتی را درخواست می‌کنند. سرپرست تغییرات کد شما را بررسی می‌کند، مطمئن می‌شود که کد شما با مخزن مطابقت دارد و ممکن است دوباره از شما بخواهد قبل از ادغام کد خود در مخزن اصلی، تغییراتی ایجاد کنید.

مراحل زیر را برای ارسال کد به شاخه انشعاباتی خود و فشار دادن کد به شاخه فورک شده خود انجام دهید:

  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/controls/gsutil.rb
# 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. تغییرات متعهد در مخزن محلی خود را برای ایجاد یک درخواست کشش (PR) به GitHub فشار دهید.
$ git push -u origin master
# 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. در منوی Branch، چنگال خود را انتخاب کنید که حاوی commit های شما است.
  3. در سمت راست منوی «شاخه»، روی «درخواست کشش جدید» کلیک کنید.

40087ce52ee5ed35.png

  1. از منوی کشویی پایه "پایه" برای انتخاب شاخه ای که می خواهید تغییرات خود را در آن ادغام کنید، استفاده کنید، معمولاً این شاخه "مستر" است، زیرا شما تغییرات کد را در فورک خود انجام داده اید.
  2. عنوان و توضیحاتی را برای درخواست کشش خود وارد کنید تا تغییرات کد خود را توضیح دهید. در عین مختصر بودن تا حد امکان خاص باشید.
  3. برای ایجاد یک درخواست کشش که آماده بررسی است، روی «ایجاد درخواست کشش» کلیک کنید.

a9e70a2ec9653cd7.png

  1. تریگرهای ساخت ابر را خواهید دید که به دلیل روابط عمومی راه اندازی می شوند.

شما با موفقیت اولین تغییر کد خود را به شاخه چنگالی خود انجام دادید و اولین CFT PR خود را در برابر شاخه اصلی افزایش دادید!

12. تبریک می گویم

تبریک می گویم، شما با موفقیت یک ویژگی را به یک ماژول CFT اضافه کرده اید و یک PR را برای بررسی ارسال کرده اید!

شما یک ویژگی را به یک ماژول CFT اضافه کرده اید، آن را به صورت محلی از طریق یک مثال آزمایش کرده اید و قبل از اینکه کد خود را به GitHub بفرستید، آزمایشاتی را انجام داده اید. در نهایت، شما یک PR را برای بررسی و ادغام نهایی در CFT مطرح کردید.

اکنون مراحل مهمی را برای شروع کار با Cloud Foundation Toolkit می دانید.