-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJenkinsFile.Promote
110 lines (98 loc) · 3.92 KB
/
JenkinsFile.Promote
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
#!/usr/bin/groovy
node {
def root = pwd()
def mvn = tool 'M3'
def appBaseName = "pz-svcs-prevgen"
def appName
stage("Config") {
// clone the configuration repository and copy the current configuration
def configDir = "${root}/configuration"
def configFile = "${root}/config.json"
dir(configDir) {
git url: "${env.CONFIGURATION_URL}", credentialsId: "${env.CONFIGURATION_CREDS}"
sh "mv ${configDir}/${env.ENVIRONMENT}-config.json ${configFile}"
deleteDir()
}
// read the current configuration
def configJson = readJSON file: "${configFile}"
for (param in configJson.credparams + configJson.jobparams) {
env."${param.name}" = (param.type == "booleanParam") ? "${param.defaultvalue}".toBoolean() : "${param.defaultvalue}"
}
}
def appvers = "${env.PROMOTE_VERSION}"
if(!fileExists('.cf')) {
sh "mkdir -p .cf"
}
withEnv(["CF_HOME=.cf"]) {
def authenticatePcf = { ->
withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: "${env.PCF_CREDS}", usernameVariable: "CFUSER", passwordVariable: "CFPASS"]]) {
sh """
cf api ${env.PCF_API_ENDPOINT}
cf auth ${CFUSER} ${CFPASS}
"""
}
}
stage('Pull Artifact') {
authenticatePcf()
if (appvers == "latest") {
// Get the latest version from Phase 2
echo "No version specified. Fetching the latest version from ${env.PHASE_TWO_PCF_SPACE}"
sh "cf target -o ${env.PCF_ORG} -s ${env.PHASE_TWO_PCF_SPACE}"
appName = sh(script: "cf apps | grep '${appBaseName}' | cut -f1 -d ' ' ", returnStdout: true)
appvers = appName.trim().replace("${appBaseName}-", "")
echo "Pulled version ${appvers} from ${env.PHASE_TWO_PCF_SPACE}"
} else {
appName = "${appBaseName}-${appvers}"
}
appName = appName.trim()
// Get the Artifact from Nexus
def getDependencyStatus = sh(script: """mvn -X --settings ~/.m2/settings.xml dependency:get \
-Dmaven.repo.local="${root}/.m2/repository" \
-DrepositoryId=nexus \
-DartifactId=${appBaseName} \
-Dversion=${appvers} \
-DgroupId="org.venice.piazza" \
-Dpackaging=tar.gz \
-Ddest=${root}/${appBaseName}.tar.gz \
-DremoteRepositories="nexus::default::${env.ARTIFACT_STORAGE_DEPLOY_URL}" \
""", returnStatus: true)
echo "dependency status = ${getDependencyStatus}"
if (getDependencyStatus == 0) {
// Unzip
sh "tar -xvzf ${root}/${appBaseName}.tar.gz"
} else {
error("The artifact version ${appvers} could not be found in Nexus.")
}
}
stage ('Deploy') {
authenticatePcf()
sh "cf target -o ${env.PCF_ORG} -s ${env.PROMOTE_SPACE}"
// Push the app
sh "cf push ${appName} -f manifest.jenkins.yml --hostname ${appName} -b ${env.JAVA_BUILDPACK_NAME} -d ${env.PROMOTE_DOMAIN} --no-start --no-route"
try {
sh "cf set-env ${appName} SPACE ${env.PROMOTE_SPACE}"
sh "cf set-env ${appName} DOMAIN ${env.PROMOTE_DOMAIN}"
sh "cf start ${appName}"
} catch (Exception e) {
try {
sh "cf logs --recent ${appName}"
} catch (Exception ex) {
echo "Printing logs failed: ${ex}"
}
sh "cf delete ${appName} -f -r"
error("Error during application start. Deleting ${appName}.")
}
// Assign Routes
def legacyAppNames = sh(script: "cf routes | grep \"${appBaseName}\" | awk '{print \$4}'", returnStdout: true)
sh "cf map-route ${appName} ${env.PROMOTE_DOMAIN} --hostname ${appBaseName}"
// Delete old Routes
for (Object legacyApp : legacyAppNames.trim().tokenize(',')) {
def legacyAppName = legacyApp.toString().trim()
if (legacyAppName != appName) {
sh "cf unmap-route ${legacyAppName} ${env.PROMOTE_DOMAIN} --hostname ${appBaseName}"
sh "cf delete -f ${legacyAppName} -r"
}
}
}
}
}