Организация библиотек Дженкинса - PullRequest
1 голос
/ 20 марта 2019

Мы используем Jenkins Shared Libraries в нашей разработке конвейера. Мы написали довольно много библиотек внутри него, и теперь мы хотим организовать это немного лучше. Возможно ли иметь структуру папок в папке vars общих библиотек jenkins?

Ответы [ 2 ]

3 голосов
/ 20 марта 2019

1) Структура папок проекта общей библиотеки:

enter image description here

Как показано на рисунке выше, вы можете организовать структуру папок в папке src, так же, как организовать пакет java.

Затем импортируйте их в папку vars, где мы объявляем глобальную переменную.

2) Содержимое vars/acidReleaseProcess.groovy:

#!groovy

import com.fmr.pipeline.AcidReleaseProcess

def relProcess

/**
 * Create a instance of class: AcidReleaseProcess
 * 
 * @param  appName uDeploy Application Name
 * @param  compName uDeploy Component Name
 * @param  compVersion component version to deploy
 * @return A self reference
 */
def call(appName, compName, compVersion) {
    relProcess = new AcidReleaseProcess(this, appName, compName, compVersion)   
    return this
}

/**
 * Execute Install, Go Live and Stop process on specify env
 * 
 * @param  envName name of environment to delpoy, exmaple: 'DIT', 'PAC', 'XQ1'
 */
def blueGreenDeploy(envName) {
    relProcess.deployToPassive(envName)
    relProcess.swapPassiveToActive(envName)
    relProcess.stopPassive(envName)
}

3) com.fmr.pipeline.AcidReleaseProcess.groovy

class AcidReleaseProcess implements Serializable {

    def script, appName, uDeployVers, passiveGroup = [:]

    AcidReleaseProcess(script, appName, compName, compVersion) {
        this.script = script 
        this.appName = appName
        this.uDeployVers = compName + ":" + compVersion
    }

    def deployToPassive(envName) {

        script.echo "Checking uDeploy environment ${envName} group state"

        script.sh 'docker pull ...'

        script.withCredentials([script.string(credentialsId: '<...>', variable: 'UDEPLOY_AUTH_TOKEN')]) {

            def group1_state = script.sh(
                        returnStdout: true, 
                        script: "docker run --rm -i ... \
                                    -a ${appName} \
                                    -e ${envName}-${group1} " + '-t ${UDEPLOY_AUTH_TOKEN}'
                    ).trim()

            def group2_state = script.sh(
                        returnStdout: true, 
                        script: "docker run --rm -i ...y \
                                    -a ${appName} \
                                    -e ${envName}-${group2} " + '-t ${UDEPLOY_AUTH_TOKEN}'
                    ).trim()

            script.echo "${envName}-${group1} is ${group1_state}, ${envName}-${group2} is ${group2_state}"

            if("${group1_state}" == "Live" && "${group2_state}" == "Live") {

                script.echo "Environment: ${envName}, ${group1} and ${group2} both are Live," +  
                     "only allow install on Non-Live environment"

                script.sh 'exit 1'
            } 

            def groupName = "${group1_state}" != "Live" ? group1 : group2

            passiveGroup[envName] = groupName
        }


        def uDeployEnv = envName + '-' + passiveGroup[envName]

        script.echo "Install on ${uDeployEnv}"

        script.step([
            $class  : 'UCDeployPublisher',
            siteName: 'pi_udeploy_srvpiudupload',
            deploy  : [
                    $class:             'com.urbancode.jenkins.plugins.ucdeploy.DeployHelper$DeployBlock',
                    deployApp:          appName,
                    deployEnv:          uDeployEnv,
                    deployProc:         UDEPLOY_INSTALL_PROC_NAME,
                    deployVersions:     uDeployVers,
                    deployOnlyChanged:  false
            ]
        ])
    }
}

4) мы должны сохранять содержимое файлов в папке vars как можно более простым и организовывать повторно используемый или сложный код в файл класса в папке src.

5) несколько советов:

  1. Передача объекта конвейера в класс в папке src

    relProcess = new AcidReleaseProcess(this, appName, compName, compVersion) // this is the pipeline object

  2. Сохранить объект конвейера в функции класса contructor. AcidReleaseProcess(script, appName, compName, compVersion) { this.script = script // script here is the pipeline object

  3. Все глобальные имена требуют префикса с объектом конвейера: script

    sh -> script.sh echo -> script.echo with... -> script.with... string -> script.string etc...

0 голосов
/ 20 марта 2019

Как указано @yong, вы можете настроить структуру пакета в папке src/. Основным недостатком, с моей точки зрения, является то, что здесь сложнее реализовать шаги, потому что вам нужно написать больше кода, чтобы получить тот же результат, что и с пользовательскими шагами в vars/. Как написано на сайте, его лучше всего использовать для вспомогательных функций. Что мы сделали: сгруппировали пользовательские шаги в vars/ в один файл-скрипт, как в этом примере, для всех действий по протоколированию:

vars / log.groovy (пример вы можете найти на сайте)

def info(message) { 
   echo "INFO: ${message}" 
} 

def warning(message) { 
   echo "WARNING: ${message}" 
}

Вы можете использовать env-переменные и шаги столько, сколько захотите. Чтобы использовать методы в вашем jenkinsfile, вы поместили их в шаги и блок скриптов и вызываете их с помощью filename.method.

Если каталоги под vars/ возможны, я не знаю. Вы пробовали это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...