This repository has been archived by the owner on Jul 15, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathJenkinsFile.Promote
121 lines (110 loc) · 4.64 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
111
112
113
114
115
116
117
118
119
120
121
#!/usr/bin/groovy
node {
def root = pwd()
def mvn = tool 'M3'
def appBaseName = "bf-tideprediction"
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) {
def paramValueString = (param.defaultvalue != null) ? param.defaultvalue.toString() : ""
env."${param.name}" = (param.type == "booleanParam") ? paramValueString.toBoolean() : paramValueString
}
}
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 --quiet --settings ~/.m2/settings.xml dependency:get \
-Dmaven.repo.local="${root}/.m2/repository" \
-DrepositoryId=nexus \
-DartifactId=${appBaseName} \
-Dversion=${appvers} \
-DgroupId="org.venice.beachfront" \
-Dpackaging=tar.gz \
-Ddest=${root}/${appBaseName}.tar.gz \
-DremoteRepositories="nexus::default::${env.ARTIFACT_STORAGE_DEPLOY_URL}" \
>> /dev/null 2>&1 \
""", 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.PYTHON_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}"
if(env.GITLAB_CREDS) {
sh "cf set-env ${appName} REQUESTS_CA_BUNDLE /etc/ssl/certs/ca-certificates.crt"
}
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} and failing the build.")
}
// Assign Routes
def legacyAppNames = sh(script: "cf routes | grep \"${appBaseName}\" | awk '{print \$4}'", returnStdout: true)
sh "cf map-route ${appName} apps.internal --hostname ${appBaseName}-${env.PROMOTE_SPACE}"
// Define Policies
try {
def iaBroker = sh(script: "cf routes | grep \"bf-ia-broker\" | awk '{print \$4}' | head -n1", returnStdout: true).trim()
sh "cf add-network-policy ${iaBroker} --destination-app ${appName} --protocol tcp --port 8080"
} catch (Exception ex) {
echo "Could not establish network policies. The network policy tool should be run post-build to ensure functionality."
}
// Delete old Routes
for (Object legacyApp : legacyAppNames.trim().tokenize(',')) {
def legacyAppName = legacyApp.toString().trim()
if (legacyAppName != appName) {
sh "cf unmap-route ${legacyAppName} apps.internal --hostname ${appBaseName}-${env.PROMOTE_SPACE}"
sh "cf delete -f ${legacyAppName} -r"
}
}
}
}
}