-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJenkinsfile
111 lines (97 loc) · 5.56 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
def label = "mypod-${UUID.randomUUID().toString()}"
podTemplate(label: label, containers: [
containerTemplate(name: 'maven-checkstyle', image: 'maven:3.6.1-jdk-8-alpine', ttyEnabled: true, command: 'cat'),
containerTemplate(name: 'maven-build', image: 'maven:3.6.1-jdk-8-alpine', ttyEnabled: true, command: 'cat'),
containerTemplate(name: 'curl', image: 'byrnedo/alpine-curl', ttyEnabled: true, command: 'cat'),
containerTemplate(name: 'docker', image: 'docker:20.10.1', ttyEnabled: true, command: 'cat')],
volumes: [hostPathVolume(hostPath: '/var/run/docker.sock', mountPath: '/var/run/docker.sock')]) {
node(label) {
checkout scm
def username = 'mfabriczy'
def appName = 'tomcat-war-deploy'
def imageTag = "${username}/${appName}:${env.BRANCH_NAME}.${env.BUILD_NUMBER}"
stage('Checkstyle, build package') {
parallel (
checkstyle: {
container('maven-checkstyle') {
sh 'mvn checkstyle:checkstyle'
}
},
build: {
container('maven-build') {
try {
sh 'mvn clean package'
echo 'Now Archiving...'
archiveArtifacts artifacts: '**/target/*.war'
} catch (ex) {
echo 'Unable to build Maven package.'
throw ex
}
}
}
)
}
stage('Build and push Docker image') {
withCredentials([usernamePassword(credentialsId: 'docker-hub-credentials', usernameVariable: 'DOCKERHUB_USERNAME', passwordVariable: 'DOCKERHUB_PASSWORD')]) {
container('docker') {
sh "docker build -t ${imageTag} ."
sh 'docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD'
sh "docker push ${imageTag}"
}
}
}
stage ('Deploy package') {
container('curl') {
switch (env.BRANCH_NAME) {
case "canary":
echo '''
-------------------------------
Updating canary environment...
-------------------------------
'''
echo 'Deploying service...'
kubeCall('k8s/services/tomcat-service.yml', 'https://kubernetes.default.svc.cluster.local/api/v1/namespaces/production/services')
sh "sed -i 's#mfabriczy/tomcat-war-deploy:1.0#${imageTag}#' k8s/canary/tomcat-canary-deployment.yml"
echo 'Deploying package...'
kubeCall('k8s/canary/tomcat-canary-deployment.yml', 'https://kubernetes.default.svc.cluster.local/apis/apps/v1/namespaces/production/deployments')
break
case "master":
echo '''
----------------------------------
Updating production environment...
----------------------------------
'''
echo 'Deploying service...'
kubeCall('k8s/services/tomcat-service.yml', 'https://kubernetes.default.svc.cluster.local/api/v1/namespaces/production/services')
sh "sed -i 's#mfabriczy/tomcat-war-deploy:1.0#${imageTag}#' k8s/production/tomcat-prod-deployment.yml"
echo 'Deploying package...'
kubeCall('k8s/production/tomcat-prod-deployment.yml', 'https://kubernetes.default.svc.cluster.local/apis/apps/v1/namespaces/production/deployments')
break
default:
echo '''
------------------------------------
Deploying development environment...
------------------------------------
'''
echo "Creating namespace: ${env.BRANCH_NAME}"
sh "sed -i 's/dev/${env.BRANCH_NAME}/' k8s/dev/namespace/dev-namespace.yml"
kubeCall('k8s/dev/namespace/dev-namespace.yml', 'https://kubernetes.default.svc.cluster.local/api/v1/namespaces')
echo 'Deploying service...'
sh "sed -i 's/LoadBalancer/ClusterIP/' k8s/services/tomcat-service.yml"
kubeCall('k8s/services/tomcat-service.yml', 'https://kubernetes.default.svc.cluster.local/api/v1/namespaces/' + env.BRANCH_NAME + '/services')
sh "sed -i 's#mfabriczy/tomcat-war-deploy:1.0#${imageTag}#' k8s/dev/tomcat-dev-deployment.yml"
echo 'Deploying package...'
kubeCall('k8s/dev/tomcat-dev-deployment.yml', 'https://kubernetes.default.svc.cluster.local/apis/apps/v1/namespaces/' + env.BRANCH_NAME + '/deployments')
echo "Run `kubectl proxy`. You can access the environment via http://localhost:<port>/api/v1/proxy/namespaces/${env.BRANCH_NAME}/services/tomcat-service:8080/"
}
}
}
}
}
def kubeCall(path, endpoint) {
sh '{ set +x; } 2> /dev/null; \
curl -k -s \
-H "Content-Type: application/yaml" \
-H "Authorization: Bearer $(cat /run/secrets/kubernetes.io/serviceaccount/token)" \
-X POST -d "$(cat ' + path + ')" ' + endpoint + ' > /dev/null;'
}