diff --git a/locals.tf b/locals.tf index 429ad11de..1ee2dcedd 100644 --- a/locals.tf +++ b/locals.tf @@ -26,4 +26,15 @@ locals { runners_machine_autoscaling = var.runners_machine_autoscaling } ) + + /* determines if the docker machine executable adds the Name tag automatically (versions >= 0.16.2) */ + # make sure to skip pre-release stuff in the semver by ignoring everything after "-" + docker_machine_version_used = split(".", split("-", var.docker_machine_version)[0]) + docker_machine_version_with_name_tag = split(".", "0.16.2") + docker_machine_version_test = [ + for i, j in reverse(range(length(local.docker_machine_version_used))) + : signum(local.docker_machine_version_with_name_tag[i] - local.docker_machine_version_used[i]) * pow(10, j) + ] + + docker_machine_adds_name_tag = signum(sum(local.docker_machine_version_test)) <= 0 } diff --git a/main.tf b/main.tf index f60d6e484..ba73e8b04 100644 --- a/main.tf +++ b/main.tf @@ -73,33 +73,24 @@ locals { template_runner_config = templatefile("${path.module}/template/runner-config.tpl", { - aws_region = var.aws_region - gitlab_url = var.runners_gitlab_url - gitlab_clone_url = var.runners_clone_url - runners_vpc_id = var.vpc_id - runners_subnet_id = length(var.subnet_id) > 0 ? var.subnet_id : var.subnet_id_runners - runners_aws_zone = data.aws_availability_zone.runners.name_suffix - runners_instance_type = var.docker_machine_instance_type - runners_spot_price_bid = var.docker_machine_spot_price_bid == "on-demand-price" ? "" : var.docker_machine_spot_price_bid - runners_ami = data.aws_ami.docker_machine.id - runners_security_group_name = aws_security_group.docker_machine.name - runners_monitoring = var.runners_monitoring - runners_ebs_optimized = var.runners_ebs_optimized - runners_instance_profile = aws_iam_instance_profile.docker_machine.name - runners_additional_volumes = local.runners_additional_volumes - docker_machine_options = length(local.docker_machine_options_string) == 1 ? "" : local.docker_machine_options_string - runners_name = var.runners_name - runners_tags = replace(replace(var.overrides["name_docker_machine_runners"] == "" ? format( - "Name,%s-docker-machine,%s,%s", - var.environment, - local.tags_string, - local.runner_tags_string, - ) : format( - "%s,%s,Name,%s", - local.tags_string, - local.runner_tags_string, - var.overrides["name_docker_machine_runners"], - ), ",,", ","), "/,$/", "") + aws_region = var.aws_region + gitlab_url = var.runners_gitlab_url + gitlab_clone_url = var.runners_clone_url + runners_vpc_id = var.vpc_id + runners_subnet_id = length(var.subnet_id) > 0 ? var.subnet_id : var.subnet_id_runners + runners_aws_zone = data.aws_availability_zone.runners.name_suffix + runners_instance_type = var.docker_machine_instance_type + runners_spot_price_bid = var.docker_machine_spot_price_bid == "on-demand-price" ? "" : var.docker_machine_spot_price_bid + runners_ami = data.aws_ami.docker_machine.id + runners_security_group_name = aws_security_group.docker_machine.name + runners_monitoring = var.runners_monitoring + runners_ebs_optimized = var.runners_ebs_optimized + runners_instance_profile = aws_iam_instance_profile.docker_machine.name + runners_additional_volumes = local.runners_additional_volumes + docker_machine_options = length(local.docker_machine_options_string) == 1 ? "" : local.docker_machine_options_string + docker_machine_name = format("%s-%s", local.runner_tags_merged["Name"], "%s") # %s is always needed + runners_name = var.runners_name + runners_tags = replace(replace(local.runner_tags_string, ",,", ","), "/,$/", "") runners_token = var.runners_token runners_executor = var.runners_executor runners_limit = var.runners_limit diff --git a/tags.tf b/tags.tf index e67fa45a8..e6d258d35 100644 --- a/tags.tf +++ b/tags.tf @@ -20,11 +20,21 @@ locals { var.agent_tags ) + runner_tags_merged = merge( + local.tags, + var.runner_tags, + # overwrites the `Name` key from `local.tags` + var.overrides["name_docker_machine_runners"] == "" ? { Name = format("%s-docker-machine", var.environment) } : { Name = var.overrides["name_docker_machine_runners"] }, + ) + + # remove the `Name` tag if docker+machine adds one to avoid a failure due to a duplicate `Name` tag + runner_tags = local.docker_machine_adds_name_tag ? { for k, v in local.runner_tags_merged : k => v if k != "Name" } : local.runner_tags_merged + tags_string = join(",", flatten([ for key in keys(local.tags) : [key, lookup(local.tags, key)] ])) runner_tags_string = join(",", flatten([ - for key in keys(var.runner_tags) : [key, lookup(var.runner_tags, key)] + for key in keys(local.runner_tags) : [key, lookup(local.runner_tags, key)] ])) } diff --git a/template/runner-config.tpl b/template/runner-config.tpl index 4f8968ff9..36cb42e81 100644 --- a/template/runner-config.tpl +++ b/template/runner-config.tpl @@ -45,7 +45,7 @@ listen_address = "${prometheus_listen_address}" IdleTime = ${runners_idle_time} ${runners_max_builds} MachineDriver = "amazonec2" - MachineName = "runner-%s" + MachineName = "${docker_machine_name}" MachineOptions = [ "amazonec2-instance-type=${runners_instance_type}", "amazonec2-region=${aws_region}", diff --git a/variables.tf b/variables.tf index 283dfe209..4c7130e55 100644 --- a/variables.tf +++ b/variables.tf @@ -573,7 +573,7 @@ variable "overrides" { The following attributes are supported: * `name_sg` set the name prefix and overwrite the `Name` tag for all security groups created by this module. * `name_runner_agent_instance` set the name prefix and override the `Name` tag for the EC2 gitlab runner instances defined in the auto launch configuration. - * `name_docker_machine_runners` override the `Name` tag of EC2 instances created by the runner agent. + * `name_docker_machine_runners` override the `Name` tag of EC2 instances created by the runner agent (used as name prefix for `docker_machine_version` >= 0.16.2). * `name_iam_objects` set the name prefix of all AWS IAM resources created by this module. EOT type = map(string)