Cloud Foundation Toolkit'e Giriş

1. CFT 101'e Giriş

b1d2ab0f35bb62a8.png

Last Updated: 2022-02-11

Cloud Foundation Toolkit nedir?

CFT, Google Cloud Platform'u kullanmaya hızlı bir başlangıç yapabilmeniz için en iyi uygulama niteliğindeki şablonlar sunar. 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'e yükleme, Windows'a yükleme)
  • Kod düzenlemek için kod düzenleyici (örnek: Visual Studio Code)
  • Git ve GitHub hakkında temel düzeyde bilgi sahibi olma
  • Terraform ve kod olarak altyapı konusunda deneyimli olmanız
  • Bir hizmet hesabına Proje Oluşturucu rolü verme izni
  • Google Cloud kuruluşu, test klasörü ve faturalandırma hesabı

Ne oluşturacaksınız?

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

Bu kurstan sonra:

  • CFT'ye katkıda bulunmak için geliştirme ortamı kurma
  • CFT modülüne özellik ekleme
  • Eklenen özellik için testler ekleme
  • CFT'de entegrasyon testleri yürütme
  • Lint testlerini yürütme
  • Kodu GitHub'a aktarma ve pull isteği (PR) gönderme

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

2. Geliştirme ortamını ayarlama

İ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ştirme ortamınızı makinenizde ayarlayabilirsiniz.

Git'i kurma

GitHub, Git adlı açık kaynaklı bir sürüm kontrol sistemine (VCS) dayanı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, commit'leri bir kimlikle ilişkilendirmek için kullanıcı adı kullanır. Git kullanıcı adı, GitHub kullanıcı adınızla aynı değildir.

Git config komutunu kullanarak Git taahhütlerinizle ilişkili adı değiştirebilirsiniz. git config kullanarak Git taahhütlerinizle ilişkili adı değiştirdiğinizde yalnızca gelecekteki taahhütler etkilenir ve geçmiş taahhütlerde kullanılan ad değiştirilmez.

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

3. Fork CFT's GCS Repository

CFT deposunu çatallama

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

Fork, bir deponun kopyasıdır. Bir depoyu çatalladığınızda, orijinal projeyi etkilemeden değişikliklerle serbestçe denemeler yapabilirsiniz.

Çoğu zaman, çatallar başka bir kullanıcının projesinde değişiklik önermek veya kendi fikriniz için başlangıç noktası olarak başka bir kullanıcının projesini kullanmak amacıyla 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 ç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 depoyu tüm Codelab boyunca kullanacağız.
  2. Sayfanın sağ üst köşesinde Fork'u tıklayın.

9dc18f15ca662b56.png

  1. Fork'u nereye oluşturmak istediğinizi seçmeniz istenir. Profilinizi seçtiğinizde depo, fork'lanmış olur.

Fork'unuzu yerel olarak klonlama

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

Fork'unuzu klonlama adımları:

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

98f8be8df319dcd8.png

  1. "Code" (Kod) düğmesini tıkladıktan sonra, fork'un URL'sini kopyalamak için "Copy" (Kopyala) simgesini tıklayın. Bu URL'yi, yerel ortamınıza çatallamanızı klonlamak için kullanırsınız.

e61e1da6371f2a1d.png

  1. VSCode'unuzda veya makinenizde bir terminale gidip fork'u klonlayı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ığınıza göre, artık deponuza gidip çataldan yeni bir dal oluşturmalı ve geçici dalda kod değişiklikleri yapmalısınız.

Kural olarak, 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 dalınıza feature/silly_label adını verebilirsiniz.

$ 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 üzerinde çalışmaya başlayabilirsiniz.

4. Test ortamı oluşturma

Standart CFT geliştirme süreci, test için izole edilmiş bir test projesi kullanmaya dayanır. Bu adımda, hizmet hesabı üzerinden test projesi oluşturma (standart yapılandırmaya göre) 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'yı yükleme

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

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

2. Yapılandırmayı ayarlama

Test ortamı oluşturmak için Google Cloud kuruluşu, test klasörü ve faturalandırma hesabınızın olması gerekir. 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ı oluşturma

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ı da yeniden kullanabilirsiniz.

3.1 Başlangıç GCP projesi oluşturma veya seçme

Hizmet hesabınızı oluşturmadan önce, hesabın barındırılacağı 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

Başlangıç 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 verme:

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 bilgisi 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 hizmet hesabı anahtarı oluşturma ve indirme

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

4.2 Terraform Kimlik Bilgilerini Ayarlama

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

export SERVICE_ACCOUNT_JSON=$(< cft.json)

Kimlik bilgisi, ortam değişkeninde saklandıktan sonra anahtar dosyasını kaldırın. Gerekirse yukarıdaki komutu kullanarak daha sonra anahtarı yeniden 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, tek bir komutla test projesini oluşturabilirsiniz. Bu komutu terraform-google-cloud-storage dizin 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. En sonunda , Cloud Storage modülünüzü yeni özelliğinizle dağıtıp test edeceğiniz test project_id'sini alırsınız. Faturalandırma hesabı bağlama konusunda 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.

