-
Notifications
You must be signed in to change notification settings - Fork 55
/
Copy pathJenkinsfile
113 lines (88 loc) · 2.95 KB
/
Jenkinsfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
node {
//Define all variables
def app1_name = 'todobackend'
def app2_name = 'todoui'
def app1_image_tag = "${env.REPOSITORY}/${app1_name}:v${env.BUILD_NUMBER}"
def app2_image_tag = "${env.REPOSITORY}/${app2_name}:v${env.BUILD_NUMBER}"
def app1_dockerfile_name = 'Dockerfile-todobackend'
def app2_dockerfile_name = 'Dockerfile-todoui'
def app1_container_name = 'todobackend'
def app2_container_name = 'todoui'
//Stage 1: Checkout Code from Git
stage('Application Code Checkout from Git') {
checkout scm
}
//Stage 2: Test Code with Maven/built-in Memory
stage('Test with Maven/H2') {
container('maven'){
dir ("./${app1_name}") {
sh ("mvn test -Dspring.profiles.active=dev")
}
}
}
//Stage 3: Test Code with Maven/DB
stage('Test with Maven/PSQL') {
container('kubectl'){
withKubeConfig([credentialsId: env.K8s_CREDENTIALS_ID,
serverUrl: env.K8s_SERVER_URL,
contextName: env.K8s_CONTEXT_NAME,
clusterName: env.K8s_CLUSTER_NAME]){
sh("kubectl apply -f postgres_test.yml")
}
}
container('maven'){
dir ("./${app1_name}") {
sh ("mvn test -Dspring.profiles.active=prod -Dspring.datasource.url=jdbc:postgresql://${env.PSQL_TEST}/${env.DB_NAME} -Dspring.datasource.username=${env.DB_USERNAME} -Dspring.datasource.password=${env.DB_PASSWORD}")
}
}
}
//Stage 4: Build with mvn
stage('Build with Maven') {
container('maven'){
dir ("./${app1_name}") {
sh ("mvn -B -DskipTests clean package")
}
dir ("./${app2_name}") {
sh ("mvn -B -DskipTests clean package")
}
}
}
//Stage 5: Build Docker Image
stage('Build Docker Image') {
container('docker'){
sh("docker build -f ${app1_dockerfile_name} -t ${app1_image_tag} .")
sh("docker build -f ${app2_dockerfile_name} -t ${app2_image_tag} .")
}
}
//Stage 6: Push the Image to a Docker Registry
stage('Push Docker Image to Docker Registry') {
container('docker'){
withCredentials([[$class: 'UsernamePasswordMultiBinding',
credentialsId: env.DOCKER_CREDENTIALS_ID,
usernameVariable: 'USERNAME',
passwordVariable: 'PASSWORD']]) {
docker.withRegistry(env.DOCEKR_REGISTRY, env.DOCKER_CREDENTIALS_ID) {
sh("docker push ${app1_image_tag}")
sh("docker push ${app2_image_tag}")
}
}
}
}
//Stage 7: Deploy Application on K8s
stage('Deploy Application on K8s') {
container('kubectl'){
withKubeConfig([credentialsId: env.K8s_CREDENTIALS_ID,
serverUrl: env.K8s_SERVER_URL,
contextName: env.K8s_CONTEXT_NAME,
clusterName: env.K8s_CLUSTER_NAME]){
sh("kubectl apply -f configmap.yml")
sh("kubectl apply -f secret.yml")
sh("kubectl apply -f postgres.yml")
sh("kubectl apply -f ${app1_name}.yml")
sh("kubectl set image deployment/${app1_name} ${app1_container_name}=${app1_image_tag}")
sh("kubectl apply -f ${app2_name}.yml")
sh("kubectl set image deployment/${app2_name} ${app2_container_name}=${app2_image_tag}")
}
}
}
}