The purpose of this step is to set up folder structure and projects for applications, which are connected as service projects to the shared VPC created in the previous stage.
- 0-bootstrap executed successfully.
- 1-org executed successfully.
- 2-environments executed successfully.
- 3-networks executed successfully.
- Obtain the value for the access_context_manager_policy_id variable. Can be obtained by running
gcloud access-context-manager policies list --organization YOUR-ORGANIZATION_ID --format="value(name)". - Obtain the values for the
perimeter_namefor each environment variable by runninggcloud access-context-manager perimeters list --policy ACCESS_CONTEXT_MANAGER_POLICY_ID --format="value(name)".
Troubleshooting:
If your user does not have access to run the commands above and you are in the organization admins group, you can append --impersonate-service-account=org-terraform@<SEED_PROJECT_ID>.iam.gserviceaccount.com to run the command as the terraform service account.
- Clone repo
gcloud source repos clone gcp-projects --project=YOUR_CLOUD_BUILD_PROJECT_ID - Change freshly cloned repo and change to non master branch
git checkout -b plan(the branchplanis not a special one. Any branch which name is different fromdevelopment,non-productionorproductionwill trigger a terraform plan). - Copy contents of foundation to new repo
cp -RT ../terraform-example-foundation/4-projects/ .(modify accordingly based on your current directory) - Copy cloud build configuration files for terraform
cp ../terraform-example-foundation/build/cloudbuild-tf-* .(modify accordingly based on your current directory). - Copy terraform wrapper script
cp ../terraform-example-foundation/build/tf-wrapper.sh .to the root of your new repository (modify accordingly based on your current directory). - Ensure wrapper script can be executed
chmod 755 ./tf-wrapper.sh. - Rename
common.auto.example.tfvarstocommon.auto.tfvarsand update the file with values from your environment and bootstrap. - Rename
development.auto.example.tfvarstodevelopment.auto.tfvarsand update the file with theperimeter_namethat starts withsp_d_shared_restricted. - Rename
non-production.auto.example.tfvarstonon-production.auto.tfvarsand update the file with theperimeter_namethat starts withsp_n_shared_restricted. - Rename
production.auto.example.tfvarstoproduction.auto.tfvarsand update the file with theperimeter_namethat starts withsp_p_shared_restricted. - Commit changes with
git add .andgit commit -m 'Your message' - Push your plan branch to trigger a plan
git push --set-upstream origin plan(the branchplanis not a special one. Any branch which name is different fromdevelopment,non-productionorproductionwill trigger a terraform plan).- Review the plan output in your cloud build project https://console.cloud.google.com/cloud-build/builds?project=YOUR_CLOUD_BUILD_PROJECT_ID
- Merge changes to development with
git checkout -b developmentandgit push origin development- Review the apply output in your cloud build project https://console.cloud.google.com/cloud-build/builds?project=YOUR_CLOUD_BUILD_PROJECT_ID
- Merge changes to non-production with
git checkout -b non-productionandgit push origin non-production- Review the apply output in your cloud build project https://console.cloud.google.com/cloud-build/builds?project=YOUR_CLOUD_BUILD_PROJECT_ID
- Merge changes to production with
git checkout -b productionandgit push origin production- Review the apply output in your cloud build project https://console.cloud.google.com/cloud-build/builds?project=YOUR_CLOUD_BUILD_PROJECT_ID
-
Clone the repo you created manually in bootstrap:
git clone <YOUR_NEW_REPO-4-projects> -
Navigate into the repo
cd YOUR_NEW_REPO_CLONE-4-projectsand change to a non production branchgit checkout -b plan(the branchplanis not a special one. Any branch which name is different fromdevelopment,non-productionorproductionwill trigger a terraform plan). -
Copy contents of foundation to new repo
cp -RT ../terraform-example-foundation/4-projects/ .(modify accordingly based on your current directory). -
Copy the Jenkinsfile script
cp ../terraform-example-foundation/build/Jenkinsfile .to the root of your new repository (modify accordingly based on your current directory). -
Update the variables located in the
environment {}section of theJenkinsfilewith values from your environment:_POLICY_REPO (optional) _TF_SA_EMAIL _STATE_BUCKET_NAME -
Copy terraform wrapper script
cp ../terraform-example-foundation/build/tf-wrapper.sh .to the root of your new repository (modify accordingly based on your current directory). -
Ensure wrapper script can be executed
chmod 755 ./tf-wrapper.sh. -
Rename
common.auto.example.tfvarstocommon.auto.tfvarsand update the file with values from your environment and bootstrap. -
Rename
development.auto.example.tfvarstodevelopment.auto.tfvarsand update the file with theperimeter_namethat starts withsp_d_shared_restricted. -
Rename
non-production.auto.example.tfvarstonon-production.auto.tfvarsand update the file with theperimeter_namethat starts withsp_n_shared_restricted. -
Rename
production.auto.example.tfvarstoproduction.auto.tfvarsand update the file with theperimeter_namethat starts withsp_p_shared_restricted. -
Commit changes with
git add .andgit commit -m 'Your message' -
Push your plan branch
git push --set-upstream origin plan. The branchplanis not a special one. Any branch which name is different fromdevelopment,non-productionorproductionwill trigger a terraform plan.- Assuming you configured an automatic trigger in your Jenkins Master (see Jenkins sub-module README), this will trigger a plan. You can also trigger a Jenkins job manually. Given the many options to do this in Jenkins, it is out of the scope of this document see Jenkins website for more details.
- Review the plan output in your Master's web UI.
-
After production has been applied apply development and non-production
-
Merge changes to development branch with
git checkout -b developmentandgit push origin development- Review the apply output in your Master's web UI (You might want to use the option to "Scan Multibranch Pipeline Now" in your Jenkins Master UI).
-
Merge changes to non-production branch with
git checkout -b non-productionandgit push origin non-production- Review the apply output in your Master's web UI (You might want to use the option to "Scan Multibranch Pipeline Now" in your Jenkins Master UI).
-
Merge changes to production branch with
git checkout -b productionandgit push origin production- Review the apply output in your Master's web UI (You might want to use the option to "Scan Multibranch Pipeline Now" in your Jenkins Master UI).
-
You can now move to the instructions in the step 4-projects.
- Change into 4-projects folder.
- Run
cp ../build/tf-wrapper.sh . - Run
chmod 755 ./tf-wrapper.sh - Rename
common.auto.example.tfvarstocommon.auto.tfvarsand update the file with values from your environment and bootstrap. - Rename
development.auto.example.tfvarstodevelopment.auto.tfvarsand update the file with theperimeter_namethat starts withsp_d_shared_restricted. - Rename
non-production.auto.example.tfvarstonon-production.auto.tfvarsand update the file with theperimeter_namethat starts withsp_n_shared_restricted. - Rename
production.auto.example.tfvarstoproduction.auto.tfvarsand update the file with theperimeter_namethat starts withsp_p_shared_restricted. - Update backend.tf with your bucket from bootstrap. You can run
for i in `find -name 'backend.tf'`; do sed -i 's/UPDATE_ME/<YOUR-BUCKET-NAME>/' $i; done. You can runterraform output gcs_bucket_tfstatein the 0-bootstap folder to obtain the bucket name.
We will now deploy each of our environments(development/production/non-production) using this script. When using Cloud Build or Jenkins as your CI/CD tool each environment corresponds to a branch is the repository for 4-projects step and only the corresponding environment is applied.
- Run
./tf-wrapper.sh init production - Run
./tf-wrapper.sh plan productionand review output. - Run
./tf-wrapper.sh apply production - Run
./tf-wrapper.sh init non-production - Run
./tf-wrapper.sh plan non-productionand review output. - Run
./tf-wrapper.sh apply non-production - Run
./tf-wrapper.sh init development - Run
./tf-wrapper.sh plan developmentand review output. - Run
./tf-wrapper.sh apply development
If you received any errors or made any changes to the Terraform config or terraform.tfvars you must re-run ./tf-wrapper.sh plan <env> before run ./tf-wrapper.sh apply <env>