// def ENAMES = [ 'prod', 'dev' ]
def ENAMES = [ 'prod' ]
def CLUSTERS = ['prod': 'iru-swarm.infoclinica.lan', 'dev': 'dev-iru-swarm.infoclinica.lan']
def REGISTRIES = ['prod': 'registry.infoclinica.ru:5000', 'dev': 'dev-registry.infoclinica.ru:5000']
def DHOST = ['prod': 'tcp://iru-swarm.infoclinica.lan:2376', 'dev': 'tcp://dev-iru-swarm.infoclinica.lan:2376']
def LIST_SERVICE = []
def TO_ROLLBACK = []
def ERROR_JOB
def VERSION_TO_UPDATE
pipeline {
agent {
label "swarm"
}
environment {
SWARM_GIT_URL='ssh://git@git.sdsys.ru:8022/labportal/stack-deploy.git'
SWARM_GIT_NAME='stack-deploy'
JENKINS_MAIL='jenkins.dev@sdsys.ru'
DOCKER_CERT_PATH='/run/secrets/swarm'
DOCKER_IMAGE='analis-wineservice'
SERVICE_LABEL='analis-std'
STACK_LABEL='analis-wineservice'
}
parameters {
string(
name: "mailto",
defaultValue: "admin@sdsys.ru",
description: "Email which has to be notified."
)
string(
name: "toVersion",
defaultValue: "",
description: "What version to update?"
)
}
stages {
stage("Git Pull. Define Version to Update") {
steps {
script {
withCredentials([sshUserPrivateKey(credentialsId: 'provision', keyFileVariable: 'GIT_SSH_KEY', passphraseVariable: '', usernameVariable: 'GIT_SSH_USERNAME')]) {
sh """set +x && GIT_SSH_COMMAND='ssh -i ${GIT_SSH_KEY} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
git clone ${SWARM_GIT_URL}
"""
sh "set +x && echo \"Update version of Apps to $toVersion\" > commit.txt"
}
}
}
}
stage("Get Names Of Running Services") {
steps {
script {
ENAMES.each { item ->
echo "Viewing: ${item} services, on ${CLUSTERS.get((item))}"
LIST_SERVICE = sh (script: "set +x && DOCKER_HOST=${DHOST.get((item))} DOCKER_TLS_VERIFY=1 docker service ls -f label=com.docker.stack.namespace=$STACK_LABEL -f label=ru.infoclinica.service=$SERVICE_LABEL --format '{{.Name}}'" , returnStdout: true).split('\n')
echo "These services will be updated $LIST_SERVICE to version $toVersion"
}
}
}
}
stage("Update Services") {
steps {
script {
ENAMES.each { item ->
try {
for (name in LIST_SERVICE) {
TO_ROLLBACK.add(name)
sh "set +x && DOCKER_HOST=${DHOST.get((item))} DOCKER_TLS_VERIFY=1 docker service update $name --image ${REGISTRIES.get((item))}/lab/$DOCKER_IMAGE:$toVersion"
}
}
catch (err) {
def STABLE_VERSION = sh (script: "set +x && cat $SWARM_GIT_NAME/tags/lab/analis-wineservice.stable-version" , returnStdout: true).trim()
for (names_falure in TO_ROLLBACK) {
echo "Recoverig $names_falure to $STABLE_VERSION"
sh "set +x && DOCKER_HOST=${DHOST.get((item))} DOCKER_TLS_VERIFY=1 docker service rollback $names_falure"
}
ERROR_JOB = TO_ROLLBACK.last()
currentBuild.result = 'FAILURE'
error ("Failure on update $ERROR_JOB. The service $TO_ROLLBACK was rollback!")
}
}
}
}
}
stage("Update Tags") {
steps {
script {
def STABLE_VERSION = sh (script: "set +x && cat $SWARM_GIT_NAME/tags/lab/analis-wineservice.stable-version" , returnStdout: true).trim()
def OLD_STABLE_VERSION = sh (script: "set +x && cat $SWARM_GIT_NAME/tags/lab/analis-wineservice.old-stable-version" , returnStdout: true).trim()
sh "set +x && echo $STABLE_VERSION > $SWARM_GIT_NAME/tags/lab/analis-wineservice.old-stable-version"
sh "set +x && echo $VERSION_TO_UPDATE > $SWARM_GIT_NAME/tags/lab/analis-wineservice.stable-version"
}
}
}
stage("Push New Versions To Git") {
steps {
script {
sh "cat commit.txt"
sh "cat $SWARM_GIT_NAME/tags/lab/analis-wineservice.stable-version"
sh "cat $SWARM_GIT_NAME/tags/lab/analis-wineservice.old-stable-version"
withCredentials([sshUserPrivateKey(credentialsId: 'provision', keyFileVariable: 'GIT_SSH_KEY', passphraseVariable: '', usernameVariable: 'GIT_SSH_USERNAME')]) {
sh """cd $SWARM_GIT_NAME
git add -A
git config --global user.email "${JENKINS_MAIL}"
git config --global user.name "Jenkins"
git commit -F ../commit.txt
GIT_SSH_COMMAND='ssh -i ${GIT_SSH_KEY} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
git push origin master
"""
}
}
}
}
}
post {
always {
echo "CleaningUp work directory"
deleteDir()
}
failure {
mail charset: 'UTF-8',
subject: "Jenkins build ERROR",
mimeType: 'text/html',
to: "${mailto}",
body: "ATTENTION!!!
Failure update: $ERROR_JOB
Was rollback: $TO_ROLLBACK
Project Name: ${env.JOB_NAME}
Build Number: ${env.BUILD_NUMBER}
URL Build: ${RUN_DISPLAY_URL}"
}
}
}