1. Pengantar CFT 101
Terakhir diperbarui: 03-03-2020
Apa itu Cloud Foundation Toolkit?
Intinya, CFT menyediakan template praktik terbaik untuk memulai dengan cepat di Google Cloud Platform. Dalam tutorial ini, Anda akan belajar cara berkontribusi pada Cloud Foundation Toolkit.
Yang Anda butuhkan
- Akun GitHub.
- Docker yang diinstal di komputer Anda ( penginstalan di Mac, penginstalan di Windows)
- Editor Kode untuk mengedit kode (Contoh: Visual Studio Code)
- Pemahaman dasar tentang Git dan GitHub
- Pengalaman dengan Terraform dan Infrastructure as Code
- Izin untuk memberikan peran Project Creator ke Akun Layanan
Yang akan Anda bangun
Dalam codelab ini, Anda akan mempelajari cara berkontribusi pada Cloud Foundation Toolkit (CFT).
Anda akan:
- Menyiapkan lingkungan pengembangan untuk berkontribusi pada CFT
- Menambahkan fitur ke modul CFT
- Menambahkan pengujian untuk fitur yang ditambahkan
- Menjalankan pengujian integrasi di CFT
- Menjalankan pengujian lint
- Commit kode ke GitHub dan kirimkan Permintaan Pull (PR)
Anda akan menjalankan semua langkah di atas dengan menambahkan fitur baru ke modul CFT Google Cloud Storage. Anda akan menambahkan label bernama "silly_label"
yang akan ditambahkan secara otomatis ke semua bucket yang dibuat melalui modul CFT GCS. Anda juga akan dapat menulis pengujian untuk memvalidasi fitur dan memastikan integrasi yang menyeluruh.
2. Menyiapkan Lingkungan Developer
Jika ingin, Anda dapat memanfaatkan Cloud Shell untuk tujuan pengembangan. Jika tidak ingin menggunakan Cloud Shell untuk berkontribusi pada CFT, Anda dapat menyiapkan lingkungan pengembangan di mesin.
Menyiapkan Git
GitHub didasarkan pada sistem kontrol versi (VCS) open source yang disebut Git. Git bertanggung jawab atas semua hal yang terkait dengan GitHub yang terjadi secara lokal di mesin Anda atau Cloud Shell Anda.
- Saat menggunakan Cloud Shell, Anda tidak perlu menginstal git karena sudah terinstal.
$ git --version
# This will display the git version on the Cloud Shell.
Jika Anda menyiapkan lingkungan pengembangan di mesin, Anda perlu menginstal Git.
Menyetel nama pengguna dan email Anda di Git
Git menggunakan nama pengguna untuk mengaitkan commit dengan identitas. Nama pengguna Git tidak sama dengan nama pengguna GitHub Anda.
Anda dapat mengubah nama yang terkait dengan commit Git menggunakan perintah git config. Mengubah nama yang terkait dengan commit Git Anda menggunakan git config
hanya akan memengaruhi commit mendatang dan tidak akan mengubah nama yang digunakan untuk commit sebelumnya.
Anda telah berhasil menyiapkan Git dan seharusnya dapat melakukan fork, membuat, dan meng-clone cabang. Kita akan menggunakan Git secara ekstensif dalam Codelab ini.
3. Repositori GCS Fork CFT
Lakukan fork ke repositori CFT
Anda sudah menyiapkan Git di mesin lokal atau Cloud Shell pada langkah sebelumnya. Sekarang Anda perlu melakukan fork pada repositori CFT Google Cloud Storage untuk mulai berkontribusi.
Fork adalah salinan repositori. Dengan forking repositori, Anda dapat bebas bereksperimen dengan perubahan tanpa memengaruhi project aslinya.
Umumnya, {i>fork<i} digunakan untuk mengusulkan perubahan pada proyek orang lain atau menggunakan proyek orang lain sebagai titik awal untuk ide Anda sendiri.
Misalnya, Anda dapat menggunakan fork untuk mengusulkan perubahan terkait dengan perbaikan bug. Untuk memperbaiki bug, Anda dapat:
- Lakukan fork pada repositori.
- Lakukan perbaikan.
- Kirim permintaan pull ke pemilik project.
Langkah-langkah untuk melakukan fork repositori CFT:
- Buka browser web Anda dan buka repositori terraform-google-modules/terraform-google-cloud-storage. Kita akan menggunakan repo ini untuk seluruh Codelab.
- Di pojok kanan atas halaman, klik Fork.
- Anda akan diberikan opsi di mana Anda ingin memiliki fork, pilih profil Anda, dan repo akan diambil.
Meng-clone fork secara lokal
Fork yang Anda buat adalah salinan repositori modul GCS. Sekarang Anda akan meng-clone repositori ini ke lingkungan lokal untuk menambahkan fitur baru Anda.
Langkah-langkah untuk meng-clone fork:
- Buka browser web dan buka fork di terraform-google-modules/terraform-google-cloud-storage.
- Di pojok kanan atas, Anda akan menemukan ikon "Clone or download" , klik tombol tersebut.
- Setelah mengklik "Clone or download" klik tombol "Notepad" untuk menyalin URL fork. Anda akan menggunakan URL ini untuk meng-clone fork ke lingkungan lokal Anda.
- Buka terminal di VSCode atau di komputer Anda dan clone fork.
$ git clone <url>
# This command will clone your fork locally.
# Paste the copied URL from the previous step.
- Setelah meng-clone fork secara lokal, Anda harus membuka repo, membuat cabang baru dari fork, dan membuat perubahan kode pada cabang sementara.
Berdasarkan konvensi, Anda dapat memberi nama cabang sebagai berikut:
- Untuk permintaan fitur:
feature/feature-name
- Untuk update internal,
internal/change-name
- Untuk perbaikan bug:
bugfix/issue-name
Karena Anda menambahkan fitur baru, Anda dapat memanggil cabang sementara feature/silly_label
$ cd terraform-google-cloud-storage
# This command takes you into the cloned directory on your local machine.
$ git branch
# This command tells your current branch
# When you run this for the first time after you have cloned, your
# output should say "master", that is your fork.
$ git checkout -b feature/silly_label
# This command creates a new branch on your fork and switches your
# branch to the newly created branch.
$ git branch
# This command will confirm your current branch to be "feature/silly_label"
Sekarang Anda sudah siap untuk mulai mengerjakan Cloud Foundation Toolkit.
4. Membuat lingkungan pengujian
Proses pengembangan CFT standar didasarkan pada penggunaan project pengujian terisolasi untuk pengujian. Langkah ini akan memandu Anda membuat project pengujian (berdasarkan konfigurasi standar) melalui akun layanan.
0. Instal Docker Engine
Jika menggunakan komputer untuk tujuan pengembangan, Anda harus menginstal Docker Engine.
1. Menginstal Google Cloud SDK
Anda tidak perlu menginstal Google Cloud SDK jika menggunakan Cloud Shell GCP.
Buka Google Cloud SDK dan download penginstal interaktif untuk platform Anda.
2. Setel konfigurasi
Untuk membuat lingkungan pengujian, Anda memerlukan Organisasi Google Cloud, folder pengujian, dan akun penagihan. Nilai ini harus ditetapkan melalui variabel lingkungan:
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 Menyiapkan Akun Layanan
Sebelum membuat lingkungan pengujian, Anda harus mendownload kunci akun layanan ke lingkungan pengujian. Akun layanan ini memerlukan peran Project Creator, Billing Account User, dan Organization Viewer. Langkah-langkah ini akan membantu Anda membuat akun layanan baru, tetapi Anda juga dapat menggunakan kembali akun yang sudah ada.
3.1 Membuat atau Memilih Project GCP Seed
Sebelum membuat akun layanan, Anda harus memilih project untuk menghostingnya. Anda juga dapat membuat project baru.
gcloud config set core/project YOUR_PROJECT_ID
3.2 Mengaktifkan Google Cloud API
Aktifkan Google Cloud API berikut di project seed Anda:
gcloud services enable cloudresourcemanager.googleapis.com
gcloud services enable iam.googleapis.com
gcloud services enable cloudbilling.googleapis.com
3.3 Membuat Akun Layanan
Buat akun layanan baru untuk mengelola lingkungan pengujian:
# 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
Pastikan akun layanan Anda sudah dibuat:
gcloud iam service-accounts list --filter="EMAIL=${SERVICE_ACCOUNT}"
3.4 Memberikan peran Project Creator, Billing Account User, dan Organization Viewer ke Akun Layanan:
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"
Sekarang Anda memiliki Akun Layanan yang dapat digunakan untuk mengelola lingkungan pengujian.
4. Menetapkan peran Billing Account User pada resource akun penagihan
4.1 Mengambil kebijakan IAM akun penagihan
Mendownload binding kebijakan IAM yang ada pada akun penagihan
gcloud beta billing accounts get-iam-policy ${TF_VAR_billing_account} | tee policy.yml
4.2 Memperbarui kebijakan untuk menyertakan Akun Layanan
Perbarui file policy.yml
guna menambahkan binding baru untuk akun layanan dengan peran roles/billing.user
bindings:
- members:
- serviceAccount:cft-onboarding@<YOUR_PROJECT_ID>.iam.gserviceaccount.com
role: roles/billing.user
4.3 Memperbarui kebijakan akun penagihan
Terapkan perubahan pada akun penagihan
gcloud beta billing accounts set-iam-policy ${TF_VAR_billing_account} policy.yml
5. Siapkan Kredensial Terraform
Untuk membuat lingkungan pengujian, Anda harus mendownload kunci akun layanan ke dalam shell.
5.1 Kunci Akun Layanan
Membuat dan mendownload kunci akun layanan untuk Terraform
gcloud iam service-accounts keys create cft.json --iam-account=${SERVICE_ACCOUNT}
5.2 Menyiapkan Kredensial Terraform
Sediakan kunci ke Terraform menggunakan variabel lingkungan SERVICE_ACCOUNT_JSON
, dengan menyetel nilai ke contents kunci akun layanan Anda.
export SERVICE_ACCOUNT_JSON=$(< cft.json)
6. Membuat project pengujian untuk deployment Terraform
Setelah semuanya siap, Anda dapat membuat project pengujian dengan satu perintah. Jalankan perintah ini dari root direktori terraform-google-cloud-storage:
make docker_test_prepare
Anda akan melihat output di bawah ini saat menjalankan make docker_test_prepare
. Di bagian akhir , Anda akan menerima project_id pengujian yang telah dibuat tempat Anda akan men-deploy dan menguji modul Cloud Storage dengan fitur baru Anda.
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.
Sekarang Anda telah membuat project pengujian yang direferensikan oleh project_id seperti yang dapat Anda lihat pada output konsol. Lingkungan pengembangan dan pengujian Anda sudah disiapkan.
5. Menambahkan fitur baru ke modul CFT
Sekarang lingkungan pengembangan dan pengujian Anda sudah siap, mari mulai tambahkan "silly_label" Anda ke modul CFT Google Cloud Storage.
Pastikan Anda berada di terraform-google-cloud-storage dan buka file main.tf seperti yang Anda lihat di struktur folder di bawah ini.
Sejak "silly_label" adalah label, Anda akan menambahkan fitur pada baris 27 di variabel "labels" di main.tf, seperti yang Anda lihat di bawah ini:
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(
<...>
}
Sekarang, Anda akan menambahkan variabel silly_label dalam variables.tf yang terlihat pada struktur folder di atas.
Salin dan tempel kode di bawah ini dan tambahkan ke baris 29 di variables.tf dan pastikan Anda memiliki karakter baris baru di atas dan di bawah blok variabel yang ditambahkan.
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. Menambahkan fitur baru ke contoh bucket penyimpanan
Anda telah menambahkan fitur ke main.tf modul dan sekarang Anda akan menguji fitur yang ditambahkan melalui contoh.
Label "silly_label" perlu ditambahkan ke contoh/multiple-buckets/main.tf
Contoh ini akan digunakan oleh perlengkapan pada langkah berikutnya untuk melakukan pengujian integrasi.
Salin dan tempel baris variabel silly_label di bawah ini ke baris 27 di main.tf di terraform-google-cloud-storage/examples/multiple-buckets/ seperti yang terlihat pada struktur folder:
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. Menulis pengujian Inspec untuk memeriksa fitur
Anda telah menambahkan fitur ke main.tf dari modul lalu menambahkan fitur tersebut ke contoh multiple_buckets untuk diuji melalui perlengkapan. Anda perlu menguji fitur melalui pengujian integrasi InSpec yang ditulis dalam Ruby.
Anda akan menambahkan pengujian baru di file gsutil.rb yang terdapat dalam struktur folder di bawah:
Anda telah menambahkan "silly_label" pada semua bucket yang dibuat melalui modul multiple_buckets dan sekarang Anda perlu menulis pengujian untuk menguji fitur baru.
Pada kode di bawah ini, Anda mendapatkan label setiap bucket melalui perintah gsutil, lalu memeriksa output yang ditampilkan dari perintah tersebut.
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. Menjalankan pengujian integrasi di CFT
Pengujian Integrasi
Pengujian integrasi digunakan untuk memverifikasi perilaku modul root, submodul, dan modul contoh. Penambahan, perubahan, dan perbaikan harus disertai dengan pengujian.
Pengujian integrasi dijalankan menggunakan Kitchen, Kitchen-Terraform, dan InSpec. Alat-alat ini dikemas dalam image Docker untuk memudahkan.
Strategi umum untuk pengujian ini adalah memverifikasi perilaku modul contoh, sehingga memastikan bahwa modul root, submodul, dan modul contoh semuanya benar secara fungsional.
Dalam eksekusi interaktif, Anda mengeksekusi setiap langkah melalui beberapa perintah.
- Jalankan
make docker_run
untuk memulai container Docker pengujian dalam mode interaktif.
Make adalah alat otomatisasi build yang otomatis membangun program dan library yang dapat dieksekusi dari kode sumber dengan membaca file bernama Makefiles yang menentukan cara mendapatkan program target. Saat Anda membuat perubahan file, container docker harus diperbarui secara otomatis.
Saat menjalankan make docker_run
, Anda membuat ruang kerja di container Docker dan mengaktifkan kredensial untuk akun layanan Anda. Ruang kerja akan digunakan dalam langkah berikutnya untuk menjalankan pengujian.
Anda akan melihat output di bawah ini di terminal Anda:
Activated service account credentials for: [cft@<PROJECT_ID>.iam.gserviceaccount.com]
- Jalankan
kitchen_do list
untuk mencantumkan semua instance di ruang kerja Anda yang berisi pengujian integrasi.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>
- Jalankan
kitchen_do create <EXAMPLE_NAME>
untuk menginisialisasi direktori kerja untuk modul contoh.
Langkah ini akan menginisialisasi dapur dan melakukan inisialisasi terraform di ruang kerja.
Anda akan melihat output di bawah ini di terminal Anda.
[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)
- Jalankan
kitchen_do converge <EXAMPLE_NAME>
untuk menerapkan modul contoh.
Langkah ini menerapkan ruang kerja terraform yang telah dibuat di langkah sebelumnya ke project GCP yang dibuat sebelumnya di Codelab.
Anda akan melihat output di bawah ini di terminal Anda.
[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)
- Jalankan
kitchen_do verify <EXAMPLE_NAME>
untuk menguji modul contoh.
Langkah ini akan dijalankan melalui file gsutils.rb yang berisi pengujian untuk modul multiple_buckets. Setiap pengujian memiliki perintah gsutil yang akan dijalankan pada project pengujian yang Anda buat sebelumnya menggunakan penyiapan kredensial akun layanan.
Jika terjadi error, Anda akan melihat apa yang diharapkan dan apa yang diterima oleh perintah untuk pengujian.
Anda akan melihat output di bawah ini di terminal Anda.
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)
- Jalankan
kitchen_do destroy <EXAMPLE_NAME>
untuk menghancurkan status modul contoh.
Langkah ini akan menghapus ruang kerja yang telah Anda buat pada langkah-langkah di atas. Langkah ini juga akan menghancurkan bucket GCS yang telah dibuat dalam project beserta label yang telah Anda tambahkan ke modul GCS.
Anda dapat melihat output di bawah ini di terminal Anda.
[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. Membuat Dokumentasi untuk Input dan Output
Tabel Input dan Output di README modul root, submodul, dan modul contoh dibuat secara otomatis berdasarkan variables
dan outputs
dari modul masing-masing. Tabel ini harus dimuat ulang jika antarmuka modul diubah.
Jalankan:
make generate_docs
# This will generate new Inputs and Outputs tables
10. Menjalankan pengujian lint di CFT
Linter adalah alat yang menganalisis kode sumber untuk menandai error pemrograman, bug, error gaya, dan konstruksi yang mencurigakan.
Banyak file dalam repositori dapat dijadikan lint atau diformat untuk mempertahankan standar kualitas. Untuk memastikan kualitas di CFT, Anda akan menggunakan pengujian lint.
Jalankan:
make docker_test_lint
# This will run all lint tests on your repo
11. Mengirimkan PR di GitHub
Sekarang setelah Anda mengubah kode secara lokal dan mengujinya melalui pengujian integrasi, Anda ingin memublikasikan kode ini ke repo master.
Agar kode tersedia di repo master, Anda harus meng-commit perubahan kode ke cabang dan mengirimnya ke repositori master. Agar kode Anda ditambahkan ke repo utama yang Anda percabang di awal Codelab, Anda akan mengajukan Pull Request (PR) di repo master setelah melakukan kode ke repo Anda.
Saat Anda mengajukan PR, admin repo akan diberi tahu untuk meninjau perubahan kode yang diusulkan. Selain itu, Anda juga dapat menambahkan pengguna lain sebagai peninjau untuk mendapatkan masukan tentang perubahan kode Anda. PR akan memicu Cloud Build yang akan menjalankan pengujian di repo.
Berdasarkan perubahan kode Anda, peninjau kode akan memberikan komentar pada kode Anda dan meminta modifikasi jika ada sesuatu yang perlu diubah berdasarkan praktik terbaik dan dokumentasi. Admin akan meninjau perubahan kode Anda, memastikan kode Anda sesuai dengan repo dan mungkin sekali lagi meminta Anda untuk membuat beberapa perubahan sebelum menggabungkan kode Anda ke repo master.
Jalankan langkah-langkah berikut untuk meng-commit kode ke cabang bercabang dan mengirim kode ke cabang bercabang Anda:
- Langkah pertama adalah menambahkan file yang diubah ke repositori lokal.
$ 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
- File Anda kini sudah disiapkan, selanjutnya Anda akan melakukan commit untuk perubahan tersebut.
$ 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.
- Kirim perubahan yang di-commit di repositori lokal Anda ke GitHub untuk membuat Pull Request (PR).
$ git push -u origin master
# Pushes the changes in your local repository up to the remote
# repository you specified as the origin
Perubahan kode Anda sekarang siap untuk Permintaan Pull.
Jalankan langkah-langkah berikut untuk meningkatkan PR ke repositori terraform-google-modules/terraform-google-cloud-storage :
- Di browser web Anda, buka halaman utama repo.
- Di menu Branch, pilih fork yang berisi commit Anda.
- Di sebelah kanan "Cabang" klik "Permintaan pull baru".
- Menggunakan "dasar" dasar untuk memilih cabang yang ingin digabungkan perubahannya, biasanya ini adalah "master" , karena Anda telah meng-commit perubahan kode ke fork.
- Masukkan judul dan deskripsi untuk permintaan pull Anda guna mendeskripsikan perubahan kode Anda. Jelaskan sedetail mungkin saat berbicara dengan ringkas.
- Untuk membuat permintaan pull yang siap ditinjau, klik "Create Pull Request".
- Anda akan melihat Pemicu Cloud Build yang dipicu karena PR.
Anda telah berhasil melakukan perubahan kode pertama ke cabang bercabang Anda dan mengajukan PR CFT pertama terhadap cabang master.
12. Selamat
Selamat, Anda telah berhasil menambahkan fitur ke modul CFT dan mengirimkan PR untuk ditinjau!
Anda telah menambahkan fitur ke modul CFT, mengujinya secara lokal melalui contoh, dan melakukan pengujian sebelum melakukan pengujian pada kode Anda ke GitHub. Terakhir, Anda mengajukan PR untuk ditinjau dan penggabungan terakhir menjadi CFT.
Sekarang Anda telah mengetahui langkah-langkah penting untuk mulai menggunakan Cloud Foundation Toolkit.