ci: 👷 add terraform deploy module and drone deploy pipelines
Some checks failed
continuous-integration/drone/push Build is failing
Some checks failed
continuous-integration/drone/push Build is failing
This commit is contained in:
parent
5d0c068926
commit
612456241a
64
.drone.yml
64
.drone.yml
@ -19,3 +19,67 @@ trigger:
|
||||
- main
|
||||
event:
|
||||
- push
|
||||
---
|
||||
kind: pipeline
|
||||
type: kubernetes
|
||||
name: run terraform plan
|
||||
steps:
|
||||
- commands:
|
||||
- cd deploy
|
||||
- terraform init
|
||||
- terraform plan
|
||||
environment:
|
||||
AWS_ACCESS_KEY_ID:
|
||||
from_secret: digitalocean_spaces_access_key_id
|
||||
AWS_SECRET_ACCESS_KEY:
|
||||
from_secret: digitalocean_spaces_secret_key
|
||||
TF_VAR_cluster_issuer_name: letsencrypt
|
||||
TF_VAR_dikurium_k8s_cluster_name_all: k8s-dik-all
|
||||
TF_VAR_do_token:
|
||||
from_secret: digitalocean_token
|
||||
TF_VAR_image_repository: freund_und_partner/customer-files-organizer-web
|
||||
TF_VAR_image_tag: latest
|
||||
TF_VAR_registry: gitea.dikurium.ch
|
||||
TF_VAR_registry_password:
|
||||
from_secret: git_pass
|
||||
TF_VAR_registry_username:
|
||||
from_secret: git_user
|
||||
image: hashicorp/terraform:1.6.5
|
||||
name: terraform plan
|
||||
trigger:
|
||||
branch:
|
||||
- main
|
||||
event:
|
||||
- push
|
||||
---
|
||||
kind: pipeline
|
||||
type: kubernetes
|
||||
name: run terraform apply
|
||||
steps:
|
||||
- commands:
|
||||
- cd deploy
|
||||
- terraform init
|
||||
- terraform apply -auto-approve
|
||||
environment:
|
||||
AWS_ACCESS_KEY_ID:
|
||||
from_secret: digitalocean_spaces_access_key_id
|
||||
AWS_SECRET_ACCESS_KEY:
|
||||
from_secret: digitalocean_spaces_secret_key
|
||||
TF_VAR_cluster_issuer_name: letsencrypt
|
||||
TF_VAR_dikurium_k8s_cluster_name_all: k8s-dik-all
|
||||
TF_VAR_do_token:
|
||||
from_secret: digitalocean_token
|
||||
TF_VAR_image_repository: freund_und_partner/customer-files-organizer-web
|
||||
TF_VAR_image_tag: latest
|
||||
TF_VAR_registry: gitea.dikurium.ch
|
||||
TF_VAR_registry_password:
|
||||
from_secret: git_pass
|
||||
TF_VAR_registry_username:
|
||||
from_secret: git_user
|
||||
image: hashicorp/terraform:1.6.5
|
||||
name: terraform apply
|
||||
trigger:
|
||||
event:
|
||||
- promote
|
||||
target:
|
||||
- production
|
||||
|
204
deploy/main.tf
Normal file
204
deploy/main.tf
Normal file
@ -0,0 +1,204 @@
|
||||
terraform {
|
||||
backend "s3" {
|
||||
bucket = "dik-terraform-state"
|
||||
key = "apps/customer-files-organizer/terraform.tfstate"
|
||||
region = "fra1"
|
||||
endpoints = {
|
||||
s3 = "https://fra1.digitaloceanspaces.com"
|
||||
}
|
||||
|
||||
skip_credentials_validation = true
|
||||
skip_metadata_api_check = true
|
||||
skip_region_validation = true
|
||||
skip_requesting_account_id = true
|
||||
skip_s3_checksum = true
|
||||
}
|
||||
required_providers {
|
||||
random = {
|
||||
source = "hashicorp/random"
|
||||
version = "3.3.2"
|
||||
}
|
||||
digitalocean = {
|
||||
source = "digitalocean/digitalocean"
|
||||
version = "~> 2.0"
|
||||
}
|
||||
kubernetes = {
|
||||
source = "hashicorp/kubernetes"
|
||||
version = ">= 2.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
locals {
|
||||
domain = "dikurium.ch"
|
||||
subdomain = "customer-files-organizer"
|
||||
hostname = "${local.subdomain}.${local.domain}"
|
||||
url = "https://${local.hostname}"
|
||||
namespace = "customer-files-organizer"
|
||||
match_labels = {
|
||||
"app.kubernetes.io/component" = "frontend"
|
||||
"app.kubernetes.io/name" = "customer-files-organizer"
|
||||
"app.kubernetes.io/part-of" = "consulting"
|
||||
}
|
||||
labels = merge(local.match_labels, {
|
||||
"app.kubernetes.io/version" = var.image_tag
|
||||
"app.kubernetes.io/managed-by" = "terraform"
|
||||
})
|
||||
}
|
||||
|
||||
provider "random" {
|
||||
}
|
||||
|
||||
provider "digitalocean" {
|
||||
token = var.do_token
|
||||
}
|
||||
|
||||
data "digitalocean_kubernetes_cluster" "dikurium_kube_cluster" {
|
||||
name = var.dikurium_k8s_cluster_name_all
|
||||
}
|
||||
|
||||
provider "kubernetes" {
|
||||
host = data.digitalocean_kubernetes_cluster.dikurium_kube_cluster.endpoint
|
||||
token = data.digitalocean_kubernetes_cluster.dikurium_kube_cluster.kube_config[0].token
|
||||
cluster_ca_certificate = base64decode(
|
||||
data.digitalocean_kubernetes_cluster.dikurium_kube_cluster.kube_config[0].cluster_ca_certificate
|
||||
)
|
||||
}
|
||||
|
||||
resource "kubernetes_namespace" "customer_files_organizer" {
|
||||
metadata {
|
||||
name = local.namespace
|
||||
}
|
||||
}
|
||||
|
||||
resource "kubernetes_deployment" "customer_files_organizer" {
|
||||
metadata {
|
||||
name = "customer_files_organizer"
|
||||
namespace = kubernetes_namespace.customer_files_organizer.metadata.0.name
|
||||
}
|
||||
spec {
|
||||
replicas = 1
|
||||
selector {
|
||||
match_labels = local.match_labels
|
||||
}
|
||||
template {
|
||||
metadata {
|
||||
labels = local.labels
|
||||
annotations = {
|
||||
"dikurium.ch/last-updated" = timestamp()
|
||||
}
|
||||
}
|
||||
spec {
|
||||
image_pull_secrets {
|
||||
name = kubernetes_secret.registry_auth.metadata.0.name
|
||||
}
|
||||
container {
|
||||
image = "${var.registry}/${var.image_repository}:${var.image_tag}"
|
||||
name = "customer_files_organizer"
|
||||
image_pull_policy = "Always"
|
||||
port {
|
||||
container_port = 3000
|
||||
name = "http"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
resource "kubernetes_service" "customer_files_organizer" {
|
||||
metadata {
|
||||
name = "customer_files_organizer"
|
||||
namespace = kubernetes_namespace.customer_files_organizer.metadata.0.name
|
||||
}
|
||||
spec {
|
||||
selector = local.match_labels
|
||||
type = "ClusterIP"
|
||||
port {
|
||||
port = 80
|
||||
target_port = "http"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
resource "kubernetes_ingress_v1" "customer_files_organizer" {
|
||||
metadata {
|
||||
name = "customer_files_organizer"
|
||||
namespace = kubernetes_namespace.customer_files_organizer.metadata.0.name
|
||||
annotations = {
|
||||
"cert-manager.io/cluster-issuer" = var.cluster_issuer_name
|
||||
}
|
||||
}
|
||||
spec {
|
||||
ingress_class_name = "nginx"
|
||||
|
||||
rule {
|
||||
host = local.hostname
|
||||
http {
|
||||
path {
|
||||
backend {
|
||||
service {
|
||||
name = kubernetes_service.customer_files_organizer.metadata.0.name
|
||||
port {
|
||||
name = "http"
|
||||
}
|
||||
}
|
||||
}
|
||||
path = "/"
|
||||
path_type = "Prefix"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tls {
|
||||
secret_name = "customer-files-organizer-tls"
|
||||
hosts = [local.hostname]
|
||||
}
|
||||
}
|
||||
depends_on = [
|
||||
time_sleep.wait_for_dns_record
|
||||
]
|
||||
}
|
||||
|
||||
data "digitalocean_domain" "dikurium" {
|
||||
name = local.domain
|
||||
}
|
||||
|
||||
data "digitalocean_loadbalancer" "nginx-ingress-controller" {
|
||||
name = "nginx-ingress-controller.service.dikurium.ch"
|
||||
}
|
||||
|
||||
resource "digitalocean_record" "customer_files_organizer" {
|
||||
domain = data.digitalocean_domain.dikurium.id
|
||||
type = "A"
|
||||
name = local.subdomain
|
||||
value = data.digitalocean_loadbalancer.nginx-ingress-controller.ip
|
||||
}
|
||||
|
||||
resource "time_sleep" "wait_for_dns_record" {
|
||||
depends_on = [
|
||||
digitalocean_record.customer_files_organizer
|
||||
]
|
||||
create_duration = "30s"
|
||||
}
|
||||
|
||||
resource "kubernetes_secret" "registry_auth" {
|
||||
metadata {
|
||||
name = "registry-auth"
|
||||
namespace = kubernetes_namespace.customer_files_organizer.metadata.0.name
|
||||
}
|
||||
|
||||
data = {
|
||||
".dockerconfigjson" = jsonencode({
|
||||
"auths" = {
|
||||
"${var.registry}" = {
|
||||
"auth" = base64encode("${var.registry_username}:${var.registry_password}")
|
||||
}
|
||||
},
|
||||
"credsStore" = "",
|
||||
"credHelpers" = {}
|
||||
})
|
||||
}
|
||||
|
||||
type = "kubernetes.io/dockerconfigjson"
|
||||
}
|
43
deploy/variables.tf
Normal file
43
deploy/variables.tf
Normal file
@ -0,0 +1,43 @@
|
||||
variable "do_token" {
|
||||
description = "DigitalOcean API Access Token"
|
||||
type = string
|
||||
sensitive = true
|
||||
}
|
||||
|
||||
variable "dikurium_k8s_cluster_name_all" {
|
||||
description = "The name of the Dikurium main Kubernetes cluster"
|
||||
default = "k8s-dik-all"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "cluster_issuer_name" {
|
||||
description = "Name of the ClusterIssuer Kubernetes resource."
|
||||
type = string
|
||||
sensitive = true
|
||||
}
|
||||
|
||||
variable "registry" {
|
||||
description = "Registry to fetch advisement tool image from"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "image_repository" {
|
||||
description = "Repository for advisement tool image"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "image_tag" {
|
||||
description = "Docker image tag for advisement tool"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "registry_username" {
|
||||
description = "Username to access registry"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "registry_password" {
|
||||
description = "Password to access registry"
|
||||
type = string
|
||||
sensitive = true
|
||||
}
|
Loading…
Reference in New Issue
Block a user