From fc8d0462b972f4698070c361230dba1f0d96a574 Mon Sep 17 00:00:00 2001 From: Ben Kesby Date: Fri, 20 Jun 2025 10:48:05 +0100 Subject: [PATCH 1/8] add jenkins script and terraform code --- Jenkinsfile | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++ terraform | 1 + 2 files changed, 58 insertions(+) create mode 100644 Jenkinsfile create mode 160000 terraform diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..ab3b961 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,57 @@ +pipeline { + agent any + environment { + dockerCreds = credentials('dockerhub_login') // used to get the username for next var + registry = "${dockerCreds_USR}/nodejs-webserver" + registryCredentials = "dockerhub_login" + dockerImage = "" // empty var, will be written to later + } + stages { + stage('Build Image') { + steps { + dir('web') { + script { + dockerImage = docker.build(registry) + } + } + } + } + stage('Test App') { + environment { + SERVER_IMAGE = dockerImage.imageName() + } + steps { + sh 'docker compose up -d' + sh 'curl -s http://localhost/web1' + sh 'curl -s http://localhost/web2' + sh 'docker compose down' + } + } + stage('Push Image') { + steps { + script { + docker.withRegistry("", registryCredentials) { + dockerImage.push("${env.BUILD_NUMBER}") + dockerImage.push("latest") + } + } + } + } + stage('Clean Up') { + steps { + sh "docker image prune --all --force --filter 'until=48h'" // ensure that we don't accrue too many out-of-date images + } + } + stage('Deploy To Cluster') { + steps { + sh 'cp -u /mnt/k3s/config config.yaml' + sh 'cp -u nginx/nginx.conf terraform/nginx.conf' + dir('terraform') { + sh 'terraform init' + sh 'terraform apply --auto-approve --no-color -var config_path=${WORKSPACE}/config.yaml -var server_image=${registry}' + sh 'terraform output --no-color' + } + } + } + } +} diff --git a/terraform b/terraform new file mode 160000 index 0000000..73a8a67 --- /dev/null +++ b/terraform @@ -0,0 +1 @@ +Subproject commit 73a8a675cc2758214ec50f72eeb71fd4a8361b29 From 42d96d834577438da1884b00ff28943e75f62fa4 Mon Sep 17 00:00:00 2001 From: Ben Kesby Date: Fri, 20 Jun 2025 10:54:38 +0100 Subject: [PATCH 2/8] remove terraform --- terraform | 1 - 1 file changed, 1 deletion(-) delete mode 160000 terraform diff --git a/terraform b/terraform deleted file mode 160000 index 73a8a67..0000000 --- a/terraform +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 73a8a675cc2758214ec50f72eeb71fd4a8361b29 From c044d99d5a0cacc7e95842e2fd89b86235c1d740 Mon Sep 17 00:00:00 2001 From: Ben Kesby Date: Fri, 20 Jun 2025 10:55:57 +0100 Subject: [PATCH 3/8] add terraform --- terraform/main.tf | 14 +++++ terraform/nginx.tf | 87 +++++++++++++++++++++++++++++++ terraform/outputs.tf | 3 ++ terraform/providers.tf | 12 +++++ terraform/redis.tf | 42 +++++++++++++++ terraform/variables.tf | 2 + terraform/web_deploy/main.tf | 67 ++++++++++++++++++++++++ terraform/web_deploy/variables.tf | 3 ++ 8 files changed, 230 insertions(+) create mode 100644 terraform/main.tf create mode 100644 terraform/nginx.tf create mode 100644 terraform/outputs.tf create mode 100644 terraform/providers.tf create mode 100644 terraform/redis.tf create mode 100644 terraform/variables.tf create mode 100644 terraform/web_deploy/main.tf create mode 100644 terraform/web_deploy/variables.tf diff --git a/terraform/main.tf b/terraform/main.tf new file mode 100644 index 0000000..07c23f1 --- /dev/null +++ b/terraform/main.tf @@ -0,0 +1,14 @@ +module "web1" { + source = "./web_deploy" + + image = "${var.server_image}" + replicas = 3 + deployment_name = "web1" +} +module "web2" { + source = "./web_deploy" + + image = "${var.server_image}" + replicas = 3 + deployment_name = "web2" +} diff --git a/terraform/nginx.tf b/terraform/nginx.tf new file mode 100644 index 0000000..34ccf98 --- /dev/null +++ b/terraform/nginx.tf @@ -0,0 +1,87 @@ +resource "kubernetes_deployment" "nginx" { + metadata { + name = "nginx" + labels = { + app = "nginx" + } + } + + spec { + replicas = 3 + + selector { + match_labels = { + app = "nginx" + } + } + + template { + metadata { + labels = { + app = "nginx" + } + annotations = { + "config.linkerd.io/proxy-cpu-limit" = "10m" + "linkerd.io/inject" = "enabled" + } + } + + spec { + container { + image = "nginx:alpine" + name = "nginx" + + resources { + limits = { + cpu = "200m" + memory = "256Mi" + } + requests = { + cpu = "100m" + memory = "128Mi" + } + } + + volume_mount { + name = "${kubernetes_config_map.nginx.metadata.0.name}" + mount_path = "/etc/nginx/conf.d/" + } + } + volume { + name = "${kubernetes_config_map.nginx.metadata.0.name}" + config_map { + name = "${kubernetes_config_map.nginx.metadata.0.name}" + } + } + } + } + } +} + +resource "kubernetes_service" "nginx" { + metadata { + name = "nginx" + } + spec { + selector = { + app = "nginx" + } + + port { + port = 80 + target_port = 80 + } + + type = "NodePort" + } +} + +resource "kubernetes_config_map" "nginx" { + metadata { + name = "nginx-config" + } + + data = { + "default.conf" = "${file("nginx.conf")}" + } +} diff --git a/terraform/outputs.tf b/terraform/outputs.tf new file mode 100644 index 0000000..7f78b77 --- /dev/null +++ b/terraform/outputs.tf @@ -0,0 +1,3 @@ +output "node_port" { + value = "${kubernetes_service.nginx.spec.0.port.0.node_port}" +} diff --git a/terraform/providers.tf b/terraform/providers.tf new file mode 100644 index 0000000..bc822a2 --- /dev/null +++ b/terraform/providers.tf @@ -0,0 +1,12 @@ +terraform { + required_providers { + kubernetes = { + source = "hashicorp/kubernetes" + version = "2.37.1" + } + } +} + +provider "kubernetes" { + config_path = var.config_path +} diff --git a/terraform/redis.tf b/terraform/redis.tf new file mode 100644 index 0000000..76670c0 --- /dev/null +++ b/terraform/redis.tf @@ -0,0 +1,42 @@ +resource "kubernetes_pod" "redis" { + metadata { + name = "redis" + labels = { + app = "redis" + } + annotations = { + "config.linkerd.io/proxy-cpu-limit" = "10m" + "linkerd.io/inject" = "enabled" + } + } + + spec { + container { + image = "redislabs/redismod" + name = "redis" + + port { + container_port = 6379 + } + } + } +} + +resource "kubernetes_service" "redis" { + metadata { + name = "redis" + } + + spec { + port { + port = 6379 + target_port = 6379 + } + + selector = { + app = "redis" + } + + type = "ClusterIP" + } +} diff --git a/terraform/variables.tf b/terraform/variables.tf new file mode 100644 index 0000000..46653a2 --- /dev/null +++ b/terraform/variables.tf @@ -0,0 +1,2 @@ +variable "config_path" {} +variable "server_image" {} diff --git a/terraform/web_deploy/main.tf b/terraform/web_deploy/main.tf new file mode 100644 index 0000000..2782c96 --- /dev/null +++ b/terraform/web_deploy/main.tf @@ -0,0 +1,67 @@ +resource "kubernetes_deployment" "deploy" { + metadata { + name = "${var.deployment_name}" + labels = { + app = "nodejs-${var.deployment_name}" + } + } + + spec { + replicas = var.replicas + + selector { + match_labels = { + app = "nodejs-${var.deployment_name}" + } + } + + template { + metadata { + labels = { + app = "nodejs-${var.deployment_name}" + } + annotations = { + "config.linkerd.io/proxy-cpu-limit" = "10m" + "linkerd.io/inject" = "enabled" + } + } + + spec { + container { + image = "${var.image}" + image_pull_policy = "Always" + name = "${var.deployment_name}" + + resources { + limits = { + cpu = "200m" + memory = "256Mi" + } + requests = { + cpu = "100m" + memory = "128Mi" + } + } + } + } + } + } +} + +resource "kubernetes_service" "svc" { + metadata { + name = "${var.deployment_name}" + } + spec { + selector = { + app = "nodejs-${var.deployment_name}" + } + + port { + port = 5000 + target_port = 5000 + } + + type = "ClusterIP" + } +} diff --git a/terraform/web_deploy/variables.tf b/terraform/web_deploy/variables.tf new file mode 100644 index 0000000..fedd5c0 --- /dev/null +++ b/terraform/web_deploy/variables.tf @@ -0,0 +1,3 @@ +variable "deployment_name" {} +variable "replicas" {} +variable "image" {} From 4f51bf47740a914d2aa1b30e2f2ed8fd0ea12868 Mon Sep 17 00:00:00 2001 From: Ben Kesby Date: Fri, 20 Jun 2025 10:57:03 +0100 Subject: [PATCH 4/8] fix no-colour --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index ab3b961..e2dd504 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -48,7 +48,7 @@ pipeline { sh 'cp -u nginx/nginx.conf terraform/nginx.conf' dir('terraform') { sh 'terraform init' - sh 'terraform apply --auto-approve --no-color -var config_path=${WORKSPACE}/config.yaml -var server_image=${registry}' + sh 'terraform apply -auto-approve -no-color -var config_path=${WORKSPACE}/config.yaml -var server_image=${registry}' sh 'terraform output --no-color' } } From a9c8ba84e1fc802880ce123bf4e8f49cee595c7a Mon Sep 17 00:00:00 2001 From: Ben Kesby Date: Fri, 20 Jun 2025 11:01:29 +0100 Subject: [PATCH 5/8] more colours --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index e2dd504..8c8f2e3 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -49,7 +49,7 @@ pipeline { dir('terraform') { sh 'terraform init' sh 'terraform apply -auto-approve -no-color -var config_path=${WORKSPACE}/config.yaml -var server_image=${registry}' - sh 'terraform output --no-color' + sh 'terraform output -no-color' } } } From 68d40e929a63e675e0052d48e957535dc093d6ca Mon Sep 17 00:00:00 2001 From: Ben Kesby Date: Fri, 20 Jun 2025 11:17:39 +0100 Subject: [PATCH 6/8] nginx fix? --- nginx/nginx.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 2213606..c3ca43a 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -4,12 +4,12 @@ server { server_name localhost; location =/web1/ { - rewrite ^/prefix/(.*) /$1 break; + rewrite ^/prefix/(.*)$ /$1 break; proxy_pass http://web1:5000; } location =/web2/ { - rewrite ^/prefix/(.*) /$1 break; + rewrite ^/prefix/(.*)$ /$1 break; proxy_pass http://web2:5000; } } From aa317fbb8314acfc060aea551fff8dcc540aacb2 Mon Sep 17 00:00:00 2001 From: Ben Kesby Date: Fri, 20 Jun 2025 11:17:39 +0100 Subject: [PATCH 7/8] nginx fix? --- nginx/nginx.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 2213606..d7986bd 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -4,12 +4,12 @@ server { server_name localhost; location =/web1/ { - rewrite ^/prefix/(.*) /$1 break; + rewrite ^/web1/(.*)$ /$1 break; proxy_pass http://web1:5000; } location =/web2/ { - rewrite ^/prefix/(.*) /$1 break; + rewrite ^/web2/(.*)$ /$1 break; proxy_pass http://web2:5000; } } From f82020a94af84f6e42e1e926eb97c8cff6531d2d Mon Sep 17 00:00:00 2001 From: Ben Kesby Date: Fri, 20 Jun 2025 11:29:30 +0100 Subject: [PATCH 8/8] adam fix --- nginx/nginx.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nginx/nginx.conf b/nginx/nginx.conf index d7986bd..4132ea3 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -4,12 +4,12 @@ server { server_name localhost; location =/web1/ { - rewrite ^/web1/(.*)$ /$1 break; - proxy_pass http://web1:5000; + rewrite ^/web1/(.*)$ /$1 permanent; + proxy_pass http://web1:5000/; } location =/web2/ { - rewrite ^/web2/(.*)$ /$1 break; - proxy_pass http://web2:5000; + rewrite ^/web2/(.*)$ /$1 permanent; + proxy_pass http://web2:5000/; } }