Cloud Foundation Toolkit'e Giriş

1. CFT 101'e Giriş

ea557448aaa1fffc.png

Son Güncelleme Tarihi: 03.03.2020

Cloud Foundation Toolkit nedir?

Özünde CFT, Google Cloud Platform'u hızlı bir şekilde kullanmaya başlamanız için en iyi uygulama şablonları sunar. Bu eğiticide, Cloud Foundation Toolkit'e nasıl katkıda bulunacağınızı öğreneceksiniz.

Gerekenler

  • GitHub hesabı.
  • Makinenizde Docker yüklü ( Mac yüklemesi, Windows yüklemesi)
  • Kodu düzenlemek için Kod Düzenleyici (Örnek: Visual Studio Kodu)
  • Git ve GitHub ile ilgili temel düzeyde aşinalık
  • Biraz Terraform ve kod olarak altyapı deneyimi
  • Bir Hizmet Hesabına Proje Oluşturucu rolü verme izni

Oluşturacakları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ı oluşturma
  • CFT modülüne özellik ekleme
  • Eklenen özellik için testler ekleyin
  • CFT'de entegrasyon testleri yürütme
  • lint testleri yürütme
  • Kodu GitHub'a kaydedin ve bir Push İsteği (PR) gönderin

Yukarıdaki tüm adımları Google Cloud Storage CFT modülüne yeni özellik ekleyerek yürüteceksiniz. 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ştirici Ortamını Kurma

İsterseniz geliştirme amacıyla Cloud Shell'den yararlanabilirsiniz. CFT'ye katkıda bulunmak için Cloud Shell'i kullanmak istemiyorsanız makinenizde geliştirme ortamınızı kurabilirsiniz.

Git'i kurun

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, önceden yüklü olduğu için Git'i yüklemeniz gerekmez.
$ git --version
# This will display the git version on the Cloud Shell.

Makinenize geliştirme ortamınızı kuruyorsanız Git'i yüklemeniz gerekir.

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

Git, kayıtları bir kimlikle ilişkilendirmek için bir kullanıcı adı kullanır. Git kullanıcı adınız, GitHub kullanıcı adınızla aynı değildir.

Git kayıtlarınızla ilişkilendirilen adı git config komutunu kullanarak değiştirebilirsiniz. git config kullanarak Git kayıtlarınızla ilişkilendirilen adı değiştirmek yalnızca gelecekteki kayıt işlemlerini etkiler ve geçmiş kayıtlarda kullanılan adı değiştirmez.

Git'i başarıyla kurdunuz. Artık dalları çatallama, oluşturma ve klonlama işlemlerini yapabiliyor olmalısınız. Bu Codelab'de Git'i yoğun bir şekilde kullanacağız.

3. Fork CFT'nin GCS Deposu

CFT deposunu çatallama

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

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

Çatallar genellikle başka birinin projesinde değişiklikler önermek veya bir başkasının projesini kendi fikriniz için başlangıç noktası olarak kullanmak amacıyla kullanılır.

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

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

CFT deposunu çatallama adımları:

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

e3894c6de6a732b4.png

  1. Çatalın nereye yerleştirileceğini ve profilinizi seçeceğinizi belirten bir seçenek sunulur. Bu durumda 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çın ve terraform-google-modules/terraform-google-cloud-storage üzerindeki çatalınıza gidin.
  2. Sağ üst köşede "Klonla veya indir"i görürsünüz bu düğmeyi tıklayın.

3bfa87b9f7f01f61.png

  1. "Klonla veya indir"i tıkladıktan sonra düğmesini tıklayıp "Not Defteri"ni tıklayın simgesini tıklayın. Çatalınızı yerel ortamınıza klonlamak için bu URL'yi kullanacaksınız.

dbf3682d004e0ee0.png

  1. VSCode'unuzda veya makinenizde bir terminale gidin ve çatalı 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 deponuza gitmeniz, ç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 özellik eklediğiniz için geçici şubenizi feature/silly_label çağı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 üzerinde çalışmaya başlamak için hazırsınız.

