|
@@ -1,171 +0,0 @@
|
|
|
-def ENAMES = [ 'prod-open', 'prod' ]
|
|
|
-//def def ENAMES = [ 'dev-open', 'dev' ]
|
|
|
-def REPOS = ['prod': 'ssh://git@git.sdsys.ru:8022/labportal/stack-deploy.git',
|
|
|
- 'prod-open': 'ssh://git@git.sdsys.ru:8022/labportal/stack-deploy-open.git']
|
|
|
-def GIT_DIR = ['prod': 'stack-deploy', 'prod-open': 'stack-deploy-open']
|
|
|
-def CLUSTERS = ['prod': 'iru-swarm.infoclinica.lan',
|
|
|
- 'prod-open': 'iru-swarm1-open.infoclinica.ru',
|
|
|
- 'dev': 'dev-iru-swarm.infoclinica.lan',
|
|
|
- 'dev-open': 'dev-iru-swarm1-open.infoclinica.lan']
|
|
|
-def REGISTRIES = ['prod': 'registry.infoclinica.ru:5000',
|
|
|
- 'prod-open': 'registry.infoclinica.ru:5000',
|
|
|
- 'dev': 'dev-registry.infoclinica.ru:5000',
|
|
|
- 'dev-open': 'dev-registry.infoclinica.ru:5000']
|
|
|
-def DHOST = ['prod': 'tcp://iru-swarm.infoclinica.lan:2376',
|
|
|
- 'prod-open': 'tcp://iru-swarm1-open.infoclinica.ru:2376',
|
|
|
- 'dev': 'tcp://dev-iru-swarm.infoclinica.lan:2376',
|
|
|
- 'dev-open': 'tcp://dev-iru-swarm1-open.infoclinica.lan:2376']
|
|
|
-
|
|
|
-def LIST_SERVICE = [:]
|
|
|
-def TO_ROLLBACK = [:]
|
|
|
-def ERROR_JOB
|
|
|
-def VERSION_TO_UPDATE
|
|
|
-
|
|
|
-pipeline {
|
|
|
- agent {
|
|
|
- label "swarm"
|
|
|
- }
|
|
|
- environment {
|
|
|
- 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."
|
|
|
- )
|
|
|
- choice (
|
|
|
- choices: 'up\ndown',
|
|
|
- description: 'What you want? Up version or down?',
|
|
|
- name: 'TASK_ACTION'
|
|
|
- )
|
|
|
- }
|
|
|
- stages {
|
|
|
- stage("Git Pull. Define Version to Update") {
|
|
|
- steps {
|
|
|
- script {
|
|
|
- ENAMES.each { item ->
|
|
|
- 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 ${REPOS.get((item))}
|
|
|
- """
|
|
|
- }
|
|
|
- }
|
|
|
- switch (TASK_ACTION) {
|
|
|
- case 'up':
|
|
|
- ENAMES.each { item ->
|
|
|
- VERSION_TO_UPDATE = sh (script: "set +x && cat ${GIT_DIR.get((item))}/tags/lab/analis-wineservice.build-version" , returnStdout: true).trim()
|
|
|
- }
|
|
|
- sh "set +x && echo \"Update version of Apps to $VERSION_TO_UPDATE\" > commit.txt"
|
|
|
- break
|
|
|
- case 'down':
|
|
|
- ENAMES.each { item ->
|
|
|
- VERSION_TO_UPDATE = sh (script: "set +x && cat ${GIT_DIR.get((item))}/tags/lab/analis-wineservice.old-stable-version" , returnStdout: true).trim()
|
|
|
- }
|
|
|
- sh "set +x && echo \"Downgrade version of Apps to $VERSION_TO_UPDATE\" > commit.txt"
|
|
|
- break
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- stage("Get Names Of Running Services") {
|
|
|
- steps {
|
|
|
- script {
|
|
|
- ENAMES.each { item ->
|
|
|
- echo "Viewing: ${item} services, on ${CLUSTERS.get((item))}"
|
|
|
- LIST_SERVICE[item] = 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')
|
|
|
- switch (TASK_ACTION) {
|
|
|
- case 'up':
|
|
|
- echo "These services will be updated to version $VERSION_TO_UPDATE: ${LIST_SERVICE.get(item)}"
|
|
|
- break
|
|
|
- case 'down':
|
|
|
- echo "These services will be downgraded to version $VERSION_TO_UPDATE ${LIST_SERVICE.get(item)}"
|
|
|
- break
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- stage("Update Services") {
|
|
|
- steps {
|
|
|
- script {
|
|
|
- ENAMES.each { item ->
|
|
|
- TO_ROLLBACK[item] = []
|
|
|
- try {
|
|
|
- for (name in LIST_SERVICE.get(item)) {
|
|
|
- TO_ROLLBACK[item].add(name)
|
|
|
- echo "Update service $name"
|
|
|
- sh "set +x && DOCKER_HOST=${DHOST.get((item))} DOCKER_TLS_VERIFY=1 docker service update \
|
|
|
- $name --image ${REGISTRIES.get((item))}/lab/$DOCKER_IMAGE:$VERSION_TO_UPDATE"
|
|
|
- }
|
|
|
- }
|
|
|
- catch (err) {
|
|
|
- def STABLE_VERSION = sh (script: "set +x && cat ${GIT_DIR.get((item))}/tags/lab/analis-wineservice.stable-version" , returnStdout: true).trim()
|
|
|
- TO_ROLLBACK.each { target, value ->
|
|
|
- for (service_name in value) {
|
|
|
- echo "Recoverig $service_name running in $target to $STABLE_VERSION"
|
|
|
- sh "set +x && DOCKER_HOST=${DHOST.get((item))} DOCKER_TLS_VERIFY=1 docker service rollback $service_name"
|
|
|
- }
|
|
|
- }
|
|
|
- ERROR_JOB = TO_ROLLBACK[item][-1]
|
|
|
- currentBuild.result = 'FAILURE'
|
|
|
- error ("Failure on update $ERROR_JOB. The service(s) $ERROR_JOB was rollback!")
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- stage("Update Tags") {
|
|
|
- steps {
|
|
|
- script {
|
|
|
- ENAMES.each { item ->
|
|
|
- def STABLE_VERSION = sh (script: "set +x && cat ${GIT_DIR.get((item))}/tags/lab/analis-wineservice.stable-version" , returnStdout: true).trim()
|
|
|
- def OLD_STABLE_VERSION = sh (script: "set +x && cat ${GIT_DIR.get((item))}/tags/lab/analis-wineservice.old-stable-version" , returnStdout: true).trim()
|
|
|
- sh "set +x && echo $STABLE_VERSION > ${GIT_DIR.get((item))}/tags/lab/analis-wineservice.old-stable-version"
|
|
|
- sh "set +x && echo $VERSION_TO_UPDATE > ${GIT_DIR.get((item))}/tags/lab/analis-wineservice.stable-version"
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- stage("Push New Versions To Git") {
|
|
|
- steps {
|
|
|
- script {
|
|
|
- sh "cat commit.txt"
|
|
|
- ENAMES.each { item ->
|
|
|
- sh "cat ${GIT_DIR.get((item))}/tags/lab/analis-wineservice.stable-version"
|
|
|
- sh "cat ${GIT_DIR.get((item))}/tags/lab/analis-wineservice.old-stable-version"
|
|
|
- withCredentials([sshUserPrivateKey(credentialsId: 'provision', keyFileVariable: 'GIT_SSH_KEY', passphraseVariable: '', usernameVariable: 'GIT_SSH_USERNAME')]) {
|
|
|
- sh """cd ${GIT_DIR.get((item))}
|
|
|
- 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: "<b>ATTENTION!!!</b> <br> <b>Failure update:</b> $ERROR_JOB <br><b>Was rollback:</b> $TO_ROLLBACK <b><br>Project Name:</b> ${env.JOB_NAME} <b><br>Build Number:</b> ${env.BUILD_NUMBER} <b><br>URL Build:</b> ${RUN_DISPLAY_URL}"
|
|
|
- }
|
|
|
- }
|
|
|
-}
|