|
| 1 | +resource "random_string" "rand" { |
| 2 | + length = 24 |
| 3 | + special = false |
| 4 | + upper = false |
| 5 | +} |
| 6 | + |
| 7 | +locals { |
| 8 | + namespace = substr(join("-", [var.name, random_string.rand.result]), 0, 24) |
| 9 | + projects = ["plan", "apply"] |
| 10 | +} |
| 11 | + |
| 12 | +resource "aws_codebuild_project" "project" { |
| 13 | + count = length(local.projects) |
| 14 | + name = "${local.namespace}-${local.projects[count.index]}" |
| 15 | + service_role = aws_iam_role.codebuild_role.id |
| 16 | + |
| 17 | + artifacts { |
| 18 | + type = "NO_ARTIFACTS" |
| 19 | + } |
| 20 | + |
| 21 | + environment { |
| 22 | + compute_type = "BUILD_GENERAL1_SMALL" |
| 23 | + image = "hashicorp/terraform:${var.terraform_version}" |
| 24 | + type = "LINUX_CONTAINER" |
| 25 | + } |
| 26 | + |
| 27 | + source { |
| 28 | + type = "NO_SOURCE" |
| 29 | + buildspec = file("${path.module}/templates/buildspec_${local.projects[count.index]}.yml") |
| 30 | + } |
| 31 | +} |
| 32 | + |
| 33 | +locals { |
| 34 | + backend = templatefile("${path.module}/templates/backend.json", { config : var.s3_backend_config, name : local.namespace }) |
| 35 | + default_environment = { |
| 36 | + TF_IN_AUTOMATION = "1" |
| 37 | + TF_INPUT = "1" |
| 38 | + WORKING_DIRECTORY = var.working_directory |
| 39 | + BACKEND = local.backend, |
| 40 | + } |
| 41 | + environment = jsonencode([for k, v in merge(local.default_environment, var.environment) : { name : k, value : v, type : "PLAINTEXT" }]) |
| 42 | +} |
| 43 | + |
| 44 | +resource "aws_s3_bucket" "codepipeline_bucket" { |
| 45 | + bucket = "${local.namespace}-codepipeline-bucket" |
| 46 | + acl = "private" |
| 47 | + force_destroy = true |
| 48 | +} |
| 49 | + |
| 50 | +resource "aws_sns_topic" "codepipeline" { |
| 51 | + name = "${local.namespace}-pipeline-topic" |
| 52 | +} |
| 53 | + |
| 54 | +resource "aws_codepipeline" "codepipeline" { |
| 55 | + name = "${local.namespace}-pipeline" |
| 56 | + role_arn = aws_iam_role.codepipeline_role.arn |
| 57 | + |
| 58 | + artifact_store { |
| 59 | + location = aws_s3_bucket.codepipeline_bucket.bucket |
| 60 | + type = "S3" |
| 61 | + } |
| 62 | + |
| 63 | + stage { |
| 64 | + name = "Source" |
| 65 | + |
| 66 | + action { |
| 67 | + name = "Source" |
| 68 | + category = "Source" |
| 69 | + owner = "ThirdParty" |
| 70 | + provider = "GitHub" |
| 71 | + version = "1" |
| 72 | + output_artifacts = ["source_output"] |
| 73 | + |
| 74 | + configuration = { |
| 75 | + Owner = split("/", var.vcs_repo.identifier)[0] |
| 76 | + Repo = split("/", var.vcs_repo.identifier)[1] |
| 77 | + Branch = var.vcs_repo.branch |
| 78 | + OAuthToken = var.vcs_repo.oauth_token |
| 79 | + } |
| 80 | + } |
| 81 | + } |
| 82 | + |
| 83 | + stage { |
| 84 | + name = "Plan" |
| 85 | + |
| 86 | + action { |
| 87 | + name = "Plan" |
| 88 | + category = "Build" |
| 89 | + owner = "AWS" |
| 90 | + provider = "CodeBuild" |
| 91 | + input_artifacts = ["source_output"] |
| 92 | + version = "1" |
| 93 | + |
| 94 | + configuration = { |
| 95 | + ProjectName = aws_codebuild_project.project[0].name |
| 96 | + EnvironmentVariables = local.environment |
| 97 | + } |
| 98 | + } |
| 99 | + } |
| 100 | + |
| 101 | + dynamic "stage" { |
| 102 | + for_each = ! var.auto_apply ? [1] : [] |
| 103 | + content { |
| 104 | + name = "Approval" |
| 105 | + |
| 106 | + action { |
| 107 | + name = "Approval" |
| 108 | + category = "Approval" |
| 109 | + owner = "AWS" |
| 110 | + provider = "Manual" |
| 111 | + version = "1" |
| 112 | + |
| 113 | + configuration = { |
| 114 | + CustomData = "Please review output of plan and approve" |
| 115 | + NotificationArn = aws_sns_topic.codepipeline.arn |
| 116 | + } |
| 117 | + } |
| 118 | + } |
| 119 | + } |
| 120 | + |
| 121 | + stage { |
| 122 | + name = "Apply" |
| 123 | + |
| 124 | + action { |
| 125 | + name = "Apply" |
| 126 | + category = "Build" |
| 127 | + owner = "AWS" |
| 128 | + provider = "CodeBuild" |
| 129 | + input_artifacts = ["source_output"] |
| 130 | + version = "1" |
| 131 | + |
| 132 | + configuration = { |
| 133 | + ProjectName = aws_codebuild_project.project[1].name |
| 134 | + EnvironmentVariables = local.environment |
| 135 | + } |
| 136 | + } |
| 137 | + } |
| 138 | +} |
0 commit comments