Cloud Foundation Toolkit'e Giriş

1. CFT 101'e Giriş

b1d2ab0f35bb62a8.png

Son Güncelleme: 11.02.2022

Cloud Foundation Toolkit nedir?

Özetle, CFT, Google Cloud Platform'u hızlı bir şekilde kullanmaya başlamak için en iyi uygulama şablonları sağlar. Bu eğitimde, Cloud Foundation Toolkit'e nasıl katkıda bulunacağınızı öğreneceksiniz.

Gerekenler

  • GitHub hesabı.
  • Makinenize Docker yükleyin veya Cloud Shell'i kullanın ( Mac'te yükleme, Windows'ta yükleme)
  • Kod düzenlemek için kod düzenleyici (ör. Visual Studio Code)
  • Git ve GitHub hakkında temel düzeyde bilgi sahibi olma
  • Biraz Terraform ve kod olarak altyapı deneyimi
  • Hizmet hesabına Proje Oluşturucu rolü verme izni
  • Bir Google Cloud kuruluşu, test klasörü ve faturalandırma hesabı

Oluşturacağınız uygulama

Bu codelab'de, Cloud Foundation Toolkit'e (CFT) nasıl katkıda bulunacağınızı öğreneceksiniz.

Aşağıdakileri yapacaksınız:

  • CFT'ye katkıda bulunmak için geliştirme ortamı oluşturma
  • CFT modülüne özellik ekleme
  • Eklenen özellik için testler ekleyin
  • CFT'de entegrasyon testleri yürütme
  • Hata ayıklama testlerini çalıştırma
  • Kodu GitHub'a kaydetme ve pull isteği (PR) gönderme

Google Cloud Storage CFT modülüne yeni bir özellik ekleyerek yukarıdaki tüm adımları uygulayacaksınız. GCS CFT modülüyle oluşturulan tüm paketlere otomatik olarak eklenecek "silly_label" adlı bir etiket ekleyeceksiniz. Ayrıca, özelliğinizi doğrulamak ve uçtan uca entegrasyon sağlamak için testler yazacaksınız.

2. Geliştirme Ortamı Kurma

İsterseniz geliştirme amaçlarınız için Cloud Shell'i kullanabilirsiniz. CFT'ye katkıda bulunmak için Cloud Shell'i kullanmak istemiyorsanız geliştirici ortamınızı makinenizde ayarlayabilirsiniz.

Git'i kurma

GitHub, Git adı verilen açık kaynak sürüm kontrol sistemini (VCS) temel alır. Git, makinenizde veya Cloud Shell'inizde yerel olarak gerçekleşen, GitHub ile ilgili her şeyden sorumludur.

  1. Cloud Shell'i kullandığınızda git önceden yüklü olduğundan yüklemeniz gerekmez.
$ git --version
# This will display the git version on the Cloud Shell.

Geliştirme ortamınızı makinenizde kuruyorsanız Git'i yüklemeniz gerekir.

Git'te kullanıcı adınızı ve e-postanızı ayarlama

Git, taahhütleri bir kimlikle ilişkilendirmek için kullanıcı adını kullanır. Git kullanıcı adı, GitHub kullanıcı adınızla aynı değildir.

Git config komutunu kullanarak Git gönderimlerinizle ilişkili adı değiştirebilirsiniz. git config kullanarak Git gönderimlerinizle ilişkili adı değiştirmek yalnızca gelecekteki gönderimleri etkiler ve geçmiş gönderimler için kullanılan adı değiştirmez.

Git'i başarıyla kurdunuz ve dalları ayırabilir, oluşturabilir ve klonlayabilirsiniz. Bu Codelab'de Git'i yoğun bir şekilde kullanacağız.

3. CFT'nin GCS deposunu çatallama

Bir CFT deposunu çatallama

Git'i önceki adımda yerel makinenizde veya Cloud Shell'inizde ayarlamanız gerekir. Katkıda bulunmaya başlamak için Google Cloud Storage CFT deposunu çatallamanız gerekir.

Çatal, deponun bir kopyasıdır. Depoyu çatallamak, orijinal projeyi etkilemeden değişikliklerle özgürce denemeler yapmanıza olanak tanır.

Çatallama işlemi genellikle başka birinin projesinde değişiklik önermek veya başka birinin projesini kendi fikrinizin başlangıç noktası olarak kullanmak için kullanılır.