4. Test ortamı oluşturma

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

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 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ı ayarlayın

Test ortamı oluşturmak için Google Cloud kuruluşu, test klasörü ve faturalandırma hesabı gereklidir. 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 Kaynak GCP Projesi Oluşturma veya Seçme

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

gcloud config set core/project YOUR_PROJECT_ID

3.2 Google Cloud API'lerini etkinleştirme

Kaynak 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 rolleri atayın:

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"

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

4. Faturalandırma hesabı kaynağına Faturalandırma Hesabı Kullanıcısı rolü atama

4.1 Faturalandırma hesabı IAM politikasını getirme

Faturalandırma hesabındaki mevcut IAM politikası bağlamalarını indir

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

4.2 Politikayı, hizmet hesabını içerecek şekilde güncelleme

roles/billing.user rolüne sahip hizmet hesabı için yeni bir bağlama eklemek üzere policy.yml dosyasını güncelleyin.

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

4.3 Faturalandırma hesabı politikasını güncelleme

Değişiklikleri faturalandırma hesabına uygulayın

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

5. Terraform Kimlik Bilgilerini Hazırlama

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

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

5.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)

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

Artık 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 çıkışı görürsünüz. En sonda , Cloud Storage modülünüzü yeni özelliğinizle dağıtıp test edeceğiniz proje_kimliği test projesini alırsınız.

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.

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 ayarlandı.

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

Artık geliştirme ve test ortamınız ayarlandı. Şimdi "silly_label" etiketinizi eklemeye başlayalım. özelliğini kullanıma sunduk.

terraform-google-cloud-storage'da olduğunuzdan emin olun ve main.tf dosyasını, aşağıdaki klasör yapısında gösterildiği gibi açın.

17f2d3b9893be853.png

"silly_label" ifadesinden beri etiket bir etiketse özelliği, 27. satırdaki "labels" değişkenine ekleyeceksiniz. (aşağıda gösterildiği gibi) main.tf dosyasında:

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

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

Aşağıdaki kodu kopyalayıp değişkenler.tf dosyasındaki 29. satıra yapıştırın. 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 özellik ekleme

Özelliğinizi modülün main.tf'sine eklediniz. Şimdi, eklenen özelliği örnek üzerinden test edeceksiniz.

"silly_label" example/Multiple-buckets/main.tf'ye eklenmesi gerekir

Bu örnek, bir sonraki adımda entegrasyon testleri gerçekleştirmek için bir armatür tarafından kullanılacaktır.

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

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. Özelliği kontrol etmek için inceleme testi yazma

Özelliğinizi modülün main.tf'sine, sonra da armatürle test edilmesi için Multiple_buckets örneğine eklediniz. Özelliğinizi Ruby'de yazılmış bir InSpec entegrasyon testi aracılığıyla test etmeniz gerekir.

Yeni testlerinizi, aşağıdaki klasör yapısında bulunan gsutil.rb dosyasına ekleyeceksiniz:

b2bfeb203477e0c8.png

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

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

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'de entegrasyon testleri yürütme

Entegrasyon Testi

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

Entegrasyon testleri Kitchen, Kitchen-Terraform ve InSpec kullanılarak çalıştırılır. Bu araçlar, kolaylık sağlamak amacıyla Docker görüntüsü içinde paketlenmiştir.

Bu testlerin genel stratejisi, örnek modüllerin davranışını doğrulamaktır. Böylece, kök modülün, alt modüllerin ve örnek modüllerin tamamının işlevsel açıdan doğru olduğundan emin olursunuz.

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

  1. Docker kapsayıcısını etkileşimli modda test etmek 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 container'ı otomatik olarak güncellenmelidir.

make docker_run komutunu çalıştırdığınızda Docker container'ı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ızda entegrasyon testleri içeren tüm örnekleri listelemek için kitchen_do list komutunu çalıştırın.
     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. Örnek modül için çalışma dizinini başlatmak üzere kitchen_do create <EXAMPLE_NAME> komutunu çalıştırın.

Bu adımda mutfak başlatılır ve çalışma alanında terraform başlatılır.

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

