Continuous Deploy Release Pipeline
Updates build reference(s) in the hamlet CMDB and initiates a deployment.
Triggers
This pipeline is intended to be called by the 'Build' pipeline for Continuous Deployment into the first environment.
If deployment across Segments is required, an additional parameter could be created in the 'Build' pipeline to supply the Segment value alongside the other parameters.
Parameters
The 'Build' job supplies the required parameters for this pipeline.
Stages
Setup
Loads environment variables from the hamlet properties file.
Update Build Refs
Stores the hash value of the "Git Commit" in the current Environment/Segment/DeploymentUnit's build.json
within the hamlet CMDB.
Deploy
Creates and deploys all application-level component templates from the list of Deployment Units supplied by the 'Build' pipeline. Tags the CMDB repository with the deployment reference and commits the generated application templates back to the CMDB.
Post Job
After running, this pipeline will notify a defined slack channel of either success or failure.
Scripts
This example uses groovy scripts from the jenkins-shared-library.
Example
#!groovy
pipeline {
agent {
label '<hamlet label>'
}
options {
timestamps ()
buildDiscarder(
logRotator(
daysToKeepStr: '14'
)
)
durabilityHint('PERFORMANCE_OPTIMIZED')
parallelsAlwaysFailFast()
skipDefaultCheckout()
}
parameters {
string(
name: 'DEPLOYMENT_UNITS',
defaultValue: '',
description: 'The git commit to use for the deployment update'
)
string(
name: 'GIT_COMMIT',
defaultValue: '',
description: 'The git commit to use for the deployment update'
)
string(
name: 'IMAGE_FORMATS',
defaultValue: '',
description: 'The image format of the deployment units'
)
booleanParam(
name: 'TREAT_RUN_ID_DIFFERENCES_AS_SIGNIFICANT',
defaultValue: false
)
}
environment {
properties_file = '.hamlet/product/<PRODUCT PROPERTIES FILE LOCATION>'
slack_channel = '#<slack channel>'
PRODUCT_INFRASTRUCTURE_REFERENCE = 'master'
PRODUCT_CONFIG_REFERENCE = 'master'
MODE = 'update'
ENVIRONMENT = '<ENVIRONMENT>'
SEGMENT = '<SEGMENT>'
AUTODEPLOY = 'true'
}
stages {
stage('Setup Context') {
steps {
// Product Setup
dir('.hamlet/product') {
checkout scm
}
// Load in Properties files
script {
def productProperties = readProperties interpolate: true, file: "${env.properties_file}";
productProperties.each{ k, v -> env["${k}"] ="${v}" }
}
script {
currentBuild.description = "DeploymentUnits: ${params.DEPLOYMENT_UNITS} - CodeCommit: ${params.GIT_COMMIT}"
}
sh '''#!/bin/bash
${AUTOMATION_BASE_DIR}/setContext.sh
'''
script {
def contextProperties = readProperties interpolate: true, file: "${WORKSPACE}/context.properties";
contextProperties.each{ k, v -> env["${k}"] ="${v}" }
}
sh '''#!/bin/bash
${AUTOMATION_DIR}/constructTree.sh
'''
script {
def contextProperties = readProperties interpolate: true, file: "${WORKSPACE}/context.properties";
contextProperties.each{ k, v -> env["${k}"] ="${v}" }
}
}
}
stage('Update Build Refs') {
when{
allOf {
not {
equals expected: '', actual: "${params.DEPLOYMENT_UNITS}"
}
not {
equals expected: '', actual: "${params.GIT_COMMIT}"
}
not {
equals expected: '', actual: "${params.IMAGE_FORMATS}"
}
}
}
environment {
GIT_COMMIT = "${params.GIT_COMMIT}"
}
steps {
sh '''#!/bin/bash
${AUTOMATION_DIR}/validateUpdateBuildReferencesParameters.sh
'''
script {
def contextProperties = readProperties interpolate: true, file: "${WORKSPACE}/context.properties";
contextProperties.each{ k, v -> env["${k}"] ="${v}" }
}
sh '''#!/bin/bash
${AUTOMATION_DIR}/confirmBuilds.sh
'''
script {
def contextProperties = readProperties interpolate: true, file: "${WORKSPACE}/context.properties";
contextProperties.each{ k, v -> env["${k}"] ="${v}" }
}
sh '''#!/bin/bash
${AUTOMATION_DIR}/updateBuildReferences.sh
'''
}
}
stage('Deploy') {
when {
not {
equals expected: '', actual: "${params.DEPLOYMENT_UNITS}"
}
}
steps {
sh '''#!/bin/bash
${AUTOMATION_DIR}/deploySetup.sh
'''
script {
def contextProperties = readProperties interpolate: true, file: "${WORKSPACE}/context.properties";
contextProperties.each{ k, v -> env["${k}"] ="${v}" }
}
sh '''#!/bin/bash
${AUTOMATION_DIR}/deploy.sh
'''
}
post {
success {
slackSend (
message: "Deploy Completed - ${BUILD_DISPLAY_NAME} (<${BUILD_URL}|Open>)\n Environment: ${env.ENVIRONMENT} - Segment: ${env.SEGMENT} \n DeploymentUnits: ${params.DEPLOYMENT_UNITS} - Commit: ${params.GIT_COMMIT}",
channel: "${env["slack_channel"]}",
color: "#50C878"
)
}
failure {
slackSend (
message: "Deploy Failed - ${BUILD_DISPLAY_NAME} (<${BUILD_URL}|Open>)\n Environment: ${env.ENVIRONMENT} - Segment: ${env.SEGMENT} \n DeploymentUnits: ${params.DEPLOYMENT_UNITS} - Commit: ${params.GIT_COMMIT}",
channel: "${env["slack_channel"]}",
color: "#D20F2A"
)
}
}
}
}
}