Örneğin, bir hatayı düzeltmeyle ilgili değişiklikler önermek için çatalları kullanabilirsiniz. Bir hatayı düzeltmek için:

  • Depoyu çatallayın.
  • Düzeltmeyi yapın.
  • Proje sahibine bir çekme isteği gönderin.

CFT deposunu çatallama adımları:

  1. Web tarayıcınızı açıp terraform-google-modules/terraform-google-cloud-storage deposuna gidin. Bu Codelab'in tamamında bu deposu kullanacağız.
  2. Sayfanın sağ üst köşesinde Çatal'ı tıklayın.

9dc18f15ca662b56.png

  1. Çatallamak istediğiniz yeri seçmeniz istenir. Profilinizi seçtiğinizde depo çatallanır.

Çatalınızı yerel olarak klonlayın

Oluşturduğunuz çatal, GCS modül deposunun bir kopyasıdır. Şimdi yeni özelliğinizi eklemek için bu depoyu yerel ortamınıza klonlayacaksınız.

Çatalınızı klonlamak için uygulanacak adımlar:

  1. Web tarayıcınızı açıp terraform-google-modules/terraform-google-cloud-storage adresindeki çatalınıza gidin.
  2. Sağ üst köşede "Kod" düğmesini göreceksiniz. Bu düğmeyi tıklayın.

98f8be8df319dcd8.png

  1. "Kod" düğmesini tıkladıktan sonra, çatalın URL'sini kopyalamak için "Kopyala" simgesini tıklayın. Çatalınızı yerel ortamınıza klonlamak için bu URL'yi kullanacaksınız.

e61e1da6371f2a1d.png

  1. VSCode'unuzda veya makinenizde bir terminale gidip çatalın klonunu alın.
$ git clone <url>
# This command will clone your fork locally.
# Paste the copied URL from the previous step.
  1. Çatalınızı yerel olarak klonladıktan sonra, deponuza gidip çataldan yeni bir dal oluşturmanız ve geçici dalda kod değişiklikleri yapmanız gerekir.

Kurala göre dalınızı aşağıdaki gibi adlandırabilirsiniz:

  • Özellik istekleri için: feature/feature-name
  • Dahili güncellemeler için internal/change-name
  • Hata düzeltmeleri için: bugfix/issue-name

Yeni bir özellik eklediğiniz için geçici şubenizi feature/silly_label olarak adlandırabilirsiniz.

$ 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"

Artık Cloud Foundation Toolkit'te çalışmaya başlamak için gereken her şeye sahipsiniz.

4. Test ortamı oluşturma

Standart CFT geliştirme süreci, test için izole bir test projesi kullanmaya dayanır. Bu adımda, test projesini (standart bir yapılandırmaya göre) bir hizmet hesabı üzerinden oluşturma konusunda size yol gösterilecektir.

0. Docker Engine'i yükleme

Makinenizi geliştirme amacıyla kullanıyorsanız Docker Engine'i yüklemeniz gerekir.

1. Google Cloud SDK'sını yükleyin

GCP Cloud Shell kullanıyorsanız Google Cloud SDK'yı yüklemeniz gerekmez.

Google Cloud SDK'ya gidin ve platformunuz için etkileşimli yükleyiciyi indirin.

2. Yapılandırmayı ayarlama

Test ortamı oluşturmak için bir Google Cloud kuruluşu, test klasörü ve faturalandırma hesabınız olmalıdır. Bu değerlerin ortam değişkenleri aracılığıyla ayarlanması gerekir:

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. Hizmet hesabınızı ayarlama

Test ortamı oluşturmadan önce test ortamınıza bir hizmet hesabı anahtarı indirmeniz gerekir. Bu hizmet hesabının Proje Oluşturucu, Faturalandırma Hesabı Kullanıcısı ve Kuruluş Görüntüleyici rollerine sahip olması gerekir. Bu adımlar yeni bir hizmet hesabı oluşturmanıza yardımcı olur ancak mevcut bir hesabı yeniden kullanabilirsiniz.

3.1 İlk GCP projesini oluşturun veya seçin

Hizmet hesabınızı oluşturmadan önce, barındırılacak bir proje seçmeniz gerekir. Yeni bir proje de oluşturabilirsiniz.

gcloud config set core/project YOUR_PROJECT_ID

3.2 Google Cloud API'lerini etkinleştirme

İlk projenizde aşağıdaki Google Cloud API'lerini etkinleştirin:

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

3.3 Hizmet Hesabı Oluşturma