[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. Örnek modülü uygulamak için kitchen_do converge <EXAMPLE_NAME> komutunu çalıştırın.

Bu adımda, önceki adımda oluşturulan terraform çalışma alanı, Codelab'de daha önce oluşturulan GCP projesine uygulanır.

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

[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. Örnek modülü test etmek için kitchen_do verify <EXAMPLE_NAME> komutunu çalıştırın.

Bu adım, Multiple_buckets modülüne yönelik testleri içeren gsutils.rb dosyası üzerinden yürütülür. Her testte, daha önce hizmet hesabı kimlik bilgileri kurulumu kullanılarak oluşturduğunuz test projesinde çalıştırılacak bir gsutil komutu bulunur.

Hata alırsanız beklenenleri ve test komutu tarafından nelerin alındığını görürsünüz.

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

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. Örnek modül durumunu kaldırmak için kitchen_do destroy <EXAMPLE_NAME> komutunu çalıştırın.

Bu adımda, yukarıdaki adımlarda oluşturduğunuz çalışma alanı kaldırılır. Bu adım, GCS modülüne eklediğiniz etiketle birlikte projede oluşturulan GCS paketlerini de kaldırır.

Terminalinizde aşağıdaki çıkışı görebilirsiniz.

[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. Girişler ve Çıkışlar için Belge 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ırma:

make generate_docs
# This will generate new Inputs and Outputs tables

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

Lint aracı, programlama hatalarını, hataları, stil hatalarını ve şüpheli yapıları işaretlemek için kaynak kodunu 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 halkla ilişkiler (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 dalınızda kod değişikliklerini kaydetmeniz ve ana depoya aktarmanız gerekir. Kodunuzun, Codelab'in başında çatalladığınız ana depoya eklenmesi için kod deponuza kod gönderdikten sonra ana depoda bir Çekme İsteği (PR) oluşturmanız gerekir.

Bir PR bildirdiğ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ı da incelemeci olarak ekleyebilirsiniz. PR, depoda testler çalıştıracak bir Cloud Build tetikler.

Kod değişikliklerinize bağlı olarak, kod incelemeciler kodunuzla ilgili yorumlarda bulunur, en iyi uygulamalar ve belgelere dayalı olarak bir şeylerin değiştirilmesi gerekiyorsa kodda değişiklik yapmanızı 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.

Çatallı dalınıza kod kaydetmek ve kodu çatallı 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/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. 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 master
# 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 İsteği için hazır.

Aşağıdaki adımları uygulayarak terraform-google-modules/terraform-google-cloud-storage depouna bir destek talebi gönderin:

  1. Web tarayıcınızda deponun ana sayfasına gidin.
  2. Dal menüsünde, kaydetme işlemlerinizi içeren çatalınızı seçin.
  3. "Dal"ın sağında "Yeni pull isteği"ni tıklayın.

40087ce52ee5ed35.png

  1. Temel "taban"ı kullanın açılır menüyü kullanarak değişikliklerinizi birleştirmek istediğiniz dalı seçebilirsiniz. Bu genellikle "ana" daldır Çatalınızda kod değişiklikleri yaptığınızdan emin olun.
  2. Kod değişikliklerinizi açıklamak için pull isteğinize bir başlık ve açıklama girin. Olabildiğince kısa ve öz olun.
  3. İncelenmeye hazır bir pull isteği oluşturmak için "Çekme İsteği Oluştur"u tıklayın.

a9e70a2ec9653cd7.png

  1. PR nedeniyle tetiklenen Cloud Build Tetikleyicilerinin çalıştığını görürsünüz.

İ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, bir CFT modülüne başarıyla bir özellik eklediniz ve incelenmek üzere bir PR gönderdiniz!

Bir CFT modülüne özellik eklediniz, bir örnek üzerinden yerel olarak test ettiniz ve kodunuzu GitHub'a kaydetmeden önce testler yaptınız. Son olarak, inceleme için bir PR'yi oluşturdunuz ve nihai olarak CFT'ye birleştirdiniz.

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