Как заставить Jenkins автоматически строить после опроса из bitbucket вместо того, чтобы вручную создавать задание с определенными параметрами - PullRequest
0 голосов
/ 12 декабря 2018

У меня работает Jenkinsfile, который я могу выполнить вручную с двумя параметрами, которые необходимо указать в зависимости от того, собираюсь ли я для dev, staging или prod.

Что бы я хотел сделать сейчасзаключается в том, что каждый раз, когда Дженкинс узнает, есть ли новый контент в репозитории bitbucket, он создает новое задание с определенными параметрами (сначала сборка dev с обновлением базы данных), а затем, если это удается, делает другую сборку с включенным параметром staging, а также спараметр построения базы данных.

Я бы хотел, чтобы процесс развертывания (или, скорее, создания нового задания) для производства был ручным заданием, пока я не проверю, все ли хорошо в стадии подготовки.

Как примечание, мой конвейер jenkins работает, как и ожидалось, и опрос работает также, как и ожидалось, мне просто нужно автоматизировать этот процесс.

ПРИМЕЧАНИЕ

Я не пользуюсь webhook от Bitbucket, даже пытался это сделать, потому что мой сервер jenkins работает на хосте, которому не разрешено иметь внешние подключения, и когда bitbucket отправляет сигнал на мой сервер jenkins, он простовремя вышло.

Спасибо за предложения заранее.

Мой Jenkinsfile выглядит следующим образом:

