├── src ├── main │ ├── fabric8 │ │ ├── svc.yaml │ │ ├── role-config.yaml │ │ └── deployment.yaml │ ├── resources │ │ ├── application.yml │ │ └── bootstrap.yml │ └── java │ │ └── com │ │ └── minikube │ │ └── sample │ │ ├── MinikubeSampleApplication.java │ │ ├── properties │ │ └── PropertiesConfig.java │ │ └── rest │ │ └── controller │ │ └── HomeResource.java └── test │ └── java │ └── com │ └── minikube │ └── sample │ └── MinikubeSampleApplicationTests.java ├── eks_module ├── modules │ ├── aws_eks │ │ ├── output.tf │ │ ├── variables.tf │ │ └── main.tf │ └── aws_eks_nodegroup │ │ ├── variables.tf │ │ └── main.tf ├── provider.tf ├── version.tf ├── variables.tf ├── config │ └── terraform.tfvars └── main.tf ├── Dockerfile ├── deployment.yaml ├── README.md ├── pom.xml ├── Jenkinsfile ├── mvnw.cmd ├── Jenkinsfile-ECR └── mvnw /src/main/fabric8/svc.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: extensions/v1beta1 2 | kind: Service 3 | spec: 4 | type: NodePort -------------------------------------------------------------------------------- /eks_module/modules/aws_eks/output.tf: -------------------------------------------------------------------------------- 1 | output "eks_cluster_name" { 2 | value = aws_eks_cluster.eks.name 3 | } -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM openjdk:8-jdk-alpine 2 | WORKDIR /app 3 | COPY ./target/*.jar /app.jar 4 | CMD ["java", "-jar", "app.jar"] -------------------------------------------------------------------------------- /eks_module/provider.tf: -------------------------------------------------------------------------------- 1 | provider "aws" { 2 | region = var.region 3 | access_key = var.access_key 4 | secret_key = var.secret_key 5 | } 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /eks_module/version.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | aws = { 4 | source = "hashicorp/aws" 5 | version = "~> 3.0" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /eks_module/modules/aws_eks/variables.tf: -------------------------------------------------------------------------------- 1 | variable "eks_cluster_name" { 2 | default = "demo-eks" 3 | } 4 | 5 | variable "subnet_ids" { 6 | 7 | } 8 | variable "tags" { 9 | 10 | } 11 | 12 | # variable "testsubnet_ids" { 13 | 14 | # } -------------------------------------------------------------------------------- /src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | management: 2 | endpoint: 3 | web: 4 | exposure: 5 | inculde: info, refresh, keepalive, health 6 | logging: 7 | level: 8 | org.springframework.cloud.kubernetes: DEBUG 9 | 10 | spring: 11 | application: 12 | name: minikube-sample 13 | -------------------------------------------------------------------------------- /eks_module/modules/aws_eks_nodegroup/variables.tf: -------------------------------------------------------------------------------- 1 | variable "eks_cluster_name" { 2 | 3 | } 4 | variable "node_group_name" { 5 | default = "nodes-general" 6 | } 7 | 8 | variable "subnet_ids" { 9 | 10 | } 11 | 12 | variable "tags" { 13 | 14 | } 15 | variable "nodes_iam_role" { 16 | default = "eks-node-group-general" 17 | } -------------------------------------------------------------------------------- /src/main/resources/bootstrap.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | cloud: 3 | kubernetes: 4 | config: 5 | enabled: true 6 | sources: 7 | - namespace: default 8 | name: minikube-sample 9 | reload: 10 | enabled: true 11 | mode: event 12 | strategy: refresh 13 | 14 | management: 15 | endpoint: 16 | restart: 17 | enabled: true -------------------------------------------------------------------------------- /eks_module/variables.tf: -------------------------------------------------------------------------------- 1 | 2 | variable "access_key" { 3 | default = "" 4 | } 5 | variable "secret_key" { 6 | default = "" 7 | } 8 | 9 | 10 | variable "region" { 11 | default = "us-east-1" 12 | } 13 | 14 | variable "aws_eks_cluster_config" { 15 | 16 | } 17 | variable "eks_node_group_config" { 18 | 19 | } 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/test/java/com/minikube/sample/MinikubeSampleApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.minikube.sample; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.boot.test.context.SpringBootTest; 6 | import org.springframework.test.context.junit4.SpringRunner; 7 | 8 | @RunWith(SpringRunner.class) 9 | @SpringBootTest 10 | public class MinikubeSampleApplicationTests { 11 | 12 | @Test 13 | public void contextLoads() { 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/minikube/sample/MinikubeSampleApplication.java: -------------------------------------------------------------------------------- 1 | package com.minikube.sample; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | 7 | @SpringBootApplication 8 | @EnableAutoConfiguration 9 | public class MinikubeSampleApplication { 10 | 11 | public static void main(String[] args) { 12 | 13 | SpringApplication.run(MinikubeSampleApplication.class, args); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/minikube/sample/properties/PropertiesConfig.java: -------------------------------------------------------------------------------- 1 | package com.minikube.sample.properties; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import org.springframework.boot.context.properties.ConfigurationProperties; 7 | import org.springframework.context.annotation.Configuration; 8 | 9 | /** 10 | * Created By Gorantla, Eresh on 17/Dec/2019 11 | **/ 12 | @Configuration 13 | @ConfigurationProperties(prefix = "app.data") 14 | @Getter 15 | @Setter 16 | public class PropertiesConfig { 17 | 18 | private String test; 19 | private String name; 20 | } 21 | -------------------------------------------------------------------------------- /deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: myjavaapp-deployment 5 | spec: 6 | replicas: 3 7 | selector: 8 | matchLabels: 9 | app: myjavaapp 10 | template: 11 | metadata: 12 | labels: 13 | app: myjavaapp 14 | spec: 15 | containers: 16 | - name: myjavaapp 17 | image: 496157679619.dkr.ecr.us-east-1.amazonaws.com/vikashashoke:latest 18 | ports: 19 | - containerPort: 8080 20 | 21 | --- 22 | apiVersion: v1 23 | kind: Service 24 | metadata: 25 | name: myjavaapp-service 26 | spec: 27 | selector: 28 | app: myjavaapp 29 | ports: 30 | - name: http 31 | port: 80 32 | targetPort: 8080 33 | type: LoadBalancer 34 | -------------------------------------------------------------------------------- /eks_module/config/terraform.tfvars: -------------------------------------------------------------------------------- 1 | 2 | aws_eks_cluster_config = { 3 | 4 | "demo-cluster" = { 5 | 6 | eks_cluster_name = "demo-cluster1" 7 | eks_subnet_ids = ["subnet-0c6265a3df91b7b61","subnet-0f9c4ff10c3526a4d","subnet-04919de8d00a175f3","subnet-080af72a4f9415d55"] 8 | tags = { 9 | "Name" = "demo-cluster" 10 | } 11 | } 12 | } 13 | 14 | eks_node_group_config = { 15 | 16 | "node1" = { 17 | 18 | eks_cluster_name = "demo-cluster" 19 | node_group_name = "mynode" 20 | nodes_iam_role = "eks-node-group-general1" 21 | node_subnet_ids = [subnet-0c6265a3df91b7b61","subnet-0f9c4ff10c3526a4d","subnet-04919de8d00a175f3","subnet-080af72a4f9415d55"] 22 | 23 | tags = { 24 | "Name" = "node1" 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /eks_module/main.tf: -------------------------------------------------------------------------------- 1 | 2 | module "aws_eks_cluster" { 3 | 4 | source = "./modules/aws_eks" 5 | 6 | for_each = var.aws_eks_cluster_config 7 | 8 | eks_cluster_name = each.value.eks_cluster_name 9 | subnet_ids = each.value.eks_subnet_ids 10 | tags = each.value.tags 11 | } 12 | 13 | module "aws_eks_node_group" { 14 | 15 | source = "./modules/aws_eks_nodegroup" 16 | 17 | for_each = var.eks_node_group_config 18 | 19 | node_group_name = each.value.node_group_name 20 | eks_cluster_name = module.aws_eks_cluster[each.value.eks_cluster_name].eks_cluster_name 21 | subnet_ids = each.value.node_subnet_ids 22 | nodes_iam_role = each.value.nodes_iam_role 23 | tags = each.value.tags 24 | } 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/main/fabric8/role-config.yaml: -------------------------------------------------------------------------------- 1 | kind: Role 2 | apiVersion: rbac.authorization.k8s.io/v1 3 | metadata: 4 | namespace: default 5 | name: namespace-reader 6 | rules: 7 | - apiGroups: ["", "extensions", "apps"] 8 | resources: ["configmaps", "pods", "services", "endpoints", "secrets"] 9 | verbs: ["get", "list", "watch"] 10 | 11 | --- 12 | 13 | kind: RoleBinding 14 | apiVersion: rbac.authorization.k8s.io/v1 15 | metadata: 16 | name: namespace-reader-binding 17 | namespace: default 18 | subjects: 19 | - kind: ServiceAccount 20 | name: default 21 | apiGroup: "" 22 | roleRef: 23 | kind: Role 24 | name: namespace-reader 25 | apiGroup: "" 26 | 27 | --- 28 | 29 | apiVersion: rbac.authorization.k8s.io/v1 30 | kind: ClusterRoleBinding 31 | metadata: 32 | name: minikube-sample-view 33 | roleRef: 34 | kind: ClusterRole 35 | name: view 36 | apiGroup: rbac.authorization.k8s.io 37 | subjects: 38 | # Authorize specific service accounts: 39 | - kind: ServiceAccount 40 | name: minikube-sample 41 | namespace: default -------------------------------------------------------------------------------- /src/main/fabric8/deployment.yaml: -------------------------------------------------------------------------------- 1 | kind: Service 2 | apiVersion: v1 3 | metadata: 4 | name: minikube-sample 5 | spec: 6 | selector: 7 | app: minikube-sample 8 | ports: 9 | - protocol: TCP 10 | port: 8080 11 | nodePort: 30083 12 | type: NodePort 13 | 14 | --- 15 | 16 | apiVersion: apps/v1 17 | kind: Deployment 18 | metadata: 19 | name: minikube-sample 20 | namespace: default 21 | spec: 22 | selector: 23 | matchLabels: 24 | app: minikube-sample 25 | 26 | replicas: 1 27 | template: 28 | metadata: 29 | labels: 30 | app: minikube-sample 31 | spec: 32 | containers: 33 | - name: minikube-sample 34 | image: minikube-sample:latest 35 | imagePullPolicy: Never 36 | ports: 37 | - containerPort: 8080 38 | env: 39 | - name: env.namespace 40 | value: default 41 | volumeMounts: 42 | - name: config 43 | mountPath: /config 44 | volumes: 45 | - name: config 46 | configMap: 47 | name: minikube-sample -------------------------------------------------------------------------------- /src/main/java/com/minikube/sample/rest/controller/HomeResource.java: -------------------------------------------------------------------------------- 1 | package com.minikube.sample.rest.controller; 2 | 3 | import com.fasterxml.jackson.databind.ObjectMapper; 4 | import com.minikube.sample.properties.PropertiesConfig; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.beans.factory.annotation.Lookup; 9 | import org.springframework.beans.factory.annotation.Value; 10 | import org.springframework.http.HttpStatus; 11 | import org.springframework.http.ResponseEntity; 12 | import org.springframework.web.bind.annotation.GetMapping; 13 | import org.springframework.web.bind.annotation.RequestMapping; 14 | import org.springframework.web.bind.annotation.RestController; 15 | 16 | /** 17 | * @author Gorantla, Eresh 18 | * @created 06-12-2018 19 | */ 20 | @RestController 21 | @RequestMapping("/home") 22 | public class HomeResource { 23 | 24 | @Autowired 25 | PropertiesConfig config; 26 | 27 | @GetMapping("/data") 28 | public ResponseEntity getData() { 29 | ResponseData responseData = new ResponseData(); 30 | responseData.setId(1); 31 | responseData.setName(config.getName()); 32 | responseData.setPlace("Hyderabad"); 33 | responseData.setValue(config.getTest()); 34 | return new ResponseEntity<>(responseData, HttpStatus.OK); 35 | } 36 | 37 | @Getter 38 | @Setter 39 | public class ResponseData { 40 | private String name; 41 | private Integer id; 42 | private String place; 43 | private String value; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # kubernetes-configmap-reload 2 | 3 | Pre-requisites: 4 | -------- 5 | - Install Git 6 | - Install Maven 7 | - Install Docker 8 | - EKS Cluster 9 | 10 | Clone code from github: 11 | ------- 12 | git clone https://github.com/vikash-kumar01/spring-cloud-kubernetes.git 13 | cd spring-cloud-kubernetes/kubernetes-configmap-reload 14 | 15 | Build Maven Artifact: 16 | ------- 17 | mvn clean install 18 | 19 | Build Docker image for Springboot Application 20 | -------------- 21 | docker build -t vikashashoke/kubernetes-configmap-reload . 22 | 23 | Docker login 24 | ------------- 25 | docker login 26 | 27 | Push docker image to dockerhub 28 | ----------- 29 | docker push vikashashoke/kubernetes-configmap-reload 30 | 31 | Deploy Spring Application: 32 | -------- 33 | kubectl apply -f kubernetes-configmap.yml 34 | 35 | Check Deployments, Pods and Services: 36 | ------- 37 | 38 | kubectl get deploy 39 | kubectl get pods 40 | kubectl get svc 41 | 42 | Now Goto Loadbalancer and check whether service comes Inservice or not, If it comes Inservice copy DNS Name of Loadbalancer and Give in WebUI 43 | 44 | http://a70a89c22e06f49f3ba2b3270e974e29-1311314938.us-west-2.elb.amazonaws.com:8080/home/data 45 | 46 | ![2](https://user-images.githubusercontent.com/63221837/82123471-44f5f300-97b7-11ea-9d10-438cf9cc98a0.png) 47 | 48 | Now we can cleanup by using below commands: 49 | -------- 50 | kubectl delete deploy kubernetes-configmap-reload 51 | kubectl delete svc kubernetes-configmap-reload 52 | # springboot_k8s_application 53 | # mrdevops_java_app 54 | -------------------------------------------------------------------------------- /eks_module/modules/aws_eks/main.tf: -------------------------------------------------------------------------------- 1 | 2 | resource "aws_eks_cluster" "eks" { 3 | # Name of the cluster. 4 | name = var.eks_cluster_name 5 | 6 | # The Amazon Resource Name (ARN) of the IAM role that provides permissions for 7 | # the Kubernetes control plane to make calls to AWS API operations on your behalf 8 | role_arn = aws_iam_role.eks_cluster.arn 9 | 10 | # Desired Kubernetes master version 11 | version = "1.24" 12 | 13 | vpc_config { 14 | # Indicates whether or not the Amazon EKS private API server endpoint is enabled 15 | endpoint_private_access = false 16 | 17 | # Indicates whether or not the Amazon EKS public API server endpoint is enabled 18 | endpoint_public_access = true 19 | 20 | # Must be in at least two different availability zones 21 | subnet_ids = var.subnet_ids 22 | # subnet_ids = [ 23 | # aws_subnet.public_1.id, 24 | # aws_subnet.public_2.id, 25 | # aws_subnet.private_1.id, 26 | # aws_subnet.private_2.id 27 | # ] 28 | } 29 | 30 | # Ensure that IAM Role permissions are created before and deleted after EKS Cluster handling. 31 | # Otherwise, EKS will not be able to properly delete EKS managed EC2 infrastructure such as Security Groups. 32 | depends_on = [ 33 | aws_iam_role_policy_attachment.amazon_eks_cluster_policy 34 | ] 35 | tags = var.tags 36 | } 37 | 38 | resource "aws_iam_role" "eks_cluster" { 39 | # The name of the role 40 | name = "eks-cluster" 41 | 42 | # The policy that grants an entity permission to assume the role. 43 | # Used to access AWS resources that you might not normally have access to. 44 | # The role that Amazon EKS will use to create AWS resources for Kubernetes clusters 45 | assume_role_policy = < 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 2.2.1.RELEASE 9 | 10 | 11 | com.minikube.sample 12 | kubernetes-configmap-reload 13 | 0.0.1-SNAPSHOT 14 | jar 15 | minikube-sample 16 | Demo project for Spring Cloud Kubernetes 17 | 18 | 19 | UTF-8 20 | UTF-8 21 | 1.8 22 | 23 | 24 | 25 | 26 | org.springframework.boot 27 | spring-boot-starter-web 28 | 29 | 30 | 31 | org.springframework.boot 32 | spring-boot-starter-actuator 33 | 34 | 35 | 36 | org.springframework.cloud 37 | spring-cloud-starter-kubernetes-config 38 | 1.1.0.RELEASE 39 | 40 | 41 | 42 | org.projectlombok 43 | lombok 44 | 1.18.4 45 | provided 46 | 47 | 48 | 49 | 50 | org.springframework.boot 51 | spring-boot-starter-test 52 | test 53 | 54 | 55 | org.springframework.security 56 | spring-security-test 57 | test 58 | 59 | 60 | 61 | 62 | 63 | 64 | org.springframework.boot 65 | spring-boot-maven-plugin 66 | 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /eks_module/modules/aws_eks_nodegroup/main.tf: -------------------------------------------------------------------------------- 1 | 2 | 3 | resource "aws_eks_node_group" "nodes_general" { 4 | # Name of the EKS Cluster. 5 | cluster_name = var.eks_cluster_name 6 | 7 | # Name of the EKS Node Group. 8 | node_group_name = var.node_group_name 9 | 10 | # Amazon Resource Name (ARN) of the IAM Role that provides permissions for the EKS Node Group. 11 | node_role_arn = aws_iam_role.nodes_general.arn 12 | 13 | # Identifiers of EC2 Subnets to associate with the EKS Node Group. 14 | # These subnets must have the following resource tag: kubernetes.io/cluster/CLUSTER_NAME 15 | # (where CLUSTER_NAME is replaced with the name of the EKS Cluster). 16 | subnet_ids = var.subnet_ids 17 | 18 | # Configuration block with scaling settings 19 | scaling_config { 20 | # Desired number of worker nodes. 21 | desired_size = 1 22 | 23 | # Maximum number of worker nodes. 24 | max_size = 1 25 | 26 | # Minimum number of worker nodes. 27 | min_size = 1 28 | } 29 | 30 | # Type of Amazon Machine Image (AMI) associated with the EKS Node Group. 31 | # Valid values: AL2_x86_64, AL2_x86_64_GPU, AL2_ARM_64 32 | ami_type = "AL2_x86_64" 33 | 34 | # Type of capacity associated with the EKS Node Group. 35 | # Valid values: ON_DEMAND, SPOT 36 | capacity_type = "ON_DEMAND" 37 | 38 | # Disk size in GiB for worker nodes 39 | disk_size = 20 40 | 41 | # Force version update if existing pods are unable to be drained due to a pod disruption budget issue. 42 | force_update_version = false 43 | 44 | # List of instance types associated with the EKS Node Group 45 | instance_types = ["t3.small"] 46 | 47 | # Kubernetes version 48 | version = "1.24" 49 | 50 | # Ensure that IAM Role permissions are created before and deleted after EKS Node Group handling. 51 | # Otherwise, EKS will not be able to properly delete EC2 Instances and Elastic Network Interfaces. 52 | depends_on = [ 53 | aws_iam_role_policy_attachment.amazon_eks_worker_node_policy_general, 54 | aws_iam_role_policy_attachment.amazon_eks_cni_policy_general, 55 | aws_iam_role_policy_attachment.amazon_ec2_container_registry_read_only, 56 | ] 57 | tags = var.tags 58 | } 59 | 60 | # Create IAM role for EKS Node Group 61 | resource "aws_iam_role" "nodes_general" { 62 | # The name of the role 63 | name = var.node_group_name 64 | 65 | # The policy that grants an entity permission to assume the role. 66 | assume_role_policy = <&2 63 | echo Please set the JAVA_HOME variable in your environment to match the >&2 64 | echo location of your Java installation. >&2 65 | echo. 66 | goto error 67 | 68 | :OkJHome 69 | if exist "%JAVA_HOME%\bin\java.exe" goto init 70 | 71 | echo. 72 | echo Error: JAVA_HOME is set to an invalid directory. >&2 73 | echo JAVA_HOME = "%JAVA_HOME%" >&2 74 | echo Please set the JAVA_HOME variable in your environment to match the >&2 75 | echo location of your Java installation. >&2 76 | echo. 77 | goto error 78 | 79 | @REM ==== END VALIDATION ==== 80 | 81 | :init 82 | 83 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 84 | @REM Fallback to current working directory if not found. 85 | 86 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 87 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 88 | 89 | set EXEC_DIR=%CD% 90 | set WDIR=%EXEC_DIR% 91 | :findBaseDir 92 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 93 | cd .. 94 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 95 | set WDIR=%CD% 96 | goto findBaseDir 97 | 98 | :baseDirFound 99 | set MAVEN_PROJECTBASEDIR=%WDIR% 100 | cd "%EXEC_DIR%" 101 | goto endDetectBaseDir 102 | 103 | :baseDirNotFound 104 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 105 | cd "%EXEC_DIR%" 106 | 107 | :endDetectBaseDir 108 | 109 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 110 | 111 | @setlocal EnableExtensions EnableDelayedExpansion 112 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 113 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 114 | 115 | :endReadAdditionalConfig 116 | 117 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 118 | 119 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 120 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 121 | 122 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 123 | if ERRORLEVEL 1 goto error 124 | goto end 125 | 126 | :error 127 | set ERROR_CODE=1 128 | 129 | :end 130 | @endlocal & set ERROR_CODE=%ERROR_CODE% 131 | 132 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost 133 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 134 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" 135 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" 136 | :skipRcPost 137 | 138 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 139 | if "%MAVEN_BATCH_PAUSE%" == "on" pause 140 | 141 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% 142 | 143 | exit /B %ERROR_CODE% 144 | -------------------------------------------------------------------------------- /Jenkinsfile-ECR: -------------------------------------------------------------------------------- 1 | @Library('my-shared-library') _ 2 | 3 | pipeline{ 4 | 5 | agent any 6 | 7 | parameters{ 8 | 9 | choice(name: 'action', choices: 'create\ndelete', description: 'Choose create/Destroy') 10 | string(name: 'aws_account_id', description: " AWS Account ID", defaultValue: '496157679619') 11 | string(name: 'Region', description: "Region of ECR", defaultValue: 'us-east-1') 12 | string(name: 'ECR_REPO_NAME', description: "name of the ECR", defaultValue: 'vikashashoke') 13 | string(name: 'cluster', description: "name of the EKS Cluster", defaultValue: 'demo-cluster1') 14 | } 15 | environment{ 16 | 17 | ACCESS_KEY = credentials('AWS_ACCESS_KEY_ID') 18 | SECRET_KEY = credentials('AWS_SECRET_KEY_ID') 19 | } 20 | 21 | stages{ 22 | 23 | stage('Git Checkout'){ 24 | when { expression { params.action == 'create' } } 25 | steps{ 26 | gitCheckout( 27 | branch: "main", 28 | url: "https://github.com/vikash-kumar01/mrdevops_java_app.git" 29 | ) 30 | } 31 | } 32 | // stage('Unit Test maven'){ 33 | 34 | // when { expression { params.action == 'create' } } 35 | 36 | // steps{ 37 | // script{ 38 | 39 | // mvnTest() 40 | // } 41 | // } 42 | // } 43 | // stage('Integration Test maven'){ 44 | // when { expression { params.action == 'create' } } 45 | // steps{ 46 | // script{ 47 | 48 | // mvnIntegrationTest() 49 | // } 50 | // } 51 | // } 52 | // stage('Static code analysis: Sonarqube'){ 53 | // when { expression { params.action == 'create' } } 54 | // steps{ 55 | // script{ 56 | 57 | // def SonarQubecredentialsId = 'sonarqube-api' 58 | // statiCodeAnalysis(SonarQubecredentialsId) 59 | // } 60 | // } 61 | // } 62 | // stage('Quality Gate Status Check : Sonarqube'){ 63 | // when { expression { params.action == 'create' } } 64 | // steps{ 65 | // script{ 66 | 67 | // def SonarQubecredentialsId = 'sonarqube-api' 68 | // QualityGateStatus(SonarQubecredentialsId) 69 | // } 70 | // } 71 | // } 72 | // stage('Maven Build : maven'){ 73 | // when { expression { params.action == 'create' } } 74 | // steps{ 75 | // script{ 76 | 77 | // mvnBuild() 78 | // } 79 | // } 80 | // } 81 | // stage('Docker Image Build : ECR'){ 82 | // when { expression { params.action == 'create' } } 83 | // steps{ 84 | // script{ 85 | 86 | // dockerBuild("${params.aws_account_id}","${params.Region}","${params.ECR_REPO_NAME}") 87 | // } 88 | // } 89 | // } 90 | // stage('Docker Image Scan: trivy '){ 91 | // when { expression { params.action == 'create' } } 92 | // steps{ 93 | // script{ 94 | 95 | // dockerImageScan("${params.aws_account_id}","${params.Region}","${params.ECR_REPO_NAME}") 96 | // } 97 | // } 98 | // } 99 | // stage('Docker Image Push : ECR '){ 100 | // when { expression { params.action == 'create' } } 101 | // steps{ 102 | // script{ 103 | 104 | // dockerImagePush("${params.aws_account_id}","${params.Region}","${params.ECR_REPO_NAME}") 105 | // } 106 | // } 107 | // } 108 | // stage('Docker Image Cleanup : ECR '){ 109 | // when { expression { params.action == 'create' } } 110 | // steps{ 111 | // script{ 112 | 113 | // dockerImageCleanup("${params.aws_account_id}","${params.Region}","${params.ECR_REPO_NAME}") 114 | // } 115 | // } 116 | // } 117 | stage('Create EKS Cluster : Terraform'){ 118 | when { expression { params.action == 'create' } } 119 | steps{ 120 | script{ 121 | 122 | dir('eks_module') { 123 | sh """ 124 | 125 | terraform init 126 | terraform plan -var 'access_key=$ACCESS_KEY' -var 'secret_key=$SECRET_KEY' -var 'region=${params.Region}' --var-file=./config/terraform.tfvars 127 | terraform apply -var 'access_key=$ACCESS_KEY' -var 'secret_key=$SECRET_KEY' -var 'region=${params.Region}' --var-file=./config/terraform.tfvars --auto-approve 128 | """ 129 | } 130 | } 131 | } 132 | } 133 | stage('Connect to EKS '){ 134 | when { expression { params.action == 'create' } } 135 | steps{ 136 | 137 | script{ 138 | 139 | sh """ 140 | aws configure set aws_access_key_id "$ACCESS_KEY" 141 | aws configure set aws_secret_access_key "$SECRET_KEY" 142 | aws configure set region "${params.Region}" 143 | aws eks --region ${params.Region} update-kubeconfig --name ${params.cluster} 144 | """ 145 | } 146 | } 147 | } 148 | stage('Deployment on EKS Cluster'){ 149 | when { expression { params.action == 'create' } } 150 | steps{ 151 | script{ 152 | 153 | def apply = false 154 | 155 | try{ 156 | input message: 'please confirm to deploy on eks', ok: 'Ready to apply the config ?' 157 | apply = true 158 | }catch(err){ 159 | apply= false 160 | currentBuild.result = 'UNSTABLE' 161 | } 162 | if(apply){ 163 | 164 | sh """ 165 | kubectl apply -f . 166 | """ 167 | } 168 | } 169 | } 170 | } 171 | } 172 | } -------------------------------------------------------------------------------- /mvnw: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # ---------------------------------------------------------------------------- 3 | # Licensed to the Apache Software Foundation (ASF) under one 4 | # or more contributor license agreements. See the NOTICE file 5 | # distributed with this work for additional information 6 | # regarding copyright ownership. The ASF licenses this file 7 | # to you under the Apache License, Version 2.0 (the 8 | # "License"); you may not use this file except in compliance 9 | # with the License. You may obtain a copy of the License at 10 | # 11 | # http://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, 14 | # software distributed under the License is distributed on an 15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | # KIND, either express or implied. See the License for the 17 | # specific language governing permissions and limitations 18 | # under the License. 19 | # ---------------------------------------------------------------------------- 20 | 21 | # ---------------------------------------------------------------------------- 22 | # Maven2 Start Up Batch script 23 | # 24 | # Required ENV vars: 25 | # ------------------ 26 | # JAVA_HOME - location of a JDK home dir 27 | # 28 | # Optional ENV vars 29 | # ----------------- 30 | # M2_HOME - location of maven2's installed home dir 31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven 32 | # e.g. to debug Maven itself, use 33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files 35 | # ---------------------------------------------------------------------------- 36 | 37 | if [ -z "$MAVEN_SKIP_RC" ] ; then 38 | 39 | if [ -f /etc/mavenrc ] ; then 40 | . /etc/mavenrc 41 | fi 42 | 43 | if [ -f "$HOME/.mavenrc" ] ; then 44 | . "$HOME/.mavenrc" 45 | fi 46 | 47 | fi 48 | 49 | # OS specific support. $var _must_ be set to either true or false. 50 | cygwin=false; 51 | darwin=false; 52 | mingw=false 53 | case "`uname`" in 54 | CYGWIN*) cygwin=true ;; 55 | MINGW*) mingw=true;; 56 | Darwin*) darwin=true 57 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home 58 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html 59 | if [ -z "$JAVA_HOME" ]; then 60 | if [ -x "/usr/libexec/java_home" ]; then 61 | export JAVA_HOME="`/usr/libexec/java_home`" 62 | else 63 | export JAVA_HOME="/Library/Java/Home" 64 | fi 65 | fi 66 | ;; 67 | esac 68 | 69 | if [ -z "$JAVA_HOME" ] ; then 70 | if [ -r /etc/gentoo-release ] ; then 71 | JAVA_HOME=`java-config --jre-home` 72 | fi 73 | fi 74 | 75 | if [ -z "$M2_HOME" ] ; then 76 | ## resolve links - $0 may be a link to maven's home 77 | PRG="$0" 78 | 79 | # need this for relative symlinks 80 | while [ -h "$PRG" ] ; do 81 | ls=`ls -ld "$PRG"` 82 | link=`expr "$ls" : '.*-> \(.*\)$'` 83 | if expr "$link" : '/.*' > /dev/null; then 84 | PRG="$link" 85 | else 86 | PRG="`dirname "$PRG"`/$link" 87 | fi 88 | done 89 | 90 | saveddir=`pwd` 91 | 92 | M2_HOME=`dirname "$PRG"`/.. 93 | 94 | # make it fully qualified 95 | M2_HOME=`cd "$M2_HOME" && pwd` 96 | 97 | cd "$saveddir" 98 | # echo Using m2 at $M2_HOME 99 | fi 100 | 101 | # For Cygwin, ensure paths are in UNIX format before anything is touched 102 | if $cygwin ; then 103 | [ -n "$M2_HOME" ] && 104 | M2_HOME=`cygpath --unix "$M2_HOME"` 105 | [ -n "$JAVA_HOME" ] && 106 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 107 | [ -n "$CLASSPATH" ] && 108 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"` 109 | fi 110 | 111 | # For Migwn, ensure paths are in UNIX format before anything is touched 112 | if $mingw ; then 113 | [ -n "$M2_HOME" ] && 114 | M2_HOME="`(cd "$M2_HOME"; pwd)`" 115 | [ -n "$JAVA_HOME" ] && 116 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" 117 | # TODO classpath? 118 | fi 119 | 120 | if [ -z "$JAVA_HOME" ]; then 121 | javaExecutable="`which javac`" 122 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then 123 | # readlink(1) is not available as standard on Solaris 10. 124 | readLink=`which readlink` 125 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then 126 | if $darwin ; then 127 | javaHome="`dirname \"$javaExecutable\"`" 128 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" 129 | else 130 | javaExecutable="`readlink -f \"$javaExecutable\"`" 131 | fi 132 | javaHome="`dirname \"$javaExecutable\"`" 133 | javaHome=`expr "$javaHome" : '\(.*\)/bin'` 134 | JAVA_HOME="$javaHome" 135 | export JAVA_HOME 136 | fi 137 | fi 138 | fi 139 | 140 | if [ -z "$JAVACMD" ] ; then 141 | if [ -n "$JAVA_HOME" ] ; then 142 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 143 | # IBM's JDK on AIX uses strange locations for the executables 144 | JAVACMD="$JAVA_HOME/jre/sh/java" 145 | else 146 | JAVACMD="$JAVA_HOME/bin/java" 147 | fi 148 | else 149 | JAVACMD="`which java`" 150 | fi 151 | fi 152 | 153 | if [ ! -x "$JAVACMD" ] ; then 154 | echo "Error: JAVA_HOME is not defined correctly." >&2 155 | echo " We cannot execute $JAVACMD" >&2 156 | exit 1 157 | fi 158 | 159 | if [ -z "$JAVA_HOME" ] ; then 160 | echo "Warning: JAVA_HOME environment variable is not set." 161 | fi 162 | 163 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher 164 | 165 | # traverses directory structure from process work directory to filesystem root 166 | # first directory with .mvn subdirectory is considered project base directory 167 | find_maven_basedir() { 168 | 169 | if [ -z "$1" ] 170 | then 171 | echo "Path not specified to find_maven_basedir" 172 | return 1 173 | fi 174 | 175 | basedir="$1" 176 | wdir="$1" 177 | while [ "$wdir" != '/' ] ; do 178 | if [ -d "$wdir"/.mvn ] ; then 179 | basedir=$wdir 180 | break 181 | fi 182 | # workaround for JBEAP-8937 (on Solaris 10/Sparc) 183 | if [ -d "${wdir}" ]; then 184 | wdir=`cd "$wdir/.."; pwd` 185 | fi 186 | # end of workaround 187 | done 188 | echo "${basedir}" 189 | } 190 | 191 | # concatenates all lines of a file 192 | concat_lines() { 193 | if [ -f "$1" ]; then 194 | echo "$(tr -s '\n' ' ' < "$1")" 195 | fi 196 | } 197 | 198 | BASE_DIR=`find_maven_basedir "$(pwd)"` 199 | if [ -z "$BASE_DIR" ]; then 200 | exit 1; 201 | fi 202 | 203 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} 204 | echo $MAVEN_PROJECTBASEDIR 205 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" 206 | 207 | # For Cygwin, switch paths to Windows format before running java 208 | if $cygwin; then 209 | [ -n "$M2_HOME" ] && 210 | M2_HOME=`cygpath --path --windows "$M2_HOME"` 211 | [ -n "$JAVA_HOME" ] && 212 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` 213 | [ -n "$CLASSPATH" ] && 214 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"` 215 | [ -n "$MAVEN_PROJECTBASEDIR" ] && 216 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` 217 | fi 218 | 219 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 220 | 221 | exec "$JAVACMD" \ 222 | $MAVEN_OPTS \ 223 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ 224 | "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ 225 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" 226 | --------------------------------------------------------------------------------