diff --git a/jenkins-local-terraform/.gitignore b/jenkins-local-terraform/.gitignore new file mode 100644 index 0000000..d38e10a --- /dev/null +++ b/jenkins-local-terraform/.gitignore @@ -0,0 +1,2 @@ +.terraform/ +terraform.tfstate* \ No newline at end of file diff --git a/jenkins-local-terraform/Dockerfile b/jenkins-local-terraform/Dockerfile new file mode 100644 index 0000000..df2ebe0 --- /dev/null +++ b/jenkins-local-terraform/Dockerfile @@ -0,0 +1,3 @@ +FROM jenkins/jenkins:lts-jdk11 +COPY --chown=jenkins:jenkins plugins.txt /usr/share/jenkins/ref/plugins.txt +RUN jenkins-plugin-cli -f /usr/share/jenkins/ref/plugins.txt \ No newline at end of file diff --git a/jenkins-local-terraform/Makefile b/jenkins-local-terraform/Makefile new file mode 100644 index 0000000..2f5451a --- /dev/null +++ b/jenkins-local-terraform/Makefile @@ -0,0 +1,19 @@ +.PHONY: build + +build: + docker build . --tag jenkins-local:latest + +.PHONY: init + +init: + cd tf/ && terraform init + +.PHONY: deploy + +deploy: + cd tf/ && terraform plan && terraform apply --auto-approve + +.PHONY: destroy + +destroy: + cd tf/ && terraform destroy --auto-approve diff --git a/jenkins-local-terraform/README.md b/jenkins-local-terraform/README.md new file mode 100644 index 0000000..42dfdfd --- /dev/null +++ b/jenkins-local-terraform/README.md @@ -0,0 +1,14 @@ +# Local Jenkins with Terraform and Docker Desktop + +# Prerequisites + +- Install Terraform +- Install Docker Desktop +- Enable Kubernetes in Docker Desktop + +# Instructions + +1. `make build` builds the Jenkins docker image +1. `make init` initializes the tf directory +1. `make deploy` plans and applies the terraform configuration +1. `make destroy` destroys the terraform configuration diff --git a/jenkins-local-terraform/plugins.txt b/jenkins-local-terraform/plugins.txt new file mode 100644 index 0000000..60745c7 --- /dev/null +++ b/jenkins-local-terraform/plugins.txt @@ -0,0 +1,4 @@ +configuration-as-code:1625.v27444588cc3d +git:5.0.0 +kubernetes:3923.v294a_d4250b_91 +workflow-aggregator:596.v8c21c963d92d diff --git a/jenkins-local-terraform/tf/.terraform.lock.hcl b/jenkins-local-terraform/tf/.terraform.lock.hcl new file mode 100644 index 0000000..5a51082 --- /dev/null +++ b/jenkins-local-terraform/tf/.terraform.lock.hcl @@ -0,0 +1,42 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/helm" { + version = "2.9.0" + constraints = "~> 2.9.0" + hashes = [ + "h1:fEDID5J/9ret/sLpOSNAu98F/ZBEZhOmL0Leut7m5JU=", + "zh:1471cb45908b426104687c962007b2980cfde294fa3530fabc4798ce9fb6c20c", + "zh:1572e9cec20591ec08ece797b3630802be816a5adde36ca91a93359f2430b130", + "zh:1b10ae03cf5ab1ae21ffaac2251de99797294ae4242b156b3b0beebbdbcb7e0f", + "zh:3bd043b68de967d8d0b549d3f71485193d81167d5656f5507d743dedfe60e352", + "zh:538911921c729185900176cc22eb8edcb822bc8d22b9ebb48103a1d9bb53cc38", + "zh:69a6a2d40c0463662c3fb1621e37a3ee65024ea4479adf4d5f7f19fb0dea48c2", + "zh:94b58daa0c351a49d01f6d8f1caae46c95c2d6c3f29753e2b9ea3e3c0e7c9ab4", + "zh:9d0543331a4a32241e1ab5457f30b41df745acb235a0391205c725a5311e4809", + "zh:a6789306524ca121512a95e873e3949b4175114a6c5db32bed2df2551a79368f", + "zh:d146b94cd9502cca7f2044797a328d71c7ec2a98e2d138270d8a28c872f04289", + "zh:d14ccd14511f0446eacf43a9243f22de7c1427ceb059cf67d7bf9803be2cb15d", + "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", + ] +} + +provider "registry.terraform.io/hashicorp/kubernetes" { + version = "2.19.0" + constraints = "~> 2.19.0" + hashes = [ + "h1:ID/u9YOv00w+Z8iG+592oyuV7HcqRmPiZpEC9hnyTMY=", + "zh:028d346460de2d1d19b4c863dfc36be51c7bcd97d372b54a3a946bcb19f3f613", + "zh:391d0b38c455437d0a2ab1beb6ce6e1230aa4160bbae11c58b2810b258b44280", + "zh:40ea742f91b67f66e71d7091cfd40cc604528c4947651924bd6d8bd8d9793708", + "zh:48a99d341c8ba3cadaafa7cb99c0f11999f5e23f5cfb0f8469b4e352d9116e74", + "zh:4a5ade940eff267cbf7dcd52c1a7ac3999e7cc24996a409bd8b37bdb48a97f02", + "zh:5063742016a8249a4be057b9cc0ef24a684ec76d0ae5463d4b07e9b2d21e047e", + "zh:5d36b3a5662f840a6788f5e2a19d02139e87318feb3c5d82c7d076be1366fec4", + "zh:75edd9960cb30e54ef7de1b7df2761a274f17d4d41f54e72f86b43f41af3eb6d", + "zh:b85cadef3e6f25f1a10a617472bf5e8449decd61626733a1bc723de5edc08f64", + "zh:dc565b17b4ea6dde6bd1b92bc37e5e850fcbf9400540eec00ad3d9552a76ac2e", + "zh:deb665cc2123f2701aa3d653987b2ca35fb035a08a76a2382efb215c209f19a5", + "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", + ] +} diff --git a/jenkins-local-terraform/tf/main.tf b/jenkins-local-terraform/tf/main.tf new file mode 100644 index 0000000..ef8a802 --- /dev/null +++ b/jenkins-local-terraform/tf/main.tf @@ -0,0 +1,42 @@ +provider "kubernetes" { + config_path = "~/.kube/config" + config_context = "docker-desktop" +} + +provider "helm" { + kubernetes { + config_path = "~/.kube/config" + } +} + +resource "helm_release" "jenkins" { + name = "jenkins" + repository = "https://charts.jenkins.io" + chart = "jenkins" + namespace = kubernetes_namespace.jenkins_namespace.metadata[0].name + + values = [ + "${file("values.yaml")}", + ] + + set { + name = "controller.serviceType" + value = "LoadBalancer" + } + + set { + name = "controller.adminPassword" + value = "jenkins123" # Replace with a secure password + } + + # set { + # name = "controller.installPlugins" + # value = "simple-theme-plugin:0.6.0,workflow-job:2.41,workflow-aggregator:2.6,credentials-binding:1.27,git:4.10.0" + # } +} + +resource "kubernetes_namespace" "jenkins_namespace" { + metadata { + name = "jenkins" + } +} diff --git a/jenkins-local-terraform/tf/values.yaml b/jenkins-local-terraform/tf/values.yaml new file mode 100644 index 0000000..665d410 --- /dev/null +++ b/jenkins-local-terraform/tf/values.yaml @@ -0,0 +1,30 @@ +controller: + image: jenkins-local + tag: latest + imagePullPolicy: Never + installPlugins: false + +jenkins: + systemMessage: "Jenkins configured automatically by Jenkins Configuration as Code plugin\n\n" + + nodes: + - permanent: + name: "static-agent" + remoteFS: "/home/jenkins" + launcher: + inbound: + workDirSettings: + disabled: true + failIfWorkDirIsMissing: false + internalDir: "remoting" + workDirPath: "/tmp" + + slaveAgentPort: 50000 + agentProtocols: + - "jnlp2" + +tool: + git: + installations: + - name: git + home: /usr/local/bin/git diff --git a/jenkins-local-terraform/tf/versions.tf b/jenkins-local-terraform/tf/versions.tf new file mode 100644 index 0000000..d2386e1 --- /dev/null +++ b/jenkins-local-terraform/tf/versions.tf @@ -0,0 +1,12 @@ +terraform { + required_providers { + kubernetes = { + source = "hashicorp/kubernetes" + version = "~> 2.19.0" + } + helm = { + source = "hashicorp/helm" + version = "~> 2.9.0" + } + } +}