fast/extras/0-cicd-gitlab/main.tf (162 lines of code) (raw):
/**
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
locals {
_repository_files = flatten([
for k, v in var.projects : [
for f in concat(
[for f in fileset(path.module, "${v.populate_from}/*.svg") : f],
[for f in fileset(path.module, "${v.populate_from}/*.md") : f],
(v.populate_samples ? [
for f in fileset(path.module, "${v.populate_from}/*.sample") : f
] : []),
(v.populate_samples ? [
for f in fileset(path.module, "${v.populate_from}/data/**/*.*") : f
] : []),
[for f in fileset(path.module, "${v.populate_from}/*.tf") : f],
[for f in fileset(path.module, "${v.populate_from}/templates/*.tpl") : f],
[for f in fileset(path.module, "${v.populate_from}/terraform.tfvars") : f]
) : {
project = k
file = f
name = replace(f, "${v.populate_from}/", "")
}
] if v.populate_from != null
])
modules_files = {
for f in concat(
[for f in fileset(path.module, "../../../modules/*/*.svg") : f],
[for f in fileset(path.module, "../../../modules/*/*.md") : f],
[for f in fileset(path.module, "../../../modules/*/*.tf") : f],
[for f in fileset(path.module, "../../../modules/*/*.yaml") : f]
) : f => replace(f, "../../../modules/", "")
}
modules_ref = (
try(var.modules_config.source_ref, null) == null
? ""
: "?ref=${var.modules_config.source_ref}"
)
modules_project = try(var.modules_config.project_name, null)
modules_group = var.modules_config.bootstrap ? gitlab_group.default[var.modules_config.group].path : var.modules_config.group
module_prefix = try(var.modules_config.module_prefix, null)
projects = {
for k, v in var.projects :
k => v.create_options == null ? k : gitlab_project.default[k].id
}
repository_files = merge(
{
for k in local._repository_files :
"${k.project}/${k.name}" => k
if !endswith(k.name, ".tf") || (
!startswith(k.name, "0") && k.name != "globals.tf"
)
},
{
for k, v in var.projects :
"${k}/workflows/${v.workflow_file}" => {
project = k
file = "./workflows/${v.workflow_file}"
name = ".gitlab-ci.yml"
}
if v.workflow_file != null
}
)
}
resource "gitlab_group" "default" {
for_each = var.groups
name = each.value.name
path = each.value.path
description = each.value.description
}
resource "gitlab_project" "modules" {
count = try(var.modules_config.bootstrap, false) ? 1 : 0
name = var.modules_config.project_name
description = "FAST Shared modules"
namespace_id = gitlab_group.default[var.modules_config.group].id
}
resource "gitlab_repository_file" "modules" {
for_each = try(var.modules_config.bootstrap, false) ? local.modules_files : {}
project = gitlab_project.modules.0.id
branch = "main"
file_path = "${var.modules_config.module_prefix}${each.value}"
content = endswith(each.key, ".png") || endswith(each.key, ".gif") || endswith(each.key, ".svg") ? filebase64(each.key) : base64encode(file(each.key))
commit_message = "${var.commit_config.message} (${each.value})"
author_name = var.commit_config.author
author_email = var.commit_config.email
}
resource "gitlab_project" "default" {
for_each = {
for k, v in var.projects : k => v if v.create_options != null
}
name = each.key
description = (
each.value.create_options.description != null
? each.value.create_options.description
: "FAST stage ${each.key}."
)
visibility_level = each.value.create_options.visibility
merge_requests_enabled = try(each.value.create_options.features.merge_requests, null)
namespace_id = try(gitlab_group.default[each.value.group].id, each.value.group)
issues_enabled = try(each.value.create_options.features.issues, null)
wiki_enabled = try(each.value.create_options.features.wiki, null)
}
resource "tls_private_key" "default" {
algorithm = "ED25519"
}
resource "gitlab_deploy_key" "example" {
count = (
try(var.modules_config.key_config.create_key, null) == true ? 1 : 0
)
project = var.modules_config.bootstrap ? gitlab_project.modules.0.id : "${var.modules_config.namespace}/${var.modules_config.project_name}"
title = "Modules repository access"
key = (
try(var.modules_config.key_config.keypair_path, null) == null
? tls_private_key.default.public_key_openssh
: file(pathexpand("${var.modules_config.key_config.keypair_path}.pub"))
)
}
resource "gitlab_project_variable" "default" {
for_each = (
try(var.modules_config.key_config.create_secrets, null) == true
? local.projects
: {}
)
project = local.projects[each.key]
key = "CICD_MODULES_KEY"
value = (
try(var.modules_config.key_config.keypair_path, null) == null
? tls_private_key.default.private_key_openssh
: file(pathexpand(var.modules_config.key_config.keypair_path))
)
protected = false
}
resource "gitlab_repository_file" "default" {
for_each = local.modules_project == null ? {} : local.repository_files
project = local.projects[each.value.project]
branch = "main"
file_path = each.value.name
content = (
endswith(each.value.name, ".tf") && local.modules_project != null
? base64encode(replace(
file(each.value.file),
"/source(\\s*)=\\s*\"../../../modules/([^/\"]+)\"/",
"source$1= \"git::ssh://git@${var.gitlab_config.hostname}:${var.gitlab_config.ssh_port}/${local.modules_group}/${local.modules_project}.git//${local.module_prefix}$2${local.modules_ref}\"" # "
))
: endswith(each.value.name, ".png") || endswith(each.value.name, ".gif") || endswith(each.value.name, ".svg") ? filebase64(each.value.file) : base64encode(file(each.value.file))
)
commit_message = "${var.commit_config.message} (${each.value.name})"
author_name = var.commit_config.author
author_email = var.commit_config.email
}