1. CFT 101'e Giriş
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.
- 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ı:
- 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.
- Sayfanın sağ üst köşesindeki Çatal'ı tıklayın.
- Ç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:
- Web tarayıcınızı açın ve terraform-google-modules/terraform-google-cloud-storage üzerindeki çatalınıza gidin.
- Sağ üst köşede "Klonla veya indir"i görürsünüz bu düğmeyi tıklayın.
- "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.
- 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.
- Ç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.
"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:
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:
"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.
- 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]
- Ç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>
- Ö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)
- Ö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)
- Ö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)
- Ö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:
- İ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
- 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.
- 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:
- Web tarayıcınızda deponun ana sayfasına gidin.
- Dal menüsünde, kaydetme işlemlerinizi içeren çatalınızı seçin.
- "Dal"ın sağında "Yeni pull isteği"ni tıklayın.
- 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.
- 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.
- İncelenmeye hazır bir pull isteği oluşturmak için "Çekme İsteği Oluştur"u tıklayın.
- 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.