1. Введение в CFT 101
Последнее обновление: 03.03.2020 г.
Что такое набор инструментов Cloud Foundation?
По сути, CFT предоставляет передовые шаблоны для быстрого начала работы с Google Cloud Platform. Из этого руководства вы узнаете, как внести свой вклад в набор инструментов Cloud Foundation.
Что вам понадобится
- Аккаунт GitHub.
- Docker установлен на вашем компьютере ( установка Mac , установка Windows )
- Редактор кода для редактирования кода (пример: код Visual Studio )
- Базовое знание Git и GitHub.
- Некоторый опыт работы с Terraform и инфраструктурой как кодом.
- Разрешение на предоставление роли создателя проекта сервисному аккаунту.
Что ты построишь
В этой лаборатории кода вы узнаете, как внести свой вклад в Cloud Foundation Toolkit (CFT).
Вы будете:
- Настройте среду разработки для участия в CFT
- Добавьте функцию в модуль CFT
- Добавить тесты для добавленной функции
- Выполнить интеграционные тесты в ЦФТ
- Выполнить lint-тесты
- Зафиксируйте код на GitHub и отправьте запрос на включение (PR)
Вы выполните все вышеперечисленные шаги, добавив новую функцию в модуль Google Cloud Storage CFT . Вы добавите метку под названием "silly_label"
, которая будет автоматически добавлена ко всем сегментам, созданным с помощью модуля GCS CFT. Вы также сможете писать тесты для проверки вашей функции и обеспечения сквозной интеграции.
2. Настройка среды разработки
Если вы хотите, вы можете использовать Cloud Shell для своих целей разработки. Если вы не хотите использовать Cloud Shell для участия в CFT, вы можете настроить среду разработки на своем компьютере.
Настройте Git
GitHub основан на системе контроля версий с открытым исходным кодом (VCS) под названием Git. Git отвечает за все, что связано с GitHub и происходит локально на вашем компьютере или в Cloud Shell.
- При использовании Cloud Shell вам не нужно устанавливать git, поскольку он уже установлен.
$ git --version
# This will display the git version on the Cloud Shell.
Если вы настраиваете среду разработки на своем компьютере, вам необходимо установить Git.
Установка имени пользователя и электронной почты в Git
Git использует имя пользователя, чтобы связать коммиты с личностью. Имя пользователя Git не совпадает с вашим именем пользователя GitHub.
Вы можете изменить имя, связанное с вашими коммитами Git, с помощью команды git config. Изменение имени, связанного с вашими коммитами Git, с помощью git config
повлияет только на будущие коммиты и не изменит имя, используемое для прошлых коммитов.
Вы успешно настроили Git и сможете разветвлять, создавать и клонировать ветки. В этой лаборатории кода мы будем широко использовать Git.
3. Репозиторий GCS форка CFT
Форк репозитория CFT
Вы настраиваете Git на своем локальном компьютере или в Cloud Shell на предыдущем этапе. Теперь вам нужно создать форк репозитория Google Cloud Storage CFT, чтобы начать вносить свой вклад.
Форк — это копия репозитория. Разветвление репозитория позволяет вам свободно экспериментировать с изменениями, не затрагивая исходный проект.
Чаще всего форки используются либо для предложения изменений в чужом проекте, либо для использования чужого проекта в качестве отправной точки для реализации вашей собственной идеи.
Например, вы можете использовать вилки, чтобы предлагать изменения, связанные с исправлением ошибки. Чтобы исправить ошибку, вы можете:
- Форкните репозиторий.
- Исправьте.
- Отправьте запрос на включение владельцу проекта.
Шаги для форка репо CFT:
- Откройте веб-браузер и перейдите в репозиторий terraform-google-modules/terraform-google-cloud-storage . Мы будем использовать этот репозиторий для всей Codelab.
- В правом верхнем углу страницы нажмите «Развилка» .
- Вам будет предложен вариант, где вы хотите разместить форк, выберите свой профиль, и репо будет форкано.
Клонируйте свою вилку локально
Созданная вами вилка является копией репозитория модулей GCS. Теперь вы клонируете этот репозиторий в свою локальную среду, чтобы добавить новую функцию.
Шаги по клонированию вашей вилки:
- Откройте веб-браузер и перейдите к своей ветке terraform-google-modules/terraform-google-cloud-storage .
- В правом верхнем углу вы найдете кнопку «Клонировать или скачать», нажмите на нее.
- После того, как вы нажали кнопку «Клонировать или загрузить», щелкните значок «Блокнот», чтобы скопировать URL-адрес форка. Вы будете использовать этот URL-адрес для клонирования своей вилки в локальную среду.
- Перейдите к терминалу в вашем VSCode или на вашем компьютере и клонируйте вилку.
$ git clone <url>
# This command will clone your fork locally.
# Paste the copied URL from the previous step.
- Теперь, когда вы клонировали свою вилку локально, вам следует зайти в свой репозиторий, создать новую ветку на основе вилки и внести изменения в код во временную ветку.
По соглашению вы можете назвать свою ветку следующим образом:
- Для запросов на функции:
feature/feature-name
- Для внутренних обновлений:
internal/change-name
- Для исправления ошибок:
bugfix/issue-name
Поскольку вы добавляете новую функцию, вы можете вызвать 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"
Теперь все готово для начала работы с Cloud Foundation Toolkit!
4. Создайте тестовую среду
Стандартный процесс разработки CFT основан на использовании изолированного тестового проекта для тестирования. Этот шаг поможет вам создать тестовый проект (на основе стандартной конфигурации) через сервисную учетную запись.
0. Установите Docker Engine.
Если вы используете свою машину в целях разработки, вам необходимо установить Docker Engine .
1. Установите Google Cloud SDK.
Вам не нужно устанавливать Google Cloud SDK, если вы используете GCP Cloud Shell .
Перейдите в Google Cloud SDK и загрузите интерактивный установщик для вашей платформы.
2. Установите конфигурацию
Чтобы создать тестовую среду, вам понадобится облачная организация Google, тестовая папка и платежный аккаунт. Эти значения необходимо установить через переменные среды:
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. Настройте свою учетную запись службы.
Прежде чем создавать тестовую среду, вам необходимо загрузить ключ служебной учетной записи в вашу тестовую среду. Для этого сервисного аккаунта потребуются роли «Создатель проекта», «Пользователь платежного аккаунта» и «Просмотр организации» . Эти шаги помогут вам создать новую учетную запись службы, но вы также можете повторно использовать существующую учетную запись.
3.1 Создать или выбрать начальный проект GCP
Прежде чем создавать учетную запись службы, вам необходимо выбрать проект для ее размещения. Вы также можете создать новый проект.
gcloud config set core/project YOUR_PROJECT_ID
3.2 Включите Google Cloud API
Включите следующие API Google Cloud в своем исходном проекте:
gcloud services enable cloudresourcemanager.googleapis.com
gcloud services enable iam.googleapis.com
gcloud services enable cloudbilling.googleapis.com
3.3 Создать учетную запись службы
Создайте новую учетную запись службы для управления тестовой средой:
# 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
Убедитесь, что ваша учетная запись службы создана:
gcloud iam service-accounts list --filter="EMAIL=${SERVICE_ACCOUNT}"
3.4. Предоставьте сервисному аккаунту роли «Создатель проекта», «Пользователь платежного аккаунта» и «Просмотр организации».
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"
Теперь у вас есть учетная запись службы, которую можно использовать для управления тестовой средой.
4. Назначьте роль пользователя учетной записи выставления счетов для ресурса учетной записи выставления счетов.
4.1. Получение IAM-политики платежного аккаунта.
Загрузите существующие привязки политики IAM для учетной записи выставления счетов.
gcloud beta billing accounts get-iam-policy ${TF_VAR_billing_account} | tee policy.yml
4.2 Обновите политику, включив в нее учетную запись службы.
Обновите файл policy.yml
, чтобы добавить новую привязку для учетной записи службы с roles/billing.user
bindings:
- members:
- serviceAccount:cft-onboarding@<YOUR_PROJECT_ID>.iam.gserviceaccount.com
role: roles/billing.user
4.3. Обновите политику платежного аккаунта.
Примените изменения в платежном аккаунте.
gcloud beta billing accounts set-iam-policy ${TF_VAR_billing_account} policy.yml
5. Подготовьте учетные данные Terraform.
Чтобы создать тестовую среду, вам необходимо загрузить ключ служебной учетной записи в свою оболочку.
5.1 Ключ учетной записи службы
Создайте и загрузите ключ сервисной учетной записи для Terraform.
gcloud iam service-accounts keys create cft.json --iam-account=${SERVICE_ACCOUNT}
5.2 Настройка учетных данных Terraform
Предоставьте ключ в Terraform, используя переменную среды SERVICE_ACCOUNT_JSON
, установив в качестве значения содержимое ключа вашей сервисной учетной записи.
export SERVICE_ACCOUNT_JSON=$(< cft.json)
6. Создайте тестовый проект для развертываний Terraform.
Теперь, когда все подготовлено, вы можете создать тестовый проект с помощью одной команды. Запустите эту команду из корня каталога terraform-google-cloud-storage:
make docker_test_prepare
Вы увидите приведенный ниже вывод, когда запустите make docker_test_prepare
, в конце вы получите тестовый project_id, который был создан, где вы будете развертывать и тестировать свой модуль облачного хранилища с вашей новой функцией.
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.
Теперь вы создали тестовый проект, на который ссылается project_id, как вы можете видеть в выводе консоли. Ваша среда разработки и тестирования настроена.
5. Добавьте новую функцию в модуль ЦФТ.
Теперь ваша среда разработки и тестирования настроена, давайте начнем добавлять функцию «silly_label» в модуль google-cloud-storage CFT.
Убедитесь, что вы находитесь в terraform-google-cloud-storage, и откройте файл main.tf, как вы видите ниже в структуре папок.
Поскольку «silly_label» — это метка, вы добавите эту функцию в строке 27 в переменную «labels» в файле main.tf, как показано ниже:
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(
<...>
}
Теперь вы добавите переменную silly_label в файлvariable.tf, который вы видите в приведенной выше структуре папок.
Скопируйте приведенный ниже код и добавьте его в строку 29 в файлеvariables.tf и убедитесь, что у вас есть новый символ строки выше и ниже добавляемого блока переменных.
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. Добавьте новую функцию в пример сегмента хранилища.
Вы добавили свою функцию в файл main.tf модуля и теперь протестируете добавленную функцию на примере.
«silly_label» необходимо будет добавить в example/multiple-buckets/main.tf.
Этот пример будет использоваться прибором на следующем этапе для выполнения интеграционных тестов.
Скопируйте и вставьте приведенную ниже строку переменной silly_label в строку 27 файла main.tf по адресу terraform-google-cloud-storage/examples/multiple-buckets/, как показано в структуре папок:
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. Напишите тест Inspec для проверки функции.
Вы добавили свою функцию в файл main.tf модуля, а затем добавили эту функцию в пример Multiple_buckets для тестирования с помощью приспособления. Вам необходимо протестировать свою функцию с помощью интеграционного теста InSpec, написанного на Ruby.
Вы добавите новые тесты в файл gsutil.rb, который находится в структуре папок ниже:
Вы добавили «silly_label» во все сегменты, создаваемые с помощью модуля Multiple_buckets, и теперь вам нужно написать тесты для тестирования новой функции.
В приведенном ниже коде вы получаете метку каждого сегмента с помощью команды gsutil, а затем проверяете возвращаемый вывод команды.
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. Выполнить интеграционные тесты в ЦФТ.
Интеграционное тестирование
Интеграционные тесты используются для проверки поведения корневого модуля, подмодулей и примеров модулей. Дополнения, изменения и исправления должны сопровождаться тестами.
Интеграционные тесты проводятся с использованием Kitchen , Kitchen-Terraform и InSpec . Для удобства эти инструменты упакованы в образ Docker.
Общая стратегия этих тестов — проверить поведение модулей-примеров , гарантируя тем самым, что корневой модуль, подмодули и модули-примеры функционально корректны.
При интерактивном выполнении каждый шаг выполняется с помощью нескольких команд.
- Запустите
make docker_run
, чтобы запустить тестирование контейнера Docker в интерактивном режиме.
Make — это инструмент автоматизации сборки, который автоматически собирает исполняемые программы и библиотеки из исходного кода, читая файлы Makefiles , которые определяют, как получить целевую программу. Когда вы вносите изменения в файл, контейнер Docker должен обновляться автоматически.
Когда вы запускаете make docker_run
, вы создаете рабочую область в своем Docker-контейнере и активируете учетные данные для своей учетной записи службы. Рабочая область будет использоваться на следующих шагах для запуска тестов.
Вы увидите следующий вывод в своем терминале:
Activated service account credentials for: [cft@<PROJECT_ID>.iam.gserviceaccount.com]
- Запустите
kitchen_do list
, чтобы просмотреть все экземпляры в вашем рабочем пространстве, содержащие интеграционные тесты.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>
- Запустите
kitchen_do create <EXAMPLE_NAME>
чтобы инициализировать рабочий каталог для примера модуля.
На этом шаге инициализируется кухня и терраформирование в рабочем пространстве.
Вы увидите приведенный ниже вывод в своем терминале.
[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)
- Запустите
kitchen_do converge <EXAMPLE_NAME>
чтобы применить пример модуля.
На этом этапе рабочее пространство terraform, созданное на предыдущем шаге, применяется к проекту GCP, созданному ранее в Codelab.
Вы увидите приведенный ниже вывод в своем терминале.
[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)
- Запустите
kitchen_do verify <EXAMPLE_NAME>
чтобы протестировать пример модуля.
Этот шаг будет выполняться через файл gsutils.rb, который содержит тесты для модуля Multiple_buckets. Каждый тест имеет команду gsutil, которая будет выполняться для тестового проекта, созданного вами ранее с использованием настройки учетных данных учетной записи службы.
Если вы получите какие-либо ошибки, вы увидите, что ожидалось и что получила команда для теста.
Вы увидите приведенный ниже вывод в своем терминале.
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)
- Запустите
kitchen_do destroy <EXAMPLE_NAME>
чтобы уничтожить состояние модуля примера.
Этот шаг уничтожает рабочую область, созданную на предыдущих шагах. На этом этапе также будут уничтожены сегменты GCS, созданные в проекте, вместе с меткой, которую вы добавили в модуль GCS.
Вы можете просмотреть приведенный ниже вывод в своем терминале.
[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. Создание документации для входов и выходов
Таблицы входов и выходов в файлах README корневого модуля, подмодулей и примеров модулей автоматически генерируются на основе variables
и outputs
соответствующих модулей. Эти таблицы необходимо обновить, если интерфейсы модулей изменяются.
Бегать:
make generate_docs
# This will generate new Inputs and Outputs tables
10. Выполните тесты на ворс в CFT.
Линтер — это инструмент, который анализирует исходный код для выявления ошибок программирования, ошибок, стилистических ошибок и подозрительных конструкций.
Многие файлы в репозитории можно линковать или отформатировать для поддержания стандартов качества. Чтобы гарантировать качество в CFT, вы будете использовать тест на ворс.
Бегать:
make docker_test_lint
# This will run all lint tests on your repo
11. Размещение PR на Github
Теперь, когда вы изменили свой код локально и протестировали его с помощью интеграционных тестов, вам нужно опубликовать этот код в главном репозитории.
Чтобы сделать ваш код доступным в главном репозитории, вам необходимо зафиксировать изменения кода в своей ветке и отправить их в главный репозиторий. Чтобы ваш код был добавлен в основной репозиторий, который вы разветвили в начале Codelab, вы создадите запрос на включение (PR) в главном репозитории после фиксации кода в вашем репозитории.
Когда вы поднимете PR, администратор репо будет уведомлен о необходимости просмотреть предлагаемые изменения кода. Кроме того, вы также можете добавить других пользователей в качестве рецензентов, чтобы получать отзывы об изменениях вашего кода. PR запустит облачную сборку, которая проведет тесты в репозитории.
На основании изменений вашего кода рецензенты кода будут комментировать ваш код и просить внести изменения, если что-то необходимо изменить на основе лучших практик и документации. Администратор проверит изменения вашего кода, убедится, что ваш код соответствует репозиторию, и может снова попросить вас внести некоторые изменения перед объединением вашего кода с основным репозиторием.
Выполните следующие шаги, чтобы зафиксировать код в разветвленной ветке и отправить код в раздвоенную ветку:
- Первый шаг — добавить измененные файлы в локальное репо.
$ 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
- Ваши файлы теперь подготовлены, затем вы зафиксируете изменения.
$ 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.
- Отправьте зафиксированные изменения в локальном репозитории на GitHub для создания запроса на включение (PR).
$ git push -u origin master
# Pushes the changes in your local repository up to the remote
# repository you specified as the origin
Ваши изменения кода теперь готовы к запросу на включение!
Выполните следующие шаги, чтобы поднять PR в репозитории terraform-google-modules/terraform-google-cloud-storage :
- В веб-браузере перейдите на главную страницу репозитория .
- В меню «Ветка» выберите вилку, содержащую ваши коммиты.
- Справа от меню «Ветвь» нажмите «Новый запрос на включение».
- Используйте базовое раскрывающееся меню «базовое», чтобы выбрать ветку, в которую вы хотите объединить свои изменения. Обычно это «главная» ветка, поскольку вы внесли изменения кода в свою ветку.
- Введите заголовок и описание вашего запроса на включение, чтобы описать изменения в коде. Будьте максимально конкретны, но при этом кратки.
- Чтобы создать запрос на включение, готовый к рассмотрению, нажмите «Создать запрос на включение».
- Вы увидите запущенные триггеры Cloud Build, которые срабатывают из-за PR.
Вы успешно внесли свое первое изменение кода в разветвленную ветку и подняли свой первый PR CFT в основной ветке!
12. Поздравления
Поздравляем, вы успешно добавили функцию в модуль CFT и отправили заявку на рассмотрение!
Вы добавили функцию в модуль CFT, протестировали ее локально на примере и выполнили тесты перед отправкой кода на GitHub. Наконец, вы подали заявку на рассмотрение и окончательное слияние с ЦФТ.
Теперь вы знаете важные шаги для начала работы с Cloud Foundation Toolkit.