// Deployment template for CMS-based websites (Drupal or Wordpress)
// 
//
pipeline {
agent any

parameters {
    choice(choices: "Dev\nStaging\nProduction", description: "Choose which environment to push changes to.", name: "DEPLOY_TO")
    choice choices: "No\nYes", description: "Choose whether to deploy the database as well.", name: "DEPLOY_DB"
}

environment {
    SITEID = "ge"
    NOFLAGS = "0"
    DBNAME = "wpress_website"
    DBSERVER = "dbserver"
    DBUSER = "geWordpress"
    DBPASS = "akjh23kas"
    EXCLUDE = "comp_commentmeta,comp_comments"  // separate multiple tables with commas
    DEPLOY_TO = "${params.DEPLOY_TO}"
    DEPLOY_DB = "${params.DEPLOY_DB}"
}

stages {
    stage("deploy-db-dev") {
        when {
            allOf { 
                environment ignoreCase: true, name: "DEPLOY_TO", value: "dev"; 
                environment ignoreCase: true, name: "DEPLOY_DB", value: "yes"; 
            }
        }
        steps {
            // this stage only required until we make our dev the master DB
            // copy full dev database from appserv1
            // import latest database dump to dev server
            script {
                FILENM = sh(script: 'ls -t goewp-s-dump* | head -1', returnStdout: true)
            }
            //Fixing the problem with the collation existing in the sql dump file, refer to: https://stackoverflow.com/questions/42385099/1273-unknown-collation-utf8mb4-unicode-520-ci 
            //apparently, this is due to a version of mysql issue. Once the problem is fixed from the server side we can then remove the following lines. 

            sh "sed -i s/utf8mb4_unicode_520_ci/utf8mb4_unicode_ci/g ${FILENM}"
            //The following line was added because the site is pointing to a staging server which we don't have control over, again, once this is fixed we can delete the following line of code. 
            sh "sed -i s/edit.staging.websites.3pth.com/stage.goewpfoods.hcgweb.net/g ${FILENM}"

            sh "mysql -h appserver -u ${env.DBUSER} --password='${env.DBPASS}' ${env.DBNAME}_dev < ${WORKSPACE}/${FILENM}"
        }
    }
    stage("deploy-dev") {
        when {
            environment ignoreCase: true, name: "DEPLOY_TO", value: "dev"
        }
        steps {
            // copy files to appserv2
            // NOTE: if we move the repo to SVN, we should change httpdocs/ to ${env.SITEID}docs/
            sh "sudo chown jenkins:jenkins *"

            //Replace the wp-config.php file with our comp file with our information. 
            sh "/bin/cp httpdocs/wp-config-comp.php httpdocs/wp-config.php"

            // prepare the dev server to receive files by changing the owner
            sh "ssh webadmin@appserv2 \"sudo chown -R webadmin:webadmin /var/opt/httpd/${env.SITEID}docs/\""
            // copy files from control server to dev
            sh "rsync --exclude=Jenkinsfile -rav -e ssh --delete ${WORKSPACE}/httpdocs/ webadmin@appserv2:/var/opt/httpd/${env.SITEID}docs/"
            // fix the owner/permissions on the dev server
            sh "ssh webadmin@appserv2 \"sudo chown -R apache:${env.SITEID}-web /var/opt/httpd/${env.SITEID}docs/\""
            sh "ssh webadmin@appserv2 \"sudo chmod -R g+w /var/opt/httpd/${env.SITEID}docs/\""
            sh "ssh webadmin@appserv2 \"sudo find /var/opt/httpd/${env.SITEID}docs/ -type d -exec chmod g+s {} \\;\""
        }
    }
    stage("deploy-db-staging") {
        when {
            allOf { 
                environment ignoreCase: true, name: "DEPLOY_TO", value: "staging"; 
                environment ignoreCase: true, name: "DEPLOY_DB", value: "yes"; 
            }
        }
        steps {
            script {
                def myexcludes = env.EXCLUDE.split(',').toList()
                MYFLAGS = "-Q -K -c -e --default-character-set=utf8 "
                if (env.NOFLAGS == "0") {
                    myexcludes.each {
                        MYFLAGS = "${MYFLAGS} --ignore-table=${env.DBNAME}_dev.${it}"
                    }
                }
            }
            sh "cd ${WORKSPACE}"
            // pull a backup of the current dev database (may exclude some tables)
            sh "mysqldump -h appserv2 -u ${env.DBUSER} --password='${env.DBPASS}' ${env.DBNAME}_dev ${MYFLAGS} > ${env.DBNAME}_dev.sql"
            // create a backup copy of the current staging database (full backup)
            sh "mysqldump -h ${env.DBSERVER} -u ${env.DBUSER} --password='${env.DBPASS}' ${env.DBNAME}_stage > ${env.DBNAME}_stage_bak.sql"
            // upload the dev database dump to the staging database
            sh "mysql -h ${env.DBSERVER} -u ${env.DBUSER} --password='${env.DBPASS}' ${env.DBNAME}_stage < ${WORKSPACE}/${env.DBNAME}_dev.sql"
        }
    }
    stage("deploy-staging") {
        when {
            environment ignoreCase: true, name: "DEPLOY_TO", value: "staging"
        }
        steps {
            // copy files from dev to control server
            sh "rsync --exclude=.svn --exclude=.git -rav -e ssh webadmin@appserv2:/var/opt/httpd/${env.SITEID}docs/ /tmp/${env.SITEID}docs/"

            //Replace the wp-config.php file with our comp file with our information. 
            sh "/bin/cp httpdocs/wp-config-comp.php httpdocs/wp-config.php"

            // prepare the staging server to receive files by changing the owner
            sh "ssh webadmin@stageserv \"sudo chown -R webadmin:webadmin /var/opt/httpd/${env.SITEID}docs/\""
            // copy files from control server to staging
            sh "rsync --exclude=.svn --exclude=.git -rav -e ssh --delete /tmp/${env.SITEID}docs/ webadmin@stageserv:/var/opt/httpd/${env.SITEID}docs/"
            // fix the owner/permissions on the staging server
            sh "ssh webadmin@stageserv \"sudo chown -R apache:${env.SITEID}-web /var/opt/httpd/${env.SITEID}docs/\""
            sh "ssh webadmin@stageserv \"sudo chmod -R g+w /var/opt/httpd/${env.SITEID}docs/\""
            sh "ssh webadmin@stageserv \"sudo find /var/opt/httpd/${env.SITEID}docs/ -type d -exec chmod g+s {} \\;\""

            // delete the temporary files on the control server
            sh "rm -Rf /tmp/${env.SITEID}docs/"
            // clear the caches
            sh "wget -O - \"http://www.web.net/incacache.php?api_key=yoiVbjgtL&site_id=088\""
        }
    }
    stage("deploy-db-production") {
        when {
            allOf { 
                environment ignoreCase: true, name: "DEPLOY_TO", value: "production"; 
                environment ignoreCase: true, name: "DEPLOY_DB", value: "yes"; 
            }
        }
        steps {
            script {
                def myexcludes = env.EXCLUDE.split(',').toList()
                MYFLAGS = "-Q -K -c -e --default-character-set=utf8 "
                if (env.NOFLAGS == "0") {
                    myexcludes.each {
                        MYFLAGS = "${MYFLAGS} --ignore-table=${env.DBNAME}_stage.${it}"
                    }
                }
            }
            sh "cd ${WORKSPACE}"
            // pull a backup of the current staging database (may exclude some tables)
            sh "mysqldump -h ${env.DBSERVER} -u ${env.DBUSER} --password='${env.DBPASS}' ${env.DBNAME}_stage ${MYFLAGS} > ${env.DBNAME}_stage.sql"
            // create a backup copy of the current production database (full backup)
            sh "mysqldump -h ${env.DBSERVER} -u ${env.DBUSER} --password='${env.DBPASS}' ${env.DBNAME}_prod > ${env.DBNAME}_prod_bak.sql"
            // upload the staging database dump to the production database
            sh "mysql -h ${env.DBSERVER} -u ${env.DBUSER} --password='${env.DBPASS}' ${env.DBNAME}_prod < ${WORKSPACE}/${env.DBNAME}_stage.sql"
        }
    }
    stage("deploy-production") {
        when {
            environment ignoreCase: true, name: "DEPLOY_TO", value: "production"
        }
        steps {
            // copy files from staging to control server
            sh "rsync --exclude=.svn --exclude=.git -rav -e ssh webadmin@stageserv:/var/opt/httpd/${env.SITEID}docs/ /tmp/${env.SITEID}docs/"

            // prepare the production server to receive files by changing the owner
            sh "ssh webadmin@appserv3 \"sudo chown -R webadmin:webadmin /var/opt/httpd/${env.SITEID}docs/\""
            sh "ssh webadmin@appserv4 \"sudo chown -R webadmin:webadmin /var/opt/httpd/${env.SITEID}docs/\""
            // copy files from control server to production
            sh "rsync --exclude=.svn --exclude=.git -rav -e ssh --delete /tmp/${env.SITEID}docs/ webadmin@appserv3:/var/opt/httpd/${env.SITEID}docs/"
            sh "rsync --exclude=.svn --exclude=.git -rav -e ssh --delete /tmp/${env.SITEID}docs/ webadmin@appserv4:/var/opt/httpd/${env.SITEID}docs/"
            // fix the owner/permissions on the production server
            sh "ssh webadmin@appserv3 \"sudo chown -R apache:${env.SITEID}-web /var/opt/httpd/${env.SITEID}docs/\""
            sh "ssh webadmin@appserv4 \"sudo chown -R apache:${env.SITEID}-web /var/opt/httpd/${env.SITEID}docs/\""
            sh "ssh webadmin@appserv3 \"sudo chmod -R g+w /var/opt/httpd/${env.SITEID}docs/\""
            sh "ssh webadmin@appserv4 \"sudo chmod -R g+w /var/opt/httpd/${env.SITEID}docs/\""
            sh "ssh webadmin@appserv3 \"sudo find /var/opt/httpd/${env.SITEID}docs/ -type d -exec chmod g+s {} \\;\""
            sh "ssh webadmin@appserv4 \"sudo find /var/opt/httpd/${env.SITEID}docs/ -type d -exec chmod g+s {} \\;\""

            // delete the temporary files on the control server
            sh "rm -Rf /tmp/${env.SITEID}docs/"
             // clear the caches
            sh "wget -O - \"http://www.web.net/incacache.php?api_key=yoiVbjgtL&site_id=088\""
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Вы можете создать функцию, которая может рассматриваться как этапы, а затем вызывать те из них, которые вам нужны, с определенными параметрами.

Например:

def deployDBDev(param1, param2){
  //some steps
}

def deployDev(diffParam1, diffParam2){
  //some steps
}

//then call it in the sequence you want

deployDBDev(param1, param2)
deployDev(diffParam1, diffParam2)
0 голосов
/ 12 декабря 2018

Предлагаю создать 3 ветки в bitbucket

  1. dev
  2. Этап и
  3. производство (или мастер).

На стороне Дженкинса вы можете создать 3 задания для каждой среды и добавить опрос для конкретной ветви для автоматического запуска.

Ваши разработчики выполнят коммит в dev, который запустит сборку для dev, как только вы обнаружите, что все хорошо.может объединить код в ветви этапа, который запустит этап этапа.

И, наконец, когда вы подтвердите все хорошее при подготовке, просто объедините этап в производственную ветвь, что снова запустит производственное задание.

0 голосов
/ 12 декабря 2018

для запуска сборки, когда либо нажимается код, либо создается запрос извлечения, вы можете следовать статье ниже.

https://support.cloudbees.com/hc/en-us/articles/115000051132-How-to-Trigger-Multibranch-Jobs-from-BitBucket-Cloud-

...