jenkins - 组织 Jenkins 库

标签 jenkins jenkins-pipeline

我们正在使用 Jenkins Shared Libraries在我们的管道开发中。我们已经在其中编写了很多库,现在我们想更好地组织它。是否可以在 jenkins 共享库的 vars 文件夹中包含文件夹结构?

最佳答案

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文件夹下的class文件中。

p>

5) 一些提示:

  1. 将管道对象传递给 src 文件夹中的类

    relProcess = new AcidReleaseProcess(this, appName, compName, compVersion) //这是管道对象

  2. 将管道对象存储在类构造函数中 AcidReleaseProcess(脚本,appName,compName,compVersion){ this.script = script//这里的脚本是管道对象

  3. 所有全局名称都需要以管道对象为前缀:script

    sh -> script.sh 回声-> script.echo 与... -> 脚本.与... 字符串 -> script.string 等等……

关于jenkins - 组织 Jenkins 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55254908/

相关文章:

javascript - 类型错误 : modules[moduleId] is undefined

jenkins - 有没有办法检查作业的 jenkins 输出,如果字符串存在则使作业成功,否则失败?

jenkins - 中止 Jenkins 管道中的当前构建

java - 在 Allure [Java - Selenium] 中添加截图

java - 当我有一个使用 @RunWith 的测试套件时,如何获得更多日志记录反馈?

github - 如何让 Jenkins 通过 Composer 检查私有(private)供应商 repo

jenkins - 无法在管道阶段定义变量

docker - 如何使用 jenkins 管道步骤在 docker 镜像中安装 pip ?

jenkins - 如何跨阶段重用以前创建的工作区

groovy - jenkins 扩展参数插件 groovy 脚本