Test ortamını yönetmek için yeni bir hizmet hesabı oluşturun:

# 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

Hizmet hesabınızın oluşturulduğunu doğrulayın:

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

3.4 Hizmet hesabına Proje Oluşturucu, Faturalandırma Hesabı Kullanıcısı ve Kuruluş Görüntüleyici rollerini verin:

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"

Artık test ortamını yönetmek için kullanılabilecek bir Hizmet Hesabınız var.

4. Terraform Kimlik Bilgilerini Hazırlama

Test ortamını oluşturmak için hizmet hesabı anahtarını kabuğunuza indirmeniz gerekir.

4.1 Hizmet Hesabı Anahtarı

Terraform için bir hizmet hesabı anahtarı oluşturun ve indirin

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

4.2 Terraform Kimlik Bilgilerini Ayarlama

Değeri hizmet hesabı anahtarınızın içerikleri olarak ayarlayarak SERVICE_ACCOUNT_JSON ortam değişkenini kullanarak anahtarı Terraform'a sağlayın.

export SERVICE_ACCOUNT_JSON=$(< cft.json)

Kimlik bilgisi bilgilerini ortam değişkeninde depoladıktan sonra anahtar dosyasını kaldırın. Gerekirse yukarıdaki komutu kullanarak daha sonra anahtar oluşturabilirsiniz.

rm -rf cft.json

5. Terraform dağıtımları için test projesi oluşturma

Her şey hazır olduğuna göre test projesini tek bir komutla oluşturabilirsiniz. Bu komutu terraform-google-cloud-storage dizininin kökünden çalıştırın:

make docker_test_prepare

make docker_test_prepare komutunu çalıştırdığınızda aşağıdaki çıktıyı görürsünüz. Sonunda , Cloud Storage modülünüzü yeni özelliğinizle dağıtıp test edeceğiniz oluşturulan test project_id değerini alırsınız. Faturalandırma hesabı bağlamayla ilgili sorun yaşarsanız sorun giderme adımlarına bakın.

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.

Konsolda göreceğiniz gibi, project_id ile referans verilen bir test projesi oluşturdunuz. Geliştirme ve test ortamınız ayarlandı.

5. CFT modülüne yeni bir özellik ekleyin

Geliştirme ve test ortamınız ayarlandığına göre "silly_label" özelliğinizi google-cloud-storage CFT modülüne eklemeye başlayalım.

terraform-google-cloud-storage klasöründe olduğunuzdan emin olun ve aşağıdaki klasör yapısında gördüğünüz gibi main.tf dosyasını açın.

ac1dba25408abd09.png

"silly_label" bir etiket olduğundan özelliği, aşağıda gördüğünüz gibi main.tf dosyasının 27. satırındaki "labels" değişkenine eklersiniz:

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

Şimdi, yukarıdaki klasör yapısında gördüğünüz variables.tf dosyasına silly_label değişkenini ekleyeceğiz.

Aşağıdaki kodu kopyalayıp variables.tf dosyasının 31. satırına ekleyin ve eklediğiniz değişken bloğunun üstünde ve altında yeni bir satır karakteri bulunduğundan emin olun.

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. Depolama alanı paketi örneğine yeni bir özellik ekleme

Özelliğinizi modülün main.tf dosyasına eklediniz. Artık eklediğiniz özelliği bir örnekle test edeceksiniz.

"silly_label", examples/multiple-buckets/main.tf dosyasına eklenmelidir.

Bu örnek, sonraki adımda entegrasyon testleri yapmak için kullanılacaktır.

Aşağıdaki silly_label değişkeni satırını, klasör yapısında görüldüğü gibi terraform-google-cloud-storage/examples/multiple-buckets/ adresindeki main.tf dosyasının 27. satırına kopyalayıp yapıştırın:

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. Özelliği kontrol etmek için taslak testini güncelleme

Özelliğinizi modülün main.tf dosyasına, ardından multiple_buckets örneğine eklediniz. Şimdi, Golang'da yazılmış bir plan entegrasyon testiyle özelliğinizi test etmeniz gerekiyor.

Yeni testlerinizi aşağıdaki klasör yapısında bulunan multiple_buckets_test.go dosyasına ekleyeceksiniz:

72ea272d4792405.png

multiple_buckets modülü aracılığıyla oluşturulan tüm paketlere "silly_label" etiketini eklediniz. Şimdi yeni özelliği test etmek için testler yazmanız gerekiyor.

