Ravi Srinivasan
2019-07-15 702686c81d03ca518d1de9b5932235a55797fcf3
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
pipeline {
    options {
        // set a timeout of 60 minutes for this pipeline
        timeout(time: 60, unit: 'MINUTES')
    }
    agent {
      node {
        //TODO: Add label for the Maven jenkins agent
      }
    }
 
    environment {
        //TODO: Customize these variables for your environment
        DEV_PROJECT = "youruser-movies-dev"
        STAGE_PROJECT = "youruser-movies-stage"
        APP_GIT_URL = "https://github.com/youruser/DO288-apps"
        NEXUS_SERVER = "http://nexus-common.apps.cluster.domain.example.com/repository/java"
 
        // DO NOT CHANGE THE GLOBAL VARS BELOW THIS LINE
        APP_NAME = "movies"
    }
 
 
    stages {
 
        stage('Compilation Check') {
            steps {
                echo '### Checking for compile errors ###'
                sh '''
                        cd ${APP_NAME}
                        mvn -s settings.xml -B clean compile
                   '''
            }
        }
 
        stage('Run Unit Tests') {
            steps {
                echo '### Running unit tests ###'
                sh '''
                        cd ${APP_NAME}
                        mvn -s settings.xml -B clean test
                   '''
            }
        }
 
        stage('Static Code Analysis') {
            steps {
                echo '### Running pmd on code ###'
                sh '''
                        cd ${APP_NAME}
                        mvn -s settings.xml -B clean pmd:check
                   '''
            }
        }
 
        stage('Create fat JAR') {
            steps {
                echo '### Creating fat JAR ###'
                sh '''
                        cd ${APP_NAME}
                        mvn -s settings.xml -B clean package -DskipTests=true
                   '''
            }
        }
 
        stage('Launch new app in DEV env') {
            steps {
                echo '### Cleaning existing resources in DEV env ###'
                sh '''
                        oc delete all -l app=${APP_NAME} -n ${DEV_PROJECT}
                        oc delete all -l build=${APP_NAME} -n ${DEV_PROJECT}
                        sleep 5
                        oc new-build java:8 --name=${APP_NAME} --binary=true -n ${DEV_PROJECT}
                   '''
 
                echo '### Creating a new app in DEV env ###'
                script {
                    openshift.withCluster() {
                      openshift.withProject(env.DEV_PROJECT) {
                        openshift.selector("bc", "${APP_NAME}").startBuild("--from-file=${APP_NAME}/target/${APP_NAME}.jar", "--wait=true", "--follow=true")
                      }
                    }
                }
                // TODO: Create a new OpenShift application based on the ${APP_NAME}:latest image stream
                // TODO: Expose the ${APP_NAME} service for external access
            }
        }
 
        stage('Wait for deployment in DEV env') {
            //TODO: Watch deployment until pod is in 'Running' state
        }
 
        stage('Promote to Staging Env') {
            steps {
                timeout(time: 60, unit: 'MINUTES') {
                    input message: "Promote to Staging?"
                }
                script {
                    openshift.withCluster() {
                    // TODO: Tag the ${APP_NAME}:latest image stream in the dev env as ${APP_NAME}:stage in staging
                    }
                }
            }
        }
 
        stage('Deploy to Staging Env') {
            steps {
                echo '### Cleaning existing resources in Staging ###'
                sh '''
                        oc project ${STAGE_PROJECT}
                        oc delete all -l app=${APP_NAME}
                        sleep 5
                   '''
 
                echo '### Creating a new app in Staging ###'
                // TODO: Create a new app in staging and expose the service
            }
        }
 
        stage('Wait for deployment in Staging') {
            steps {
                sh "oc get route ${APP_NAME} -n ${STAGE_PROJECT} -o jsonpath='{ .spec.host }' --loglevel=4 > routehost"
 
                script {
                    routeHost = readFile('routehost').trim()
 
                    openshift.withCluster() {
                        openshift.withProject( "${STAGE_PROJECT}" ) {
                            def deployment = openshift.selector("dc", "${APP_NAME}").rollout()
                            openshift.selector("dc", "${APP_NAME}").related('pods').untilEach(1) {
                                return (it.object().status.phase == "Running")
                            }
                        }
                        echo "Deployment to Staging env is complete. Access the API endpoint at the URL http://${routeHost}/movies."
                    }
                }
            }
        }
    }
}