From e47794871357bca3a02f6840bd1e3e2027313738 Mon Sep 17 00:00:00 2001 From: Bruck Wubete Date: Fri, 24 Aug 2018 14:54:32 -0400 Subject: [PATCH] Update Jenkins File with github webhooks and slack notifications (#251) * Update Jenkinsfile --- Jenkinsfile | 97 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 59 insertions(+), 38 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 06f10674..085d0866 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -2,13 +2,25 @@ def project = 'ci-cd-for-bn' def appName = 'greenlight' def greenlightVersion = 'v2' def label = "jenkins-execution-worker-${UUID.randomUUID().toString()}" +def releaseBuild = env.TAG_NAME && env.TAG_NAME.contains("release") -if (env.TAG_NAME && env.TAG_NAME.contains("release")) { +String convert(long millsToConvert){ + long seconds, minutes, hours; + seconds = millsToConvert / 1000; + minutes = seconds / 60; + seconds = seconds % 60; + hours = minutes / 60; + minutes = minutes % 60; + return String.format("%02d:%02d:%02d", hours, minutes, seconds); +} + + +if (releaseBuild) { kubeCloud = "production" - kubecSecretsId = 'gl-launcher-prod-secrets' + kubecSecretsId = 'greenlight-prod-secrets' } else { kubeCloud = "staging" - kubecSecretsId = 'gl-launcher-staging-secrets' + kubecSecretsId = 'greenlight-staging-secrets' } properties([ @@ -27,47 +39,56 @@ volumes: [ hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock') ]){ node(label) { - def myRepo = checkout scm - def gitCommit = myRepo.GIT_COMMIT - def gitBranch = myRepo.GIT_BRANCH - def gitTag = env.TAG_NAME - def shortGitCommit = "${gitCommit[0..10]}" - def previousGitCommit = sh(script: "git rev-parse ${gitCommit}~", returnStdout: true) - def imageTag = "gcr.io/${project}/${appName}:${gitBranch}.${env.BUILD_NUMBER}.${gitCommit}" - - stage('Test') { - container('ruby') { - sh "bundle install --without development production && bundle exec rubocop && bundle exec rspec" + try { + slackSend (color: '#FFFF00', message: "STARTED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})") + def myRepo = checkout scm + def gitCommit = myRepo.GIT_COMMIT + def gitBranch = myRepo.GIT_BRANCH + def gitTag = env.TAG_NAME + def shortGitCommit = "${gitCommit[0..10]}" + def previousGitCommit = myRepo.GIT_PREVIOUS_COMMIT + def imageTag = "gcr.io/${project}/${appName}:${gitBranch}.${env.BUILD_NUMBER}.${gitCommit}" + def stageBuild = (kubeCloud == "staging" && gitBranch == "master") + + stage('Test') { + container('ruby') { + sh "bundle install && bundle exec rubocop && bundle exec rspec " + } } - } - - stage('Build and Publish') { - container('gcloud') { - withCredentials([file(credentialsId: 'cloud-datastore-user-account-creds', variable: 'FILE')]) { - sh "gcloud auth activate-service-account --key-file=$FILE" - if (kubeCloud == "staging") { - sh "gcloud docker -- build -t ${imageTag} . && gcloud docker -- push ${imageTag}" - } else { - imageTag = "gcr.io/${project}/${appName}:${gitTag}" - withCredentials([string(credentialsId: 'DOCKER_USER', variable: 'DOCKER_USER'), string(credentialsId: 'DOCKER_PASSWORD', variable: 'DOCKER_PASSWORD')]) { - sh "gcloud docker -- build -t ${imageTag} -t '$DOCKER_USER/${appName}:${greenlightVersion}' -t '$DOCKER_USER/${appName}:${gitTag}' . && gcloud docker -- push ${imageTag}" - sh "docker login -u $DOCKER_USER -p $DOCKER_PASSWORD" - sh "docker push '$DOCKER_USER/${appName}:${greenlightVersion}' && docker push '$DOCKER_USER/${appName}:${gitTag}'" - } + + stage('Build and Publish') { + container('gcloud') { + withCredentials([file(credentialsId: 'cloud-datastore-user-account-creds', variable: 'FILE'), string(credentialsId: 'DOCKER_USER', variable: 'DOCKER_USER'), string(credentialsId: 'DOCKER_PASSWORD', variable: 'DOCKER_PASSWORD')]) { + sh "gcloud auth activate-service-account --key-file=$FILE" + if (stageBuild) { + sh "gcloud docker -- build -t ${imageTag} -t 'bigbluebutton/${appName}:master' . && gcloud docker -- push ${imageTag}" + sh "docker login -u $DOCKER_USER -p $DOCKER_PASSWORD" + sh "docker push 'bigbluebutton/${appName}:master'" + } else if (releaseBuild) { + imageTag = "gcr.io/${project}/${appName}:${gitTag}" + sh "gcloud docker -- build -t ${imageTag} -t 'bigbluebutton/${appName}:${greenlightVersion}' -t 'bigbluebutton/${appName}:${gitTag}' . && gcloud docker -- push ${imageTag}" + sh "docker login -u $DOCKER_USER -p $DOCKER_PASSWORD" + sh "docker push 'bigbluebutton/${appName}:${greenlightVersion}' && docker push 'bigbluebutton/${appName}:${gitTag}'" + } } } } - } - stage('Deploy') { - container('kubectl') { - withCredentials([file(credentialsId: kubecSecretsId, variable: 'FILE')]) { - sh ''' - kubectl apply -f $FILE - ''' - } - sh "kubectl set image deployments/gl-deployment gl=${imageTag}" + stage('Deploy') { + container('kubectl') { + if (stageBuild || releaseBuild) { + withCredentials([file(credentialsId: kubecSecretsId, variable: 'FILE')]) { + sh ''' + kubectl apply -f $FILE + ''' + } + } + sh "kubectl set image deployments/gl-deployment gl=${imageTag}" + } } + slackSend (color: '#00FF00', message: "SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' in ${convert(currentBuild.duration)} (${env.BUILD_URL})") + } catch(e) { + slackSend (color: '#FF0000', message: "FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' message: ${e} (${env.BUILD_URL})") } } }