Aşağıdaki kodda, gcloud alpha storage komutu aracılığıyla her bir paketin etiketini alır ve ardından komuttan döndürülen çıkışı kontrol edersiniz.

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'de entegrasyon testleri çalıştırma

Entegrasyon Testi

Entegrasyon testleri, kök modülün, alt modüllerin ve örneklerin davranışını doğrulamak için kullanılır. Eklemeler, değişiklikler ve düzeltmelere testler eşlik etmelidir.

Entegrasyon testleri, blueprint test çerçevesi kullanılarak yazılır ve CFT CLI kullanılarak çalıştırılır. Bu araçlar, kolaylık sağlamak için bir Docker görüntüsünde paketlenir.

Bu testlerin genel stratejisi, örnek modüllerin davranışını doğrulayarak kök modülün, alt modüllerin ve örnek modüllerin işlevsel olarak doğru olduğundan emin olmaktır.

Etkileşimli yürütme işleminde her adımı birden fazla komutla yürütürsünüz.

  1. Docker kapsayıcısını etkileşimli modda test etmeyi başlatmak için make docker_run komutunu çalıştırın.

Make, hedef programın nasıl türetileceğini belirten Makefiles adlı dosyaları okuyarak otomatik olarak kaynak koddan yürütülebilir programlar ve kitaplıklar oluşturan bir derleme otomasyon aracıdır. Dosya değişiklikleri yaptığınızda Docker kapsayıcısı otomatik olarak güncellenmelidir.

make docker_run komutunu çalıştırdığınızda Docker kapsayıcınızda bir çalışma alanı oluşturur ve hizmet hesabınızın kimlik bilgilerini etkinleştirirsiniz. Çalışma alanı, sonraki adımlarda testlerin çalıştırılması için kullanılacak.

Terminalinizde aşağıdaki çıkışı görürsünüz:

Activated service account credentials for: [cft@<PROJECT_ID>.iam.gserviceaccount.com]
  1. Çalışma alanınızdaki tüm şema testlerini listelemek için cft test list komutunu çalıştırın.

Terminalinizde aşağıdaki çıkışı görürsünüz:

