pipeline { agent { label "swarm" } environment { CLUSTER_NAME='dev-iru-swarm.infoclinica.lan' DOCKER_REGISTRY='dev-registry.infoclinica.ru:5000' DOCKER_IMAGE='bind' SERVICE_NAME='bind' SWARM_GIT_URL='ssh://git@git.sdsys.ru:8022/iru/stack-deploy.git' SWARM_GIT_NAME='stack-deploy' OVPN_GIT_URL='ssh://git@git.sdsys.ru:8022/iru/openvpn.git' OVPN_GIT_NAME='openvpn' BIND_GIT_URL='ssh://git@git.sdsys.ru:8022/sdsys/bind.git' JENKINS_MAIL='jenkins.dev@sdsys.ru' SMTP_SERVER='mail.sdsys.ru' } stages { stage("PULL REPOs") { steps { ansiColor('xterm') { echo "Pull repo ${SWARM_GIT_NAME}" } withCredentials([sshUserPrivateKey(credentialsId: 'provision', keyFileVariable: 'GIT_SSH_KEY', passphraseVariable: '', usernameVariable: 'GIT_SSH_USERNAME')]) { sh '''GIT_SSH_COMMAND='ssh -i ${GIT_SSH_KEY} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \ git clone ${SWARM_GIT_URL}''' } echo "Pull repo ${OVPN_GIT_NAME}" withCredentials([sshUserPrivateKey(credentialsId: 'provision', keyFileVariable: 'GIT_SSH_KEY', passphraseVariable: '', usernameVariable: 'GIT_SSH_USERNAME')]) { sh '''GIT_SSH_COMMAND='ssh -i ${GIT_SSH_KEY} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \ git clone ${OVPN_GIT_URL}''' } } } stage("Generate zone-files") { steps { echo "Generate ptr-zones" sh '''serial=$(cat ${WORKSPACE}/${SWARM_GIT_NAME}/tags/bind.version) ${WORKSPACE}/generate_ptr.sh 201 ${serial} ${WORKSPACE}/generate_ptr.sh 204 ${serial} ${WORKSPACE}/generate_ptr.sh 205 ${serial} ''' echo "Generate infoclinica-zone" sh '''serial=$(cat ${WORKSPACE}/${SWARM_GIT_NAME}/tags/bind.version) ${WORKSPACE}/generate_zone.sh ${serial} ''' } } stage("Create BIND Docker Image") { steps { echo "Create image ${DOCKER_REGISTRY}/${DOCKER_IMAGE}:${BUILD_NUMBER}" sh '''docker build --no-cache -t ${DOCKER_REGISTRY}/${DOCKER_IMAGE}:${BUILD_NUMBER} . if [ $? != 0 ]; then exit 1; fi ''' } } stage("Staging") { steps { echo "Testing Bind" sh '''container_id_server=`docker run -d --rm ${DOCKER_REGISTRY}/${DOCKER_IMAGE}:${BUILD_NUMBER}` docker exec -t ${container_id_server} nslookup iru-swarm.infoclinica.lan if [ $? != 0 ]; then exit 1; else echo "DNS is working!!!"; fi docker stop ${container_id_server} ''' } } stage("Publishing") { steps { echo "Publishing ${DOCKER_REGISTRY}/${DOCKER_IMAGE}:${BUILD_NUMBER}." sh "docker push ${DOCKER_REGISTRY}/${DOCKER_IMAGE}:${BUILD_NUMBER}" } } stage("Prod-like") { steps { echo "Check Prod-like cluster status" sh '''ping -c 2 ${CLUSTER_NAME} if [ $? -eq 0 ]; then export DOCKER_CERT_PATH=/run/secrets/swarm export DOCKER_HOST=tcp://${CLUSTER_NAME}:2376 DOCKER_TLS_VERIFY=1 docker node ls --format "{{.Hostname}} {{.TLSStatus}}" | while read host status do if [ $status != Ready ]; then echo "Cluster ${CLUSTER_NAME} state is inconsistent"; exit 1 else echo "HOST: $host STATUS: $status" fi done else echo "Host not Found"; exit 1 fi ''' echo "Run containers in Prod-like" sh '''export DOCKER_CERT_PATH=/run/secrets/swarm export DOCKER_HOST=tcp://${CLUSTER_NAME}:2376 DOCKER_TLS_VERIFY=1 export DOCKER_HOST=tcp://$(docker info -f '{{.Name}}'):2376 DOCKER_TLS_VERIFY=1 if [ -z $(docker service ps -q ${DOCKER_IMAGE}) ];then docker service create --replicas 1 \ --name ${SERVICE_NAME} -p 53:53/tcp -p 53:53/udp \ ${DOCKER_REGISTRY}/${DOCKER_IMAGE}:${BUILD_NUMBER} else docker service update ${SERVICE_NAME} \ --image ${DOCKER_REGISTRY}/${DOCKER_IMAGE}:${BUILD_NUMBER} if [ $? != 0 ]; then docker service rollback ${SERVICE_NAME}; fi fi rm -rf ${WORKSPACE}/${SWARM_GIT_NAME} ''' } } stage("Tagging") { steps { echo "Tagging ${DOCKER_REGISTRY}/${DOCKER_IMAGE}:${BUILD_NUMBER} to ${DOCKER_REGISTRY}/iru/${DOCKER_IMAGE}:latest" sh '''docker tag ${DOCKER_REGISTRY}/${DOCKER_IMAGE}:${BUILD_NUMBER} \ ${DOCKER_REGISTRY}/iru/${DOCKER_IMAGE}:latest docker push ${DOCKER_REGISTRY}/iru/${DOCKER_IMAGE}:latest ''' echo "Updating tag info in ${SWARM_GIT_NAME} repository" withCredentials([sshUserPrivateKey(credentialsId: 'provision', keyFileVariable: 'GIT_SSH_KEY', passphraseVariable: '', usernameVariable: 'GIT_SSH_USERNAME')]) { sh '''GIT_SSH_COMMAND='ssh -i ${GIT_SSH_KEY} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \ git clone ${SWARM_GIT_URL} cd ${SWARM_GIT_NAME} echo -n ${BUILD_NUMBER} > tags/${DOCKER_IMAGE}.version git add -A git config --global user.email "${JENKINS_MAIL}" git config --global user.name "Jenkins" git commit -m 'Version update' 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!!!
Jenkins job failed.\n\n
Project Name:
${env.JOB_NAME}
\nBuild Number:
${env.BUILD_NUMBER}
\nURL Build:
${RUN_DISPLAY_URL}" } aborted { mail charset: 'UTF-8', subject: "Jenkins build ERROR", mimeType: 'text/html', to: "${client_mail}", body: "ATTENTION!!!
Jenkins job aborted.\n\n
The CNAME ${key_name} is already exists!\n\n
Project Name:
${env.JOB_NAME}
\nBuild Number:
${env.BUILD_NUMBER}
\nURL Build:
${RUN_DISPLAY_URL}" } } }