Artık konsol çıkışında görebileceğiniz gibi project_id tarafından referans verilen bir test projesi oluşturdunuz. Geliştirme ve test ortamınız kurulmuş olmalıdır.

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

Geliştirme ve test ortamınız kurulduğuna göre şimdi "silly_label" özelliğinizi google-cloud-storage CFT modülüne eklemeye başlayabiliriz.

terraform-google-cloud-storage dizininde 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ğıdaki örnekte gösterildiği gibi main.tf dosyasındaki "labels" değişkeninde 27. satıra ekleyeceksiniz:

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 ekleyeceksiniz.

Aşağıdaki kodu kopyalayıp yapıştırın ve variables.tf dosyasında 31. satıra ekleyin. Eklediğiniz değişken bloğunun üstünde ve altında yeni bir satır karakteri olduğ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 paketi örneğine yeni bir özellik ekleme

Özelliğinizi modülün main.tf dosyasına eklediniz ve şimdi eklediğiniz özelliği bir örnek üzerinden test edeceksiniz.

"silly_label" öğesinin examples/multiple-buckets/main.tf dosyasına eklenmesi gerekir.

Bu örnek, sonraki adımda entegrasyon testlerini gerçekleştirmek için kullanılacaktır.

Aşağıdaki değişken silly_label satırını, klasör yapısında gösterildiği gibi terraform-google-cloud-storage/examples/multiple-buckets/ konumundaki 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 plan testini güncelleme

Özelliğinizi modülün main.tf dosyasına ve ardından multiple_buckets örneğine eklediniz. Şimdi, özelliğinizi Golang ile yazılmış bir plan entegrasyon testi aracılığıyla test etmeniz gerekir.

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

72ea272d4792405.png

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

Aşağıdaki kodda, gcloud alpha storage komutuyla her bir paketin etiketini alıp komuttan döndürülen çıkışı kontrol ediyorsunuz.

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 yürütme

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üzeltmeler testlerle birlikte yapılmalıdır.

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 paketlenmiştir.

Bu testlerdeki genel strateji, örnek modüllerin davranışını doğrulamaktır. Böylece, kök modülün, alt modüllerin ve örnek modüllerin işlevsel olarak doğru olduğundan emin olunur.

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

  1. Test Docker container'ını etkileşimli modda başlatmak için make docker_run komutunu çalıştırın.

Make, hedef programın nasıl türetileceğini belirten Makefile adlı dosyaları okuyarak yürütülebilir programları ve kitaplıkları kaynak koddan otomatik olarak oluşturan bir derleme otomasyonu aracıdır. Dosyalarda değişiklik 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 test çalıştırmak için kullanılacaktır.

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

Activated service account credentials for: [cft@<PROJECT_ID>.iam.gserviceaccount.com]
  1. Yayınlanmış modüller yerine modülleri yerel dosyalarınızdan içe aktarmak için örnek module-swapper -registry-prefix=terraform-google-modules dosyalarını ayarlamak üzere main.tf komutunu çalıştırın.

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

