in helpers/foundation-deployer/stages/apply.go [33:187]
func DeployBootstrapStage(t testing.TB, s steps.Steps, tfvars GlobalTFVars, c CommonConf) error {
bootstrapTfvars := BootstrapTfvars{
OrgID: tfvars.OrgID,
DefaultRegion: tfvars.DefaultRegion,
BillingAccount: tfvars.BillingAccount,
ParentFolder: tfvars.ParentFolder,
ProjectPrefix: tfvars.ProjectPrefix,
FolderPrefix: tfvars.FolderPrefix,
BucketForceDestroy: tfvars.BucketForceDestroy,
BucketTfstateKmsForceDestroy: tfvars.BucketTfstateKmsForceDestroy,
Groups: tfvars.Groups,
InitialGroupConfig: tfvars.InitialGroupConfig,
}
err := utils.WriteTfvars(filepath.Join(c.FoundationPath, BootstrapStep, "terraform.tfvars"), bootstrapTfvars)
if err != nil {
return err
}
// delete README-Jenkins.md due to private key checker false positive
jenkinsReadme := filepath.Join(c.FoundationPath, BootstrapStep, "README-Jenkins.md")
exist, err := utils.FileExists(jenkinsReadme)
if err != nil {
return err
}
if exist {
err = os.Remove(jenkinsReadme)
if err != nil {
return err
}
}
terraformDir := filepath.Join(c.FoundationPath, BootstrapStep)
options := &terraform.Options{
TerraformDir: terraformDir,
Logger: c.Logger,
NoColor: true,
}
// terraform deploy
err = applyLocal(t, options, "", c.PolicyPath, c.ValidatorProject)
if err != nil {
return err
}
// read bootstrap outputs
defaultRegion := terraform.OutputMap(t, options, "common_config")["default_region"]
cbProjectID := terraform.Output(t, options, "cloudbuild_project_id")
backendBucket := terraform.Output(t, options, "gcs_bucket_tfstate")
backendBucketProjects := terraform.Output(t, options, "projects_gcs_bucket_tfstate")
// replace backend and terraform init migrate
err = s.RunStep("gcp-bootstrap.migrate-state", func() error {
options.MigrateState = true
err = utils.CopyFile(filepath.Join(options.TerraformDir, "backend.tf.example"), filepath.Join(options.TerraformDir, "backend.tf"))
if err != nil {
return err
}
err = utils.ReplaceStringInFile(filepath.Join(options.TerraformDir, "backend.tf"), "UPDATE_ME", backendBucket)
if err != nil {
return err
}
_, err := terraform.InitE(t, options)
return err
})
if err != nil {
return err
}
// replace all backend files
err = s.RunStep("gcp-bootstrap.replace-backend-files", func() error {
files, err := utils.FindFiles(c.FoundationPath, "backend.tf")
if err != nil {
return err
}
for _, file := range files {
err = utils.ReplaceStringInFile(file, "UPDATE_ME", backendBucket)
if err != nil {
return err
}
err = utils.ReplaceStringInFile(file, "UPDATE_PROJECTS_BACKEND", backendBucketProjects)
if err != nil {
return err
}
}
return nil
})
if err != nil {
return err
}
msg.PrintBuildMsg(cbProjectID, defaultRegion, c.DisablePrompt)
// Check if image build was successful.
err = gcp.NewGCP().WaitBuildSuccess(t, cbProjectID, defaultRegion, "tf-cloudbuilder", "", "Terraform Image builder Build Failed for tf-cloudbuilder repository.", MaxBuildRetries)
if err != nil {
return err
}
//prepare policies repo
gcpPoliciesPath := filepath.Join(c.CheckoutPath, PoliciesRepo)
policiesConf := utils.CloneCSR(t, PoliciesRepo, gcpPoliciesPath, cbProjectID, c.Logger)
policiesBranch := "main"
err = s.RunStep("gcp-bootstrap.gcp-policies", func() error {
return preparePoliciesRepo(policiesConf, policiesBranch, c.FoundationPath, gcpPoliciesPath)
})
if err != nil {
return err
}
//prepare bootstrap repo
gcpBootstrapPath := filepath.Join(c.CheckoutPath, BootstrapRepo)
bootstrapConf := utils.CloneCSR(t, BootstrapRepo, gcpBootstrapPath, cbProjectID, c.Logger)
stageConf := StageConf{
Stage: BootstrapRepo,
CICDProject: cbProjectID,
DefaultRegion: defaultRegion,
Step: BootstrapStep,
Repo: BootstrapRepo,
CustomTargetDirPath: "envs/shared",
GitConf: bootstrapConf,
Envs: []string{"shared"},
}
// if groups creation is enable the helper will just push the code
// because Cloud Build build will fail until bootstrap
// service account is granted Group Admin role in the
// Google Workspace by a Super Admin.
// https://github.com/terraform-google-modules/terraform-google-group/blob/main/README.md#google-workspace-formerly-known-as-g-suite-roles
if tfvars.HasGroupsCreation() {
err = saveBootstrapCodeOnly(t, stageConf, s, c)
} else {
err = deployStage(t, stageConf, s, c)
}
if err != nil {
return err
}
// Init gcp-bootstrap terraform
err = s.RunStep("gcp-bootstrap.init-tf", func() error {
options := &terraform.Options{
TerraformDir: filepath.Join(gcpBootstrapPath, "envs", "shared"),
Logger: c.Logger,
NoColor: true,
}
_, err := terraform.InitE(t, options)
return err
})
if err != nil {
return err
}
fmt.Println("end of bootstrap deploy")
return nil
}