// -------------- Configuration -------------- // CloudForms def opentlc_creds = 'b93d2da4-c2b7-45b5-bf3b-ee2c08c6368e' def opentlc_admin_creds = '73b84287-8feb-478a-b1f2-345fd0a1af47' def cf_uri = 'https://labs.opentlc.com' def cf_group = 'opentlc-access-cicd' // IMAP def imap_creds = 'd8762f05-ca66-4364-adf2-bc3ce1dca16c' def imap_server = 'imap.gmail.com' // Notifications def notification_email = 'gpteinfrasev3@redhat.com' def rocketchat_hook = '5d28935e-f7ca-4b11-8b8e-d7a7161a013a' // SSH key def ssh_creds = '15e1788b-ed3c-4b18-8115-574045f32ce4' // Admin host ssh location is in a credential too def ssh_admin_host = 'admin-host-na' // state variables def guid='' def openshift_location = '' // Catalog items def choices = [ 'OPENTLC OpenShift 4 Labs / OPENTLC OpenShift 4 Shared Access', ].join("\n") //def ocprelease_choice = [ // '3.11.59', //].join("\n") def region_choice = [ 'global_gpte', ].join("\n") def nodes_choice = [ '3', '1', '2', '4', '5', '6', '7', '8', ].join("\n") def environment_choice = [ 'PROD', 'TEST', 'DEV', ].join("\n") pipeline { agent any options { buildDiscarder(logRotator(daysToKeepStr: '30')) } parameters { booleanParam( defaultValue: false, description: 'wait for user input before deleting the environment', name: 'confirm_before_delete' ) choice( choices: choices, description: 'Catalog item', name: 'catalog_item', ) // choice( // choices: ocprelease_choice, // description: 'Catalog item', // name: 'ocprelease', // ) choice( choices: nodes_choice, description: 'Number of Nodes', name: 'nodes', ) choice( choices: region_choice, description: 'Region', name: 'region', ) choice( choices: environment_choice, description: 'Environment', name: 'environment', ) } stages { stage('order from CF') { environment { uri = "${cf_uri}" credentials = credentials("${opentlc_creds}") DEBUG = 'true' } /* This step use the order_svc_guid.sh script to order a service from CloudForms */ steps { git url: 'https://github.com/redhat-gpte-devopsautomation/cloudforms-oob' script { def catalog = params.catalog_item.split(' / ')[0].trim() def item = params.catalog_item.split(' / ')[1].trim() // def ocprelease = params.ocprelease.trim() def nodes = params.nodes.trim() def region = params.region.trim() def environment = params.environment.trim() echo "'${catalog}' '${item}'" guid = sh( returnStdout: true, script: """ ./opentlc/order_svc_guid.sh \ -c '${catalog}' \ -i '${item}' \ -G '${cf_group}' \ -d 'check=t,expiration=7,runtime=8,quotacheck=t,region=${region},nodes=${nodes},environment=${environment}' """ ).trim() echo "GUID is '${guid}'" } } } /* Skip this step because sometimes the completed email arrives before the 'has started' email stage('Wait for first email') { environment { credentials=credentials("${imap_creds}") } steps { sh """./tests/jenkins/downstream/poll_email.py \ --server '${imap_server}' \ --guid ${guid} \ --timeout 20 \ --filter 'has started'""" } } */ stage('Wait for last email and parse SSH location') { environment { credentials=credentials("${imap_creds}") } steps { git url: 'https://github.com/redhat-cop/agnosticd', branch: 'development' script { email = sh( returnStdout: true, script: """ ./tests/jenkins/downstream/poll_email.py \ --server '${imap_server}' \ --guid ${guid} \ --timeout 40 \ --filter 'has completed' """ ).trim() try { def m = email =~ /Openshift Master Console: (http:\/\/[^ \n]+)/ openshift_location = m[0][1] echo "openshift_location = '${openshift_location}'" } catch(Exception ex) { echo "Could not parse email:" echo email echo ex.toString() throw ex } } } } stage('Confirm before retiring') { when { expression { return params.confirm_before_delete } } steps { input "Continue ?" } } stage('Retire service from CF') { environment { uri = "${cf_uri}" credentials = credentials("${opentlc_creds}") admin_credentials = credentials("${opentlc_admin_creds}") DEBUG = 'true' } /* This step uses the delete_svc_guid.sh script to retire the service from CloudForms */ steps { git 'https://github.com/redhat-gpte-devopsautomation/cloudforms-oob' sh "./opentlc/delete_svc_guid.sh '${guid}'" } post { failure { withCredentials([usernameColonPassword(credentialsId: imap_creds, variable: 'credentials')]) { mail( subject: "${env.JOB_NAME} (${env.BUILD_NUMBER}) failed retiring for GUID=${guid}", body: "It appears that ${env.BUILD_URL} is failing, somebody should do something about that.\nMake sure GUID ${guid} is destroyed.", to: "${notification_email}", replyTo: "${notification_email}", from: credentials.split(':')[0] ) } withCredentials([string(credentialsId: rocketchat_hook, variable: 'HOOK_URL')]) { sh( """ curl -H 'Content-Type: application/json' \ -X POST '${HOOK_URL}' \ -d '{\"username\": \"jenkins\", \"icon_url\": \"https://dev-sfo01.opentlc.com/static/81c91982/images/headshot.png\", \"text\": \"@here :rage: ${env.JOB_NAME} (${env.BUILD_NUMBER}) failed retiring ${guid}.\"}'\ """.trim() ) } } } } stage('Wait for deletion email') { steps { git url: 'https://github.com/redhat-cop/agnosticd', branch: 'development' withCredentials([usernameColonPassword(credentialsId: imap_creds, variable: 'credentials')]) { sh """./tests/jenkins/downstream/poll_email.py \ --guid ${guid} \ --timeout 20 \ --server '${imap_server}' \ --filter 'has been deleted'""" } } } } post { failure { git 'https://github.com/redhat-gpte-devopsautomation/cloudforms-oob' /* retire in case of failure */ withCredentials( [ usernameColonPassword(credentialsId: opentlc_creds, variable: 'credentials'), usernameColonPassword(credentialsId: opentlc_admin_creds, variable: 'admin_credentials') ] ) { sh """ export uri="${cf_uri}" export DEBUG=true ./opentlc/delete_svc_guid.sh '${guid}' """ } /* Print ansible logs */ withCredentials([ string(credentialsId: ssh_admin_host, variable: 'ssh_admin'), sshUserPrivateKey( credentialsId: ssh_creds, keyFileVariable: 'ssh_key', usernameVariable: 'ssh_username') ]) { sh(""" ssh -o StrictHostKeyChecking=no -i ${ssh_key} ${ssh_admin} \ "find deployer_logs -name '*${guid}*log' | xargs cat" """.trim() ) } withCredentials([usernameColonPassword(credentialsId: imap_creds, variable: 'credentials')]) { mail( subject: "${env.JOB_NAME} (${env.BUILD_NUMBER}) failed GUID=${guid}", body: "It appears that ${env.BUILD_URL} is failing, somebody should do something about that.", to: "${notification_email}", replyTo: "${notification_email}", from: credentials.split(':')[0] ) } withCredentials([string(credentialsId: rocketchat_hook, variable: 'HOOK_URL')]) { sh( """ curl -H 'Content-Type: application/json' \ -X POST '${HOOK_URL}' \ -d '{\"username\": \"jenkins\", \"icon_url\": \"https://dev-sfo01.opentlc.com/static/81c91982/images/headshot.png\", \"text\": \"@here :rage: ${env.JOB_NAME} (${env.BUILD_NUMBER}) failed GUID=${guid}. It appears that ${env.BUILD_URL}/console is failing, somebody should do something about that.\"}'\ """.trim() ) } } fixed { withCredentials([string(credentialsId: rocketchat_hook, variable: 'HOOK_URL')]) { sh( """ curl -H 'Content-Type: application/json' \ -X POST '${HOOK_URL}' \ -d '{\"username\": \"jenkins\", \"icon_url\": \"https://dev-sfo01.opentlc.com/static/81c91982/images/headshot.png\", \"text\": \"@here :smile: ${env.JOB_NAME} is now FIXED, see ${env.BUILD_URL}/console\"}'\ """.trim() ) } } } }