{"id":23030363,"url":"https://github.com/f0rkb0mbz/java_devops_pipeline","last_synced_at":"2025-09-20T21:32:11.948Z","repository":{"id":101557963,"uuid":"215257376","full_name":"f0rkb0mbZ/java_devops_pipeline","owner":"f0rkb0mbZ","description":"A complete java servlet web application with mysql backend with complete automated deploy pipeline using Docker, Kubernetes and Jenkins!","archived":false,"fork":false,"pushed_at":"2019-12-02T18:13:31.000Z","size":132,"stargazers_count":4,"open_issues_count":0,"forks_count":2,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-04-02T18:51:39.702Z","etag":null,"topics":["devops","devops-pipeline","docker","java","java-pipeline","jenkins","jenkins-pipeline","kubernetes","kubernetes-cluster","kubernetes-deployment","maven","pipeline","servlet"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/f0rkb0mbZ.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2019-10-15T09:19:01.000Z","updated_at":"2022-12-21T17:59:50.000Z","dependencies_parsed_at":"2023-03-13T15:27:02.861Z","dependency_job_id":null,"html_url":"https://github.com/f0rkb0mbZ/java_devops_pipeline","commit_stats":null,"previous_names":["f0rkb0mbz/java_devops_pipeline"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/f0rkb0mbZ/java_devops_pipeline","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/f0rkb0mbZ%2Fjava_devops_pipeline","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/f0rkb0mbZ%2Fjava_devops_pipeline/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/f0rkb0mbZ%2Fjava_devops_pipeline/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/f0rkb0mbZ%2Fjava_devops_pipeline/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/f0rkb0mbZ","download_url":"https://codeload.github.com/f0rkb0mbZ/java_devops_pipeline/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/f0rkb0mbZ%2Fjava_devops_pipeline/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276163310,"owners_count":25596014,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-20T02:00:10.207Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["devops","devops-pipeline","docker","java","java-pipeline","jenkins","jenkins-pipeline","kubernetes","kubernetes-cluster","kubernetes-deployment","maven","pipeline","servlet"],"created_at":"2024-12-15T14:27:10.923Z","updated_at":"2025-09-20T21:32:11.456Z","avatar_url":"https://github.com/f0rkb0mbZ.png","language":"Java","readme":"# Microservice based Java Web App\n\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/d78066416d2e4be1bf1aa259c661bb29)](https://www.codacy.com/manual/forkbomb-666/webapp_maven?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=forkbomb-666/webapp_maven\u0026utm_campaign=Badge_Grade) [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)\n\n## Technology Stack used\n\n-   Java\n-   Servlet\n-   Maven\n-   Tomcat\n-   Jenkins\n-   Docker\n-   Kubernetes\n\n## Contents of the Repository\n\n-   Web Application made with `Java Servlet`\n-   `pom.xml` for `maven` to build the application and package it into a `.jar`\n-   `Dockerfile` which holds the steps to build a docker image of the web application\n-   `Jenkinsfile` to help `Jenkins` automate the building and deploying the web application into `docker hub`\n\n## Run the Web Application locally\n\n```bash\ngit clone https://github.com/ariG23498/webapp_maven.git\ncd webapp_maven\nmvn package\ncd target/bin/\n./webapp\n```\n\nThe web application is running on your localhost at post 9090\n\nGo to your favorite web-browser and in the address bar type `localhost:9090`\n\n## CI/CD with Jenkins and Kubernetes Deployment\n\n### VM instance setup\n\nIn the following steps we will talk specifically of the Kubernetes cluster that has been created, the cluster consists of 2 VM instances one working as the `master` other as the `worker`.\nThe VMs `must` be in same `resource group` and share the same `virtual network`.\nIn each of the VMs we need to run the following block of codes.\n\n#### **`setup_docker.sh`**\n\n```bash\nsudo apt-get remove docker docker-engine docker.io containerd runc\n\nsudo apt-get update\n\nsudo apt-get install -y \\\n    apt-transport-https \\\n    ca-certificates \\\n    curl \\\n    gnupg-agent \\\n    software-properties-common\n    \ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -\n\nsudo apt-key fingerprint 0EBFCD88\n\nsudo add-apt-repository \\\n   \"deb [arch=amd64] https://download.docker.com/linux/ubuntu \\\n   $(lsb_release -cs) \\\n   stable\"\n   \nsudo apt-get update\n\nsudo apt-get install -y docker-ce docker-ce-cli containerd.io\n\ncat \u003e /etc/docker/daemon.json \u003c\u003cEOF\n{\n  \"exec-opts\": [\"native.cgroupdriver=systemd\"],\n  \"log-driver\": \"json-file\",\n  \"log-opts\": {\n    \"max-size\": \"100m\"\n  },\n  \"storage-driver\": \"overlay2\"\n}\nEOF\n\nmkdir -p /etc/systemd/system/docker.service.d\n\nsystemctl daemon-reload\nsystemctl restart docker\n```\n\n#### **`setup_kebernetes.sh`**\n\n\n```bash\napt-get update \u0026\u0026 apt-get install -y apt-transport-https curl\ncurl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -\ncat \u003c\u003cEOF \u003e/etc/apt/sources.list.d/kubernetes.list\ndeb https://apt.kubernetes.io/ kubernetes-xenial main\nEOF\napt-get update\napt-get install -y kubelet kubeadm kubectl\napt-mark hold kubelet kubeadm kubectl\n```\n\nAuthorize Jenkins bye creating a new kubernetes service account and generating a base64 secret key:\n\n#### **`authorize_jenkins.sh`**\n\n```bash\nkubectl -n webapp create sa jenkins\nkubectl create clusterrolebinding jenkins --clusterrole cluster-admin --serviceaccount=webapp:jenkins\nkubectl get -n webapp sa/jenkins --template='{{range .secrets}}{{ .name }} {{end}}' | xargs -n 1 kubectl -n webapp get secret --template='{{ if .data.token }}{{ .data.token }}{{end}}' | head -n 1 | base64 -d -\n```\n\nSave the secret as secret text credential for using [kubernetes-cli-plugin](https://github.com/jenkinsci/kubernetes-cli-plugin) with Jenkins.\n\n### Database setup\n\nAfter setting up each VMs, we are creating a stateful persistent volume of 4 GiB for our MySQL database storage:\n\n#### **`mysql-pv.yaml`**\n\n```yaml\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: mysql-pv-volume\n  labels:\n    type: local\nspec:\n  storageClassName: manual\n  capacity:\n    storage: 4Gi\n  accessModes:\n    - ReadWriteOnce\n  hostPath:\n    path: \"/mnt/data\"\n---\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: mysql-pv-claim\nspec:\n  storageClassName: manual\n  accessModes:\n    - ReadWriteOnce\n  resources:\n    requests:\n      storage: 4Gi\n```\n\nNow, we need to deploy the mysql:5.7 image as a deployment in the kubernetes cluster.\n\n#### **`mysql-deployment.yaml`**\n\n```yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: mysql\nspec:\n  type: ClusterIP\n  ports:\n  - name: mysql\n    port: 3306\n    protocol: TCP\n    targetPort: 3306\n  selector:\n    app: mysql\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: mysql\nspec:\n  selector:\n    matchLabels:\n      app: mysql\n  strategy:\n    type: Recreate\n  template:\n    metadata:\n      labels:\n        app: mysql\n    spec:\n      containers:\n      - image: mysql:5.7\n        name: mysql\n        env:\n          # Use secret in real usage\n        - name: MYSQL_ROOT_PASSWORD\n          value: Dare2@hack\n        ports:\n        - containerPort: 3306\n          name: mysql\n        volumeMounts:\n        - name: mysql-persistent-storage\n          mountPath: /var/lib/mysql\n      volumes:\n      - name: mysql-persistent-storage\n        persistentVolumeClaim:\n          claimName: mysql-pv-claim\n```\n\n### Automation setup\n\nSetup `Jenkins` as directed by [Jenkins](https://jenkins.io/). \nFor the `CI/CD` pipeline we had to authenticate Jenkins with `GitHub`, `Docker Hub` and `Kubernetes`.\nWe have used the following deployment file to expose our webapp:\n\n#### **`webapp-service-deploy.json`**\n\n```json\n{\n    \"apiVersion\": \"v1\",\n    \"kind\": \"Service\",\n    \"metadata\": {\n        \"name\": \"webapp-v$BUILD_NUMBER\",\n        \"labels\": {\n            \"run\": \"webapp-v$BUILD_NUMBER\"\n        },\n        \"namespace\": \"webapp\"\n    },\n    \"spec\": {\n        \"externalIPs\": [\n            \"104.211.230.185\"\n        ],\n        \"externalTrafficPolicy\": \"Cluster\",\n        \"ports\": [\n            {\n                \"nodePort\": 32607,\n                \"port\": 9090,\n                \"protocol\": \"TCP\",\n                \"targetPort\": 9090\n            }\n        ],\n        \"selector\": {\n            \"run\": \"webapp-v$BUILD_NUMBER\"\n        },\n        \"sessionAffinity\": \"None\",\n        \"type\": \"LoadBalancer\"\n    },\n    \"status\": {\n        \"loadBalancer\": {}\n    }\n}\n```\n\nThe rest of the CI/CD pipeline is taken care of by Jenkins. :heart:\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ff0rkb0mbz%2Fjava_devops_pipeline","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ff0rkb0mbz%2Fjava_devops_pipeline","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ff0rkb0mbz%2Fjava_devops_pipeline/lists"}