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
|
- main
|
||||||
event:
|
event:
|
||||||
- push
|
- 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