[root@<CONTAINER_ID> workspace]# module-swapper -registry-prefix=terraform-google-modules
2025/08/04 19:26:29 Module name set from remote to cloud-storage
2025/08/04 19:26:29 Modifications made to file /workspace/examples/multiple_buckets/main.tf
2025/08/04 19:26:29 --- Original
+++ Modified
@@ -21,7 +21,7 @@
 }
 
 module "cloud_storage" {
-  source = "terraform-google-modules/cloud-storage/google"
+  source = "../.."
   # [restore-marker]   version = "~> 10.0"
 
   project_id = var.project_id
  1. Çalışma alanınızdaki tüm plan 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. Ayrıca testleri çalıştırırken ek bilgi almak için --verbose işaretini de kullanabilirsiniz.

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

Terminalinizde aşağıdaki çıktıyı 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 komutunu çalıştırın.

Bu adımda, önceki aşamada başlatılan örnek, Codelab'de daha önce oluşturulan GCP projesine uygulanır.

Terminalinizde aşağıdaki çıktıyı 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'daki doğrulama işlevi çalıştırılır. Doğrulama genellikle bir kaynağın mevcut durumuna ilişkin JSON çıkışını almak için bir gcloud komutu yürütülerek ve mevcut durumun örnekte belirtildiği gibi olduğu onaylanarak yapılır.

Hata alırsanız test için komut tarafından ne beklendiğini ve ne alındığını görürsünüz.

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

[root@<CONTAINER_ID> workspace]# cft test run TestMultipleBuckets --stage verify --verbose
INFO[02-09|08:30:19] using test-dir: test/integration
...
TestMultipleBuckets 2022-02-09T08:30:27Z command.go:100: Running command terraform with args [output -no-color -json names_list]
TestMultipleBuckets 2022-02-09T08:30:27Z command.go:179: ["multiple-buckets-erp1-eu-one","multiple-buckets-erp1-eu-two"]
TestMultipleBuckets 2022-02-09T08:30:27Z command.go:100: Running command gcloud with args [alpha storage ls --buckets gs://multiple-buckets-erp1-eu-one --project ci-cloud-storage-8ce9 --json]
TestMultipleBuckets 2022-02-09T08:30:28Z command.go:179: [
TestMultipleBuckets 2022-02-09T08:30:28Z command.go:179: {
TestMultipleBuckets 2022-02-09T08:30:28Z command.go:179:   "url": "gs://multiple-buckets-erp1-eu-one/",
...
TestMultipleBuckets 2022-02-09T08:30:33Z command.go:179: ]
2022/02/09 08:30:33 RUN_STAGE env var set to verify
2022/02/09 08:30:33 Skipping stage teardown
--- PASS: TestMultipleBuckets (12.32s)
PASS
ok      github.com/terraform-google-modules/terraform-google-cloud-storage/test/integration/multiple_buckets    12.359s
  1. Örneği kaldırmak için cft test run <EXAMPLE_NAME> --stage teardown komutunu çalıştırın.

Bu adım, yukarıdaki adımlarda oluşturduğunuz altyapıyı yok eder. 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. module-swapper -registry-prefix=terraform-google-modules -restore komutunu çalıştırarak module-swapper komutunu son çalıştırdığınızdan bu yana örnek main.tf dosyalarında yapılan düzenlemeleri geri alın.
[root@<CONTAINER_ID> workspace]# module-swapper -registry-prefix=terraform-google-modules -restore
2025/08/04 19:30:41 Module name set from remote to cloud-storage
2025/08/04 19:36:32 Modifications made to file /workspace/examples/multiple_buckets/main.tf
2025/08/04 19:36:32 --- Original
+++ Modified
@@ -21,8 +21,8 @@
 }
 
 module "cloud_storage" {
-  source = "../.."
-   version = "~> 10.0"
+  source  = "terraform-google-modules/cloud-storage/google"
+  version = "~> 10.0"
 
   project_id = var.project_id
 
  1. Test kapsayıcısından çıkmak için exit komutunu çalıştırın.

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

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

Çalıştır:

make generate_docs
# This will generate new Inputs and Outputs tables

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

Linter, kaynak kodu analiz ederek programlama hatalarını, hataları, stil hatalarını ve şüpheli yapıları işaretleyen bir araçtır.

Depodaki dosyaların çoğu, kalite standardını korumak için linted veya biçimlendirilmiş olabilir. CFT'de kaliteyi sağlamak için lint testi kullanırsınız.

Çalıştır:

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

11. GitHub'da çekme isteği gönderme

Kodunuzu yerel olarak değiştirdikten ve entegrasyon testleriyle test ettikten sonra bu kodu ana depoda yayınlamak isteyebilirsiniz.

Kodunuzu ana depoda kullanılabilir hale getirmek için kod değişikliklerini dalınıza kaydedip ana depoya aktarmanız gerekir. Kodunuzun, Codelab'in başında çatalladığınız ana depoya eklenmesi için, kodunuzu deponuza işledikten sonra ana depoda bir çekme isteği (PR) oluşturursunuz.

PR oluşturduğunuzda, depo yöneticisi önerilen kod değişikliklerini incelemek için bilgilendirilir. Ayrıca, kod değişikliklerinizle ilgili geri bildirim almak için başka kullanıcıları da incelemeci olarak ekleyebilirsiniz. Çekme isteği, depoda testleri çalıştıracak bir Cloud Build'i tetikler.

Kod incelemeciler, kodunuzdaki değişikliklere göre kodunuzla ilgili yorumlar yapar ve en iyi uygulamalar ile dokümanlara göre değiştirilmesi gereken bir şey varsa değişiklik yapmanızı ister. Yönetici, kod değişikliklerinizi inceler, kodunuzun depoya uygun olduğundan emin olur ve kodunuzu ana depoyla birleştirmeden önce sizden tekrar bazı değişiklikler yapmanızı isteyebilir.

Kodu çatallanmış dalınıza göndermek ve kodu çatallanmış dalınıza aktarmak 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 artık hazırlanmış durumda. Ardından değişiklikleri işleyeceksiniz.
$ 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. Yerel deponuzdaki kaydedilmiş değişiklikleri, çekme isteği (PR) oluşturmak için 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 çekme isteği için hazır.

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

  1. Web tarayıcınızda repo ana sayfasına gidin.
  2. Fork'unuzdan bir PR açmak için banner üzerinden bir öneri görürsünüz. "Karşılaştır ve çekme isteği"ni tıklayın.

60e7ae0cbc11588e.png

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

f4302385e9e1776a.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 forklardan pull isteği açma ile ilgili resmi GitHub belgelerine bakın.

İlk kod değişikliğinizi, çatallanmış dalınıza başarıyla gönderdiniz ve ana dala karşı ilk CFT PR'nizi oluşturdunuz.

12. Tebrikler

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

Bir CFT modülüne özellik eklediniz, bunu bir örnek üzerinden yerel olarak test ettiniz ve kodunuzu GitHub'a işlemeyi denemeden önce testler gerçekleştirdiniz. Son olarak, inceleme ve CFT'ye son birleştirme için bir PR oluşturdunuz.

Cloud Foundation Toolkit'i kullanmaya başlamak için gereken önemli adımları öğrendiniz.