diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..649671a --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,34 @@ +name: Crewmeister CI Pipeline + +on: + push: + branches: + - sowmya-crewmeister-challenge + + pull_request: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + + steps: + + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Setup Java 17 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 17 + + - name: Build Application + run: ./mvnw clean package -DskipTests + + - name: Build Docker Image + run: docker build -t crewmeister-app . + + - name: Verify Docker Image + run: docker images \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..516b42f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM eclipse-temurin:17-jdk-alpine + +WORKDIR /app + +COPY target/*.jar app.jar + +EXPOSE 8080 + +ENTRYPOINT ["java","-jar","app.jar"] \ No newline at end of file diff --git a/K8s/deployment.yaml b/K8s/deployment.yaml new file mode 100644 index 0000000..e51ecbe --- /dev/null +++ b/K8s/deployment.yaml @@ -0,0 +1,48 @@ +apiVersion: apps/v1 +kind: Deployment + +metadata: + name: crewmeister-app + +spec: + replicas: 1 + + selector: + matchLabels: + app: crewmeister-app + + template: + metadata: + labels: + app: crewmeister-app + + spec: + containers: + - name: crewmeister-app + image: devops-coding-challenge-app:latest + + ports: + - containerPort: 8080 + + env: + - name: SPRING_DATASOURCE_URL + value: jdbc:mysql://mysql:3306/challenge?createDatabaseIfNotExist=true + + - name: SPRING_DATASOURCE_USERNAME + value: root + + - name: SPRING_DATASOURCE_PASSWORD + value: dev + livenessProbe: + httpGet: + path: /actuator/health + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 10 + + readinessProbe: + httpGet: + path: /actuator/health + port: 8080 + initialDelaySeconds: 10 + periodSeconds: 5 \ No newline at end of file diff --git a/K8s/mysql-deployment.yaml b/K8s/mysql-deployment.yaml new file mode 100644 index 0000000..a4e3e1f --- /dev/null +++ b/K8s/mysql-deployment.yaml @@ -0,0 +1,32 @@ +apiVersion: apps/v1 +kind: Deployment + +metadata: + name: mysql + +spec: + replicas: 1 + + selector: + matchLabels: + app: mysql + + template: + metadata: + labels: + app: mysql + + spec: + containers: + - name: mysql + image: mysql:8 + + ports: + - containerPort: 3306 + + env: + - name: MYSQL_ROOT_PASSWORD + value: dev + + - name: MYSQL_DATABASE + value: challenge \ No newline at end of file diff --git a/K8s/mysql-service.yaml b/K8s/mysql-service.yaml new file mode 100644 index 0000000..aabaecc --- /dev/null +++ b/K8s/mysql-service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service + +metadata: + name: mysql + +spec: + selector: + app: mysql + + ports: + - protocol: TCP + port: 3306 + targetPort: 3306 \ No newline at end of file diff --git a/K8s/service.yaml b/K8s/service.yaml new file mode 100644 index 0000000..a51fa21 --- /dev/null +++ b/K8s/service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service + +metadata: + name: crewmeister-service + +spec: + selector: + app: crewmeister-app + + ports: + - protocol: TCP + port: 80 + targetPort: 8080 + + type: LoadBalancer \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..c1c131a --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,24 @@ +version: '3.8' + +services: + + mysql: + image: mysql:8 + container_name: mysql + environment: + MYSQL_ROOT_PASSWORD: dev + MYSQL_DATABASE: challenge + ports: + - "3306:3306" + + app: + build: . + container_name: crewmeister-app + depends_on: + - mysql + ports: + - "8080:8080" + environment: + SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/challenge?createDatabaseIfNotExist=true + SPRING_DATASOURCE_USERNAME: root + SPRING_DATASOURCE_PASSWORD: dev \ No newline at end of file diff --git a/helm/Chart.yaml b/helm/Chart.yaml new file mode 100644 index 0000000..2beb463 --- /dev/null +++ b/helm/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: crewmeister-app +description: Crewmeister DevOps Challenge +type: application +version: 1.0.0 +appVersion: "1.0" \ No newline at end of file diff --git a/helm/templates/deployment.yaml b/helm/templates/deployment.yaml new file mode 100644 index 0000000..74da573 --- /dev/null +++ b/helm/templates/deployment.yaml @@ -0,0 +1,48 @@ +apiVersion: apps/v1 +kind: Deployment + +metadata: + name: crewmeister-app + +spec: + replicas: {{ .Values.replicaCount }} + + selector: + matchLabels: + app: crewmeister-app + + template: + metadata: + labels: + app: crewmeister-app + + spec: + containers: + - name: crewmeister-app + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + + ports: + - containerPort: 8080 + + env: + - name: SPRING_DATASOURCE_URL + value: jdbc:mysql://mysql:3306/challenge?createDatabaseIfNotExist=true + + - name: SPRING_DATASOURCE_USERNAME + value: {{ .Values.mysql.username }} + + - name: SPRING_DATASOURCE_PASSWORD + value: {{ .Values.mysql.password }} + livenessProbe: + httpGet: + path: /actuator/health + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 10 + + readinessProbe: + httpGet: + path: /actuator/health + port: 8080 + initialDelaySeconds: 10 + periodSeconds: 5 \ No newline at end of file diff --git a/helm/templates/mysql-deployment.yaml b/helm/templates/mysql-deployment.yaml new file mode 100644 index 0000000..a4e3e1f --- /dev/null +++ b/helm/templates/mysql-deployment.yaml @@ -0,0 +1,32 @@ +apiVersion: apps/v1 +kind: Deployment + +metadata: + name: mysql + +spec: + replicas: 1 + + selector: + matchLabels: + app: mysql + + template: + metadata: + labels: + app: mysql + + spec: + containers: + - name: mysql + image: mysql:8 + + ports: + - containerPort: 3306 + + env: + - name: MYSQL_ROOT_PASSWORD + value: dev + + - name: MYSQL_DATABASE + value: challenge \ No newline at end of file diff --git a/helm/templates/mysql-service.yaml b/helm/templates/mysql-service.yaml new file mode 100644 index 0000000..aabaecc --- /dev/null +++ b/helm/templates/mysql-service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service + +metadata: + name: mysql + +spec: + selector: + app: mysql + + ports: + - protocol: TCP + port: 3306 + targetPort: 3306 \ No newline at end of file diff --git a/helm/templates/service.yaml b/helm/templates/service.yaml new file mode 100644 index 0000000..3e87ce2 --- /dev/null +++ b/helm/templates/service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service + +metadata: + name: crewmeister-service + +spec: + selector: + app: crewmeister-app + + ports: + - protocol: TCP + port: {{ .Values.service.port }} + targetPort: 8080 + + type: {{ .Values.service.type }} \ No newline at end of file diff --git a/helm/values.yaml b/helm/values.yaml new file mode 100644 index 0000000..58ddb87 --- /dev/null +++ b/helm/values.yaml @@ -0,0 +1,15 @@ +replicaCount: 1 + +image: + repository: devops-coding-challenge-app + tag: latest + +service: + type: LoadBalancer + port: 80 + +mysql: + host: mysql + database: challenge + username: root + password: dev \ No newline at end of file diff --git a/terraform/main.tf b/terraform/main.tf new file mode 100644 index 0000000..9350c09 --- /dev/null +++ b/terraform/main.tf @@ -0,0 +1,65 @@ +resource "kubernetes_namespace" "crewmeister" { + metadata { + name = var.namespace + } +} + +resource "kubernetes_deployment" "app" { + + metadata { + name = "crewmeister-app" + namespace = kubernetes_namespace.crewmeister.metadata[0].name + + labels = { + app = "crewmeister-app" + } + } + + spec { + + replicas = 1 + + selector { + match_labels = { + app = "crewmeister-app" + } + } + + template { + + metadata { + labels = { + app = "crewmeister-app" + } + } + + spec { + + container { + + image = "devops-coding-challenge-app:latest" + name = "crewmeister-app" + + port { + container_port = 8080 + } + + env { + name = "SPRING_DATASOURCE_URL" + value = "jdbc:mysql://mysql:3306/challenge?createDatabaseIfNotExist=true" + } + + env { + name = "SPRING_DATASOURCE_USERNAME" + value = "root" + } + + env { + name = "SPRING_DATASOURCE_PASSWORD" + value = "dev" + } + } + } + } + } +} \ No newline at end of file diff --git a/terraform/outputs.tf b/terraform/outputs.tf new file mode 100644 index 0000000..e38f48f --- /dev/null +++ b/terraform/outputs.tf @@ -0,0 +1,3 @@ +output "namespace" { + value = kubernetes_namespace.crewmeister.metadata[0].name +} \ No newline at end of file diff --git a/terraform/provider.tf b/terraform/provider.tf new file mode 100644 index 0000000..72c69fb --- /dev/null +++ b/terraform/provider.tf @@ -0,0 +1,12 @@ +terraform { + required_providers { + kubernetes = { + source = "hashicorp/kubernetes" + version = "~> 2.0" + } + } +} + +provider "kubernetes" { + config_path = "~/.kube/config" +} \ No newline at end of file diff --git a/terraform/variables.tf b/terraform/variables.tf new file mode 100644 index 0000000..1f33dbd --- /dev/null +++ b/terraform/variables.tf @@ -0,0 +1,3 @@ +variable "namespace" { + default = "crewmeister" +} \ No newline at end of file