diff --git a/.kitchen.yml b/.kitchen.yml deleted file mode 100644 index 1ebcfc03..00000000 --- a/.kitchen.yml +++ /dev/null @@ -1,104 +0,0 @@ -# Copyright 2018 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - ---- -provisioner: - name: terraform - -platforms: - - name: local - -verifier: - name: terraform - color: false - systems: - - name: system - backend: local - -suites: - - name: minimal - driver: - name: terraform - verify_version: false - command_timeout: 1800 - root_module_directory: test/fixtures/minimal - - name: vpc_sc_project - driver: - name: terraform - verify_version: false - command_timeout: 1800 - root_module_directory: test/fixtures/vpc_sc_project - - name: fabric_project - driver: - name: terraform - verify_version: false - command_timeout: 1800 - root_module_directory: test/fixtures/fabric_project - - name: app_engine - driver: - name: terraform - verify_version: false - command_timeout: 1800 - root_module_directory: test/fixtures/app_engine - - name: budget - driver: - name: terraform - verify_version: false - command_timeout: 1800 - root_module_directory: test/fixtures/budget - - name: dynamic_shared_vpc - driver: - name: terraform - verify_version: false - command_timeout: 1800 - root_module_directory: test/fixtures/dynamic_shared_vpc - verifier: - name: terraform - color: true - systems: - - name: inspec-gcp - backend: gcp - controls: - - secondary - - name: local - backend: local - controls: - - svpc - - -# Disabled due to issue #275 -# (https://github.com/terraform-google-modules/terraform-google-project-factory/issues/275) -# - name: full -# driver: -# name: terraform -# verify_version: false -# command_timeout: 1800 -# root_module_directory: test/fixtures/full -# - name: "shared_vpc_no_subnets" -# driver: -# name: "terraform" -# verify_version: false -# command_timeout: 1800 -# root_module_directory: test/fixtures/shared_vpc_no_subnets/ -# verifier: -# name: terraform -# systems: -# - name: inspec-gcp -# backend: gcp -# controls: -# - gcp -# - name: local -# backend: local -# controls: -# - gcloud diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 604fa424..31e78a11 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,207 +1,19 @@ -# Contributing +Please see +https://github.com/GoogleCloudPlatform/cloud-foundation-toolkit/blob/main/CONTRIBUTING-module-repos.md. -This document provides guidelines for contributing to the Google Cloud Project Factory Terraform Module. +In addition to those instructions, you will need a few additional environment +variables to run tests: -## Dependencies - -The following dependencies must be installed on the development system: - -- [Docker Engine][docker-engine] -- [Google Cloud SDK][google-cloud-sdk] -- [make] - -### File structure - -The project has the following folders and files: - -- /: root folder -- /examples: examples for using this module -- /scripts: Scripts for specific tasks on module (see Infrastructure section on - this file) -- /test: Folders with files for testing the module (see Testing section on this - file) -- /helpers: Optional helper scripts for ease of use -- /main.tf: main file for this module, contains all the resources to create -- /variables.tf: all the variables for the module -- /output.tf: the outputs of the module -- /readme.md: this file - -## Generating Documentation for Inputs and Outputs - -The Inputs and Outputs tables in the READMEs of the root module, -submodules, and example modules are automatically generated based on -the `variables` and `outputs` of the respective modules. These tables -must be refreshed if the module interfaces are changed. - -### Execution - -Run `make generate_docs` to generate new Inputs and Outputs tables. - -## Integration Testing - -Integration tests are used to verify the behaviour of the root module, -submodules, and example modules. Additions, changes, and fixes should -be accompanied with tests. - -The integration tests are run using [Kitchen][kitchen], -[Kitchen-Terraform][kitchen-terraform], and [InSpec][inspec]. These -tools are packaged within a Docker image for convenience. - -The general strategy for these tests is to verify the behaviour of the -[example modules](./examples/), thus ensuring that the root module, -submodules, and example modules are all functionally correct. - -### Test Environment - -The easiest way to test the module is in an isolated test project and folder. -The setup for such a project and folder is defined in [test/setup](./test/setup/) directory. -This setup will create a dedicated folder, a project within the folder to hold a service -account that will be used to run the integration tests. It will assign all needed roles -to the service account and will also create a access context manager policy needed for test execution. - -To use and execute this setup, you need a service account with the following roles: - -- Project Creator access on the folder (if you want to delete the setup later ProjectDeleter is also needed). -- Folder Admin on the folder. -- Access Context Manager Editor or Admin on the organization. -- Billing Account Administrator on the billing account or on the organization. -- Organization Administrator on the organization in order to grant the created service account permissions on organization level. - -Export the Service Account credentials to your environment like so: - -```bash -export SERVICE_ACCOUNT_JSON=$(< credentials.json) -``` - -You will also need to set a few environment variables: - -```bash -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" -export TF_VAR_gsuite_admin_email="your_gsuite_admin_email" -export TF_VAR_gsuite_domain="your_gsuite_domain" -``` - -With these settings in place, you can prepare the test setup using Docker: - -```bash -make docker_test_prepare -``` - -### Noninteractive Execution - -Run `make docker_test_integration` to test all of the example modules -noninteractively, using the prepared test project. - -### Interactive Execution - -1. Run `make docker_run` to start the testing Docker container in - interactive mode. - -1. Run `kitchen_do create ` to initialize the working - directory for an example module. - -1. Run `kitchen_do converge ` to apply the example module. - -1. Run `kitchen_do verify ` to test the example module. - -1. Run `kitchen_do destroy ` to destroy the example module - state. - -## Linting and Formatting - -Many of the files in the repository can be linted or formatted to -maintain a standard of quality. - -### Execution - -Run `make docker_test_lint`. - -## Releasing New Versions - -New versions can be released by pushing tags to this repository's origin on -GitHub. There is a Make target to facilitate the process: +TODO: check/trim ```bash -make release-new-version +export BILLING_ACCOUNT_ID="YOUR_BILLING_ACCOUNT" +export DOMAIN="YOUR_DOMAIN" +export FOLDER_ID="YOUR_FOLDER_ID" +export GROUP_NAME="YOUR_GROUP_NAME" +export ADMIN_ACCOUNT_EMAIL="YOUR_ADMIN_ACCOUNT_EMAIL" +export ORG_ID="YOUR_ORG_ID" +export PROJECT_ID="YOUR_PROJECT_ID" +CREDENTIALS_FILE="credentials.json" +export SERVICE_ACCOUNT_JSON=`cat ${CREDENTIALS_FILE}` ``` - -The new version must be documented in [CHANGELOG.md](CHANGELOG.md) for the -target to work. - -See the Terraform documentation for more info on [releasing new -versions][release-new-version]. - -[release-new-version]: https://www.terraform.io/docs/registry/modules/publish.html#releasing-new-versions -[docker-engine]: https://www.docker.com/products/docker-engine -[flake8]: http://flake8.pycqa.org/en/latest/ -[gofmt]: https://golang.org/cmd/gofmt/ -[google-cloud-sdk]: https://cloud.google.com/sdk/install -[hadolint]: https://github.com/hadolint/hadolint -[inspec]: https://inspec.io/ -[kitchen-terraform]: https://github.com/newcontext-oss/kitchen-terraform -[kitchen]: https://kitchen.ci/ -[make]: https://en.wikipedia.org/wiki/Make_(software) -[shellcheck]: https://www.shellcheck.net/ -[terraform-docs]: https://github.com/segmentio/terraform-docs -[terraform]: https://terraform.io/ - ---------------------------------------------------------------------------------------------------- - -Two test-kitchen instances are defined: - -- `full-local` - Test coverage for all project-factory features. -- `full-minimal` - Test coverage for a minimal set of project-factory features. - -### Setup - -1. Configure the [test fixtures](#test-configuration). -2. Download a Service Account key with the necessary [permissions](#permissions) - and put it in the module's root directory with the name `credentials.json`. -3. Add appropriate variables to your environment - - ```bash - export BILLING_ACCOUNT_ID="YOUR_BILLING_ACCOUNT" - export DOMAIN="YOUR_DOMAIN" - export FOLDER_ID="YOUR_FOLDER_ID" - export GROUP_NAME="YOUR_GROUP_NAME" - export ADMIN_ACCOUNT_EMAIL="YOUR_ADMIN_ACCOUNT_EMAIL" - export ORG_ID="YOUR_ORG_ID" - export PROJECT_ID="YOUR_PROJECT_ID" - CREDENTIALS_FILE="credentials.json" - export SERVICE_ACCOUNT_JSON=`cat ${CREDENTIALS_FILE}` - ``` - -4. Run the testing container in interactive mode. - - ```bash - make docker_run - ``` - - The module root directory will be loaded into the Docker container at `/cft/workdir/`. -5. Run kitchen-terraform to test the infrastructure. - - 1. `kitchen create` creates Terraform state. - 2. `kitchen converge` creates the underlying resources. You can run `kitchen converge minimal` to only create the minimal fixture. - 3. `kitchen verify` tests the created infrastructure. Run `kitchen verify minimal` to run the smaller test suite. - 4. `kitchen destroy` removes the created infrastructure. Run `kitchen destroy minimal` to remove the smaller test suite. - -Alternatively, you can simply run `make test_integration_docker` to run all the -test steps non-interactively. - -#### Test configuration - -Each test-kitchen instance is configured with a `terraform.tfvars` file in the -test fixture directory. For convenience, these are symlinked to a single shared file: - -```sh -cp "test/fixtures/shared/terraform.tfvars.example" \ - "test/fixtures/shared/terraform.tfvars" -$EDITOR "test/fixtures/shared/terraform.tfvars" -done -``` - -Integration tests can be run within a pre-configured docker container. Tests can -be run without user interaction for quick validation, or with user interaction -during development. diff --git a/Makefile b/Makefile index 3ff5b7d4..8586bd5c 100644 --- a/Makefile +++ b/Makefile @@ -76,7 +76,7 @@ docker_test_integration: -e TF_VAR_gsuite_domain \ -v "${CURDIR}":/workspace \ $(REGISTRY_URL)/${DOCKER_IMAGE_DEVELOPER_TOOLS}:${DOCKER_TAG_VERSION_DEVELOPER_TOOLS} \ - /usr/local/bin/test_integration.sh + cft test run all # Execute lint tests within the docker container .PHONY: docker_test_lint diff --git a/build/int.cloudbuild.yaml b/build/int.cloudbuild.yaml index f53d3f06..3338a003 100644 --- a/build/int.cloudbuild.yaml +++ b/build/int.cloudbuild.yaml @@ -19,169 +19,51 @@ steps: - id: prepare name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' args: ['/bin/bash', '-c', 'mkdir -p ~/.terraform.d && ln -s /root/.terraform.d/plugins ~/.terraform.d/plugins && source /usr/local/bin/task_helper_functions.sh && prepare_environment'] -- id: init-all +- id: minimal-local waitFor: - prepare name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'cft test run all --stage init --verbose'] -- id: create-all + args: ['/bin/bash', '-c', 'cft test run TestMinimalLocal --verbose'] +- id: fabric-project-local waitFor: - - init-all - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && kitchen_do create'] -- id: converge minimal-local - waitFor: - - create-all - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && kitchen_do converge minimal-local'] -- id: verify minimal-local - waitFor: - - converge minimal-local - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && kitchen_do verify minimal-local'] -- id: destroy minimal-local - waitFor: - - verify minimal-local - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && kitchen_do destroy minimal-local'] - -- id: converge fabric-project-local - waitFor: - - create-all - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && kitchen_do converge fabric-project-local'] -- id: verify fabric-project-local - waitFor: - - converge fabric-project-local - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && kitchen_do verify fabric-project-local'] -- id: destroy fabric-project-local - waitFor: - - verify fabric-project-local - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && kitchen_do destroy fabric-project-local'] - -- id: converge app-engine-local - waitFor: - - create-all - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && kitchen_do converge app-engine-local'] -- id: verify app-engine-local - waitFor: - - converge app-engine-local - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && kitchen_do verify app-engine-local'] -- id: destroy app-engine-local - waitFor: - - verify app-engine-local - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && kitchen_do destroy app-engine-local'] - -- id: converge budget-local - waitFor: - - create-all - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && kitchen_do converge budget-local'] -- id: verify budget-local - waitFor: - - converge budget-local - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && kitchen_do verify budget-local'] -- id: destroy budget-local - waitFor: - - verify budget-local - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && kitchen_do destroy budget-local'] - -# essential contacts -- id: init-essential-contacts-example - waitFor: - - create-all - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'cft test run TestEssentialContactsExample --stage init --verbose'] -- id: apply-essential-contacts-example - waitFor: - - init-essential-contacts-example - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'cft test run TestEssentialContactsExample --stage apply --verbose'] -- id: verify-essential-contacts-example - waitFor: - - apply-essential-contacts-example - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'cft test run TestEssentialContactsExample --stage verify --verbose'] -- id: destroy-essential-contacts-example - waitFor: - - verify-essential-contacts-example - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'cft test run TestEssentialContactsExample --stage destroy --verbose'] - -- id: converge dynamic-shared-vpc-local - waitFor: - - create-all - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && kitchen_do converge dynamic-shared-vpc-local'] -- id: verify dynamic-shared-vpc-local - waitFor: - - converge dynamic-shared-vpc-local - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && kitchen_do verify dynamic-shared-vpc-local'] -- id: destroy dynamic-shared-vpc-local - waitFor: - - verify dynamic-shared-vpc-local - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && kitchen_do destroy dynamic-shared-vpc-local'] - -- id: converge vpc-sc-project-local - waitFor: - - create-all - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && export TF_VAR_policy_id=$(gcloud access-context-manager policies list --organization="${TF_VAR_org_id:?}" --format="value(name)" --filter="title:default policy") && kitchen_do converge vpc-sc-project-local'] -- id: verify vpc-sc-project-local - waitFor: - - converge vpc-sc-project-local - name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && kitchen_do verify vpc-sc-project-local'] -- id: destroy vpc-sc-project-local - waitFor: - - verify vpc-sc-project-local + - prepare name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && export TF_VAR_policy_id=$(gcloud access-context-manager policies list --organization="${TF_VAR_org_id:?}" --format="value(name)" --filter="title:default policy") && kitchen_do destroy vpc-sc-project-local'] - -- id: init-quota-project-example + args: ['/bin/bash', '-c', 'cft test run TestFabricProjectLocal --verbose'] +- id: app-engine-local waitFor: - - create-all + - prepare name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'cft test run TestQuotaProject --stage init --verbose'] -- id: apply-quota-project-example + args: ['/bin/bash', '-c', 'cft test run TestAppEngineLocal --verbose'] +- id: budget-local waitFor: - - init-quota-project-example + - prepare name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'cft test run TestQuotaProject --stage apply --verbose'] -- id: verify-quota-project-example + args: ['/bin/bash', '-c', 'cft test run TestBudgetLocal --verbose'] +- id: essential-contacts-example waitFor: - - apply-quota-project-example + - prepare name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'cft test run TestQuotaProject --stage verify --verbose'] -- id: destroy-quota-project-example + args: ['/bin/bash', '-c', 'cft test run TestEssentialContactsExample --verbose'] +- id: dynamic-shared-vpc-local waitFor: - - verify-quota-project-example + - prepare name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'cft test run TestQuotaProject --stage destroy --verbose'] -- id: apply-tags-project-example + args: ['/bin/bash', '-c', 'cft test run TestDynamicSharedVPCLocal --verbose'] +- id: vpc-sc-project-local waitFor: - - create-all + - prepare name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'cft test run TestTagsProject --stage apply --verbose'] -- id: verify-tags-project-example + args: ['/bin/bash', '-c', 'source /usr/local/bin/task_helper_functions.sh && export TF_VAR_policy_id=$(gcloud access-context-manager policies list --organization="${TF_VAR_org_id:?}" --format="value(name)" --filter="title:default policy") && cft test run TestVPCSCProjectLocal --verbose'] +- id: quota-project-example waitFor: - - apply-tags-project-example + - prepare name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'cft test run TestTagsProject --stage verify --verbose'] -- id: destroy-tags-project-example + args: ['/bin/bash', '-c', 'cft test run TestQuotaProject --verbose'] +- id: tags-project-example waitFor: - - verify-tags-project-example + - prepare name: 'gcr.io/cloud-foundation-cicd/$_DOCKER_IMAGE_DEVELOPER_TOOLS:$_DOCKER_TAG_VERSION_DEVELOPER_TOOLS' - args: ['/bin/bash', '-c', 'cft test run TestTagsProject --stage destroy --verbose'] + args: ['/bin/bash', '-c', 'cft test run TestTagsProject --verbose'] tags: - 'ci'