The application is a web-based e-commerce app where users can browse items, add them to the cart, and purchase them.
In the developer platform, it is deployed into a single namespace/fleet scope (cymbalshops
). All the 11 microservices that build this application are deployed through a single admin
project using Cloud Deploy. This means only one skaffold.yaml
file is required to deploy all services.
For more information about the Cymbal Bank application, please visit microservices-demo repository.
This example requires:
- 1-bootstrap phase executed successfully.
- 2-multitenant phase executed successfully.
- 3-fleetscope phase executed successfully.
Please note that some steps in this documentation are specific to the selected Git provider. These steps are clearly marked at the beginning of each instruction. For example, if a step applies only to GitHub users, it will be labeled with "(GitHub only)."
IMPORTANT: The steps below assume that you are checked out on the same level as terraform-google-enterprise-application
and terraform-example-foundation
directories.
.
├── terraform-example-foundation
├── terraform-google-enterprise-application
└── .
-
Navigate to the Multitenant repository and add the value below if it is not present:
apps = { + "cymbal-shop": { + "acronym" = "cs", + }, ... }
The namespaces created at 3-fleetscope will be used in the application kubernetes manifests, when specifying where the workload will run. Typically, the application namespace will be created on 3-fleetscope and specified in 6-appsource.
-
Navigate to Fleetscope repository and add the Cymbal Shop namespaces at
terraform.tfvars
, if the namespace was not created already:namespace_ids = { + "cymbalshops" = "[email protected]", ... }
-
Commit and push changes. Because the plan branch is not a named environment branch, pushing your plan branch triggers terraform plan but not terraform apply. Review the plan output in your Cloud Build project. https://console.cloud.google.com/cloud-build/builds;region=DEFAULT_REGION?project=YOUR_CLOUD_BUILD_PROJECT_ID
git checkout plan git add . git commit -m 'Adds Cymbal shop namespaces.' git push --set-upstream origin plan
-
Merge changes to development. Because this is a named environment branch, pushing to this branch triggers both terraform plan and terraform apply. Review the apply output in your Cloud Build project https://console.cloud.google.com/cloud-build/builds;region=DEFAULT_REGION?project=YOUR_CLOUD_BUILD_PROJECT_ID
git checkout development git merge plan git push origin development
-
Merge changes to nonproduction. Because this is a named environment branch, pushing to this branch triggers both terraform plan and terraform apply. Review the apply output in your Cloud Build project https://console.cloud.google.com/cloud-build/builds;region=DEFAULT_REGION?project=YOUR_CLOUD_BUILD_PROJECT_ID
git checkout nonproduction git merge development git push origin nonproduction
-
Merge changes to production. Because this is a named environment branch, pushing to this branch triggers both terraform plan and terraform apply. Review the apply output in your Cloud Build project https://console.cloud.google.com/cloud-build/builds;region=DEFAULT_REGION?project=YOUR_CLOUD_BUILD_PROJECT_ID
git checkout production git merge nonproduction git push origin production
-
Navigate out of the Fleetscope repository:
cd ../
This stage will setup the application admin project, and infrastructure specific projects if created.
-
Navigate to Application Factory repository and checkout plan branch:
cd eab-applicationfactory git checkout plan
-
Navigate to the Application Factory repository and add the value below to the applications variable on
terraform.tfvars
:applications = { + "cymbal-shop" = { + "cymbalshop" = { + create_infra_project = false + create_admin_project = true + }, + } ... }
-
After the modification, commit changes:
git commit -am 'Adds Cymbal shop' git push --set-upstream origin plan
-
Merge changes to production. Because this is a named environment branch, pushing to this branch triggers both terraform plan and terraform apply. Review the apply output in your Cloud Build project https://console.cloud.google.com/cloud-build/builds;region=DEFAULT_REGION?project=YOUR_CLOUD_BUILD_PROJECT_ID
git checkout production git merge plan git push origin production
-
Move out of App Factory folder:
cd ../
This stage will create the CI/CD pipeline for the service, and application specific infrastructure if specified.
IMPORTANT: The steps below assume that you are checked out on the same level as terraform-google-enterprise-application
and terraform-example-foundation
directories.
.
├── terraform-example-foundation
├── terraform-google-enterprise-application
└── .
-
Retrieve Cymbal Shop repository, Admin Project, and Application specific State Bucket that were created on 4-appfactory stage.
cd eab-applicationfactory/envs/shared/ terraform init export cymbalshop_project=$(terraform output -json app-group | jq -r '.["cymbal-shop.cymbalshop"]["app_admin_project_id"]') echo cymbalshop_project=$cymbalshop_project export cymbalshop_infra_repo=$(terraform output -json app-group | jq -r '.["cymbal-shop.cymbalshop"]["app_infra_repository_name"]') echo cymbalshop_infra_repo=$cymbalshop_infra_repo export cymbalshop_statebucket=$(terraform output -json app-group | jq -r '.["cymbal-shop.cymbalshop"]["app_cloudbuild_workspace_state_bucket_name"]' | sed 's/.*\///') echo cymbalshop_statebucket=$cymbalshop_statebucket cd ../../../
-
Use
terraform output
to get the state bucket value from 1-bootstrap output and replace the placeholder interraform.tfvars
.terraform -chdir="./terraform-google-enterprise-application/1-bootstrap/" init export remote_state_bucket=$(terraform -chdir="./terraform-google-enterprise-application/1-bootstrap/" output -raw state_bucket) echo "remote_state_bucket = ${remote_state_bucket}"
-
(CSR Only) Clone the repositories for each service and initialize:
gcloud source repos clone $cymbalshop_infra_repo --project=$cymbalshop_project
-
(GitHub Only) When using GitHub, clone the repository with the following command.
git clone [email protected]:<GITHUB-OWNER or ORGANIZATION>/$cymbalshop_infra_repo.git
NOTE: Make sure to replace
<GITHUB-OWNER or ORGANIZATION>
with your actual GitHub owner or organization name. -
(GitLab Only) When using GitLab, clone the repository with the following command.
git clone [email protected]:<GITLAB-GROUP or ACCOUNT>/$cymbalshop_infra_repo.git
NOTE: Make sure to replace
<GITLAB-GROUP or ACCOUNT>
with your actual GitLab group or account name. -
Copy terraform code for each service repository and replace backend bucket:
rm -rf $cymbalshop_infra_repo/modules cp -R ./terraform-google-enterprise-application/examples/cymbal-shop/5-appinfra/cymbal-shop/cymbalshop/envs $cymbalshop_infra_repo rm -rf $cymbalshop_infra_repo/modules cp -R ./terraform-google-enterprise-application//5-appinfra/modules $cymbalshop_infra_repo cp ./terraform-example-foundation/build/cloudbuild-tf-* $cymbalshop_infra_repo/ cp ./terraform-example-foundation/build/tf-wrapper.sh $cymbalshop_infra_repo/ chmod 755 $cymbalshop_infra_repo/tf-wrapper.sh cp -RT ./terraform-example-foundation/policy-library/ $cymbalshop_infra_repo/policy-library rm -rf $cymbalshop_infra_repo/policy-library/policies/constraints/* sed -i 's/CLOUDSOURCE/FILESYSTEM/g' $cymbalshop_infra_repo/cloudbuild-tf-* sed -i'' -e "s/UPDATE_INFRA_REPO_STATE/$cymbalshop_statebucket/" $cymbalshop_infra_repo/envs/shared/backend.tf sed -i'' -e "s/REMOTE_STATE_BUCKET/${remote_state_bucket}/" $cymbalshop_infra_repo/envs/shared/terraform.tfvars
-
Commit files to cymbalshop repository in the plan branch:
cd $cymbalshop_infra_repo git checkout -b plan git add . git commit -m 'Initialize cymbalshop repo' git push --set-upstream origin plan
-
Merge plan branch to production branch and push to remote:
git checkout -b production git push --set-upstream origin production
-
You can view the build results on Google Cloud Build at the admin project.
IMPORTANT: The steps below assume that you are checked out on the same level as terraform-google-enterprise-application
and terraform-example-foundation
directories.
.
├── terraform-example-foundation
├── terraform-google-enterprise-application
└── .
-
Clone the
microservices-demo
repository, it contains the cymbal-shop source code:git clone --branch v0.10.1 https://github.com/GoogleCloudPlatform/microservices-demo.git cymbal-shop
-
Navigate to the repository and create main branch on top of the current version:
cd cymbal-shop git checkout -b main
-
(CSR Only) Add the remote source repository, this repository will host your application source code:
git remote add google https://source.developers.google.com/p/$cymbalshop_project/r/eab-cymbal-shop-cymbalshop
-
(GitHub Only) When using GitHub, add the remote source repository with the following command.
git remote add origin https://github.com/<GITHUB-OWNER or ORGANIZATION>/eab-cymbal-shop-cymbalshop.git
NOTE: Make sure to replace
<GITHUB-OWNER or ORGANIZATION>
with your actual GitHub owner or organization name. -
(GitLab Only) When using GitLab, add the remote source repository with the following command.
git remote add origin https://gitlab.com/<GITLAB-GROUP or ACCOUNT>/eab-cymbal-shop-cymbalshop.git
NOTE: Make sure to replace
<GITLAB-GROUP or ACCOUNT>
with your actual GitLab group or account name. -
Overwrite the repository source code with the overlays defined in
examples/cymbal-shop
:cp -r ../terraform-google-enterprise-application/examples/cymbal-shop/6-appsource/cymbal-shop/* .
-
Add changes and commit to the specified remote, this will trigger the associated Cloud Build CI/CD pipeline:
git add . git commit -m "Add Cymbal Shop Code" git push google main
-
You can view the build results on the Cymbal Shop Admin Project.
IMPORTANT: The steps below assume that you are checked out on the same level as terraform-google-enterprise-application
and terraform-example-foundation
directories.
.
├── terraform-google-enterprise-application
└── .
-
Navigate to the Multitenant repository and add the value below if it is not present:
apps = { + "cymbal-shop": { + "acronym" = "cs", + }, ... }
The namespaces created at 3-fleetscope will be used in the application kubernetes manifests, when specifying where the workload will run. Typically, the application namespace will be created on 3-fleetscope and specified in 6-appsource.
-
Navigate to Fleetscope repository and add the Cymbal Shop namespaces at
terraform.tfvars
, if the namespace was not created already:namespace_ids = { + "cymbalshops" = "[email protected]", ... }
-
Add the cymbal shop application to the
terraform.tfvars
file on 4-appfactory:applications = { + "cymbal-shop" = { + "cymbalshop" = { + create_infra_project = false + create_admin_project = true + }, + } ... }
The specified values above will create a sigle admin
project for cymbal-shop application. In this case, all cymbal-shop microservices CI/CD pipelines will be on the same project.
- Run
terraform apply
command on4-appfactory/envs/shared
.
-
Copy the directories under
examples/cymbal-shop/5-appinfra
to5-appinfra
.APP_INFRA_REPO=$(readlink -f ./terraform-google-enterprise-application/5-appinfra) cp -r $APP_INFRA_REPO/../examples/cymbal-shop/5-appinfra/* $APP_INFRA_REPO/apps/ (cd $APP_INFRA_REPO/apps/cymbal-shop/cymbalshop && rm -rf modules && ln -s ../../../modules modules)
NOTE: This command must be run on the same level as
terraform-google-enterprise-application
directory. -
Navigate to
terraform-google-enterprise-application/5-appinfra
directorycd terraform-google-enterprise-application/5-appinfra
-
Adjust the
backend.tf
file with values from your environment. Follow the steps below to retrieve the backend and replace the placeholder:-
Retrieve state bucket from 4-appfactory and update the example with it:
export cymbalshop_statebucket=$(terraform -chdir=../4-appfactory/envs/shared output -json app-group | jq -r '.["cymbal-shop.cymbalshop"].app_cloudbuild_workspace_state_bucket_name' | sed 's/.*\///') echo cymbalshop_statebucket=$cymbalshop_statebucket sed -i'' -e "s/UPDATE_INFRA_REPO_STATE/$cymbalshop_statebucket/" $APP_INFRA_REPO/apps/cymbal-shop/cymbalshop/envs/shared/backend.tf
-
-
Adjust the
terraform.tfvars
file with values from your environment. Follow the steps below to retrieve the state bucket and replace the placeholder:-
Use
terraform output
to get the state bucket value from 1-bootstrap output and replace the placeholder interraform.tfvars
.terraform -chdir="../1-bootstrap/" init export remote_state_bucket=$(terraform -chdir="../1-bootstrap/" output -raw state_bucket) echo "remote_state_bucket = ${remote_state_bucket}" sed -i'' -e "s/REMOTE_STATE_BUCKET/${remote_state_bucket}/" $APP_INFRA_REPO/apps/cymbal-shop/cymbalshop/envs/shared//terraform.tfvars
-
-
Navigate to the service path (
5-appinfra/apps/cymbal-shop/cymbalshop/envs/shared
) and runterraform apply
command.
IMPORTANT: The steps below assume that you are checked out on the same level as terraform-google-enterprise-application
and terraform-example-foundation
directories.
.
├── terraform-google-enterprise-application
└── .
-
Clone the
microservices-demo
repository, it contains the cymbal-shop source code:git clone --branch v0.10.1 https://github.com/GoogleCloudPlatform/microservices-demo.git cymbal-shop
-
Navigate to the repository and create main branch on top of the current version:
cd cymbal-shop git checkout -b main
-
Retrieve the
admin
project value:export cymbalshop_project=$(terraform -chdir=../terraform-google-enterprise-application/4-appfactory/envs/shared output -json app-group | jq -r '.["cymbal-shop.cymbalshop"]["app_admin_project_id"]') echo cymbalshop_project=$cymbalshop_project
-
(CSR Only) Add the remote source repository, this repository will host your application source code:
git remote add google https://source.developers.google.com/p/$cymbalshop_project/r/eab-cymbal-shop-cymbalshop
-
(GitHub Only) When using GitHub, add the remote source repository with the following command.
git remote add origin https://github.com/<GITHUB-OWNER or ORGANIZATION>/eab-cymbal-shop-cymbalshop.git
NOTE: Make sure to replace
<GITHUB-OWNER or ORGANIZATION>
with your actual GitHub owner or organization name. -
(GitLab Only) When using GitLab, add the remote source repository with the following command.
git remote add origin https://gitlab.com/<GITLAB-GROUP or ACCOUNT>/eab-cymbal-shop-cymbalshop.git
NOTE: Make sure to replace
<GITLAB-GROUP or ACCOUNT>
with your actual GitLab group or account name. -
Overwrite the repository source code with the overlays defined in
examples/cymbal-shop
:cp -r ../terraform-google-enterprise-application/examples/cymbal-shop/6-appsource/cymbal-shop/* .
-
Add changes and commit to the specified remote, this will trigger the associated Cloud Build CI/CD pipeline:
git add . git commit -m "Add Cymbal Shop Code" git push google main
-
You can view the build results on the Cymbal Shop Admin Project.