[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. Örneği başlatmak için cft test run <EXAMPLE_NAME> --stage init komutunu çalıştırın. Bu durumda, TestMultipleBuckets test çalıştırmasını başlatmak için cft test run TestMultipleBuckets --stage init. Testleri çalıştırırken daha fazla bilgi almak için --verbose işaretini de kullanabilirsiniz.

Bu ilklendirme aşaması, Terraform örneğini başlatır.

Terminalinizde aşağıdaki çıkışı görürsünüz.

[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. Örnek modülü uygulamak için cft test run <EXAMPLE_NAME> --stage apply'ü çalıştırın.

Bu adım, önceki aşamada başlatılan örneği Codelab'de daha önce oluşturulan GCP projesine uygular.

Terminalinizde aşağıdaki çıkışı görürsünüz.

[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. Örneğin, beklenen altyapıyı oluşturduğunu doğrulamak için cft test run <EXAMPLE_NAME> --stage verify komutunu çalıştırın.

Bu adımda, TestMultipleBuckets işlevinde verify işlevi çalıştırılır. Doğrulama genellikle bir kaynağın mevcut durumuyla ilgili JSON çıkışını almak için gcloud komutu çalıştırılarak ve mevcut durumun örnekte belirtildiği gibi olduğunu doğrulayarak yapılır.

Hata alırsanız test için komutun ne beklediğini ve ne aldığını görürsünüz.

Terminalinizde aşağıdaki çıkışı görürsünüz.

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. Örneği kaldırmak için cft test run <EXAMPLE_NAME> --stage teardown komutunu çalıştırın.

Bu adımda, yukarıdaki adımlarda oluşturduğunuz altyapı yok edilir. Bu adımda, projede oluşturulan GCS paketleri ve GCS modülüne eklediğiniz etiket de silinir.

Aşağıdaki çıkışı terminalinizde görüntüleyebilirsiniz.

[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. Test kapsayıcısından çıkmak için exit komutunu çalıştırın.

9. Girişler ve Çıkışlar İçin Dokümanlar Oluşturma

Kök modülün, alt modüllerin ve örnek modüllerin README'lerindeki Giriş ve Çıkışlar tabloları, ilgili modüllerin variables ve outputs kurallarına göre otomatik olarak oluşturulur. Modül arayüzleri değiştirilirse bu tablolar yenilenmelidir.

Çalıştırın:

make generate_docs
# This will generate new Inputs and Outputs tables

10. CFT'de lint testleri yürütme

Linter, programlama hatalarını, hataları, üslup hatalarını ve şüpheli yapıları işaretlemek için kaynak kodu analiz eden bir araçtır.

Depodaki dosyaların birçoğunda kalite standardını koruyacak şekilde lin veya biçimlendirilebilir. CFT'de kaliteden emin olmak için lint testi kullanırsınız.

Çalıştırma:

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

11. GitHub'da PR gönderme

Kodunuzu yerel olarak değiştirdiğinize ve entegrasyon testleriyle test ettiğinize göre bu kodu ana depoya yayınlayabilirsiniz.

Kodunuzu ana depoda kullanılabilir hale getirmek için kod değişikliklerini dalınıza kaydetmeniz ve ana depoya aktarmanız gerekir. Kodunuzun, Codelab'in başında dal oluşturduğunuz ana depoya eklenmesi için deponuza kod kaydettikten sonra ana depoda bir çekme isteği (PR) göndermeniz gerekir.

Bir PR gönderdiğinizde, depo yöneticisi önerilen kod değişikliklerini incelemesi için bilgilendirilir. Ayrıca, kod değişikliklerinizle ilgili geri bildirim almak için diğer kullanıcıları incelemeci olarak da ekleyebilirsiniz. PR, depoda testler çalıştıracak bir Cloud Build'i tetikler.

Kod inceleme uzmanları, kod değişikliklerinize göre kodunuzla ilgili yorumlar yapar ve en iyi uygulamalara ve dokümanlara göre değiştirilmesi gereken bir şey varsa değişiklik yapılmasını ister. Yönetici, kod değişikliklerinizi inceler, kodunuzun depoyla uyumlu olduğundan emin olur ve kodunuzu ana depoda birleştirmeden önce tekrar bazı değişiklikler yapmanızı isteyebilir.

Kodları ayrılmış şubenize kaydetmek ve ayrılmış şubenize göndermek için aşağıdaki adımları uygulayın:

  1. İlk adım, değiştirilen dosyaları yerel depoya eklemektir.
$ 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. Dosyalarınız şu anda aşamalı olarak oluşturuldu. Sonrasında değişiklikleri uygulayacaksınız.
$ 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. Push İsteği (PR) oluşturmak için yerel deponuzdaki kaydedilen değişiklikleri GitHub'a aktarın.
$ git push -u origin feature/silly_label
# Pushes the changes in your local repository up to the remote
# repository you specified as the origin

Kod değişiklikleriniz artık bir çekme isteğine hazır.

terraform-google-modules/terraform-google-cloud-storage repo'sunda PR oluşturmak için aşağıdaki adımları uygulayın:

  1. Web tarayıcınızda depo ana sayfasına gidin.
  2. Çatalınızdan PR açmak için bir banner önerisi görürsünüz. "Karşılaştır ve istek al"ı tıklayın.

60e7ae0cbc11588e.png

  1. Kod değişikliklerinizi açıklamak için pull isteğinize bir başlık ve açıklama girin. Kısa ve net bir şekilde mümkün olduğunca ayrıntılı bilgi verin.

329342f7e9d64410.png

  1. İncelemeye hazır bir çekme isteği oluşturmak için "Çekme İsteği Oluştur"u tıklayın.
  2. PR nedeniyle tetiklenen Cloud Build Tetikleyicilerinin çalıştığını görürsünüz.
  3. Herhangi bir sorunla karşılaşırsanız çatallardan çekme isteklerini açma ile ilgili resmi GitHub dokümanlarına bakın.

İlk kod değişikliğinizi çatallı dalınıza başarıyla aktardınız ve ilk CFT PR'nizi ana dala göre yükselttiniz.

12. Tebrikler

Tebrikler, CFT modülüne başarıyla bir özellik eklediniz ve incelenmesi için bir PR gönderdiniz.

Bir CFT modülüne özellik eklediniz, bunu bir örnek üzerinden yerel olarak test ettiniz ve kodunuzu GitHub'a göndermeden önce testler yaptınız. Son olarak, inceleme ve CFT'ye son birleştirme için bir PR gönderdiniz.

Artık Cloud Foundation Toolkit'i kullanmaya başlamak için gereken önemli adımları biliyorsunuz.