有没有办法确保詹金斯管道的封闭?

时间:2019-04-16 09:08:47

标签: jenkins jenkins-groovy jenkins-declarative-pipeline

我目前正在开发一个通用管道,该管道将通过共享库用于替换现有作业,以便更轻松地从更集中的位置管理所有作业。现有的大多数工作都有以下三个阶段:

  1. 分配节点
  2. 从git存储库中检出代码并进行构建
  3. 将代码部署到测试库

有些作业在其阶段中有几个if/else,它们根据参数或环境变量来执行操作,但是总体而言,这些作业非常相似。我想到的解决方案是使用Closures允许在这些阶段中执行其他逻辑代码,但是我很难弄清楚如何保护它,以便您可以执行的唯一可能的“步骤”是{{1 }}和sh

这里是一个过于简化的示例bat,用于说明我在说什么:

vars/genericPipeline.groovy

以后可以在作业中将其用作:

def call(body)
{
    def config = [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = config
    body()

    String AGENT_LABEL = config.getOrDefault('label', 'mvn3')

    Closure MVN_BUILD = config.getOrDefault('build', {
        sh "mvn clean install"
    })

    Closure MVN_DEPLOY = config.getOrDefault('deploy', { BRANCH_NAME, ARTIFACT_COORDINATES, SERVER_ID, REPO, TMP_REPO ->
        def SERVER_URL = REPO

        if (BRANCH_NAME != 'master')
        {
            SERVER_URL = TMP_REPO
        }

        sh label: "Deploying ${ARTIFACT_COORDINATES}",
           script: "mvn deploy" +
                   " -DskipTests" +
                   " -DaltDeploymentRepository=${SERVER_ID}::default::${SERVER_URL}"
    })

    pipeline {
        agent {
            node {
                label AGENT_LABEL
            }
        }
        environment {
            GROUP_ID = readMavenPom().getGroupId()
            ARTIFACT_ID = readMavenPom().getArtifactId()
            VERSION = readMavenPom().getVersion()
            ARTIFACT_COORDINATES = "${readMavenPom().getGroupId()}:${readMavenPom().getArtifactId()}:${readMavenPom().getVersion()}"
        }
        stages {
            stage('Building...') {
                steps {
                    MVN_BUILD()
                }
            }
            stage('Deploying...') {
                steps {
                    MVN_DEPLOY(BRANCH_NAME, env.ARTIFACT_COORDINATES, config.serverId, config.repo, config.tmpRepo)
                }
            }
        }
    }
}

如您所见,genericPipeline { build = { sh "mvn clean install" } // could be set for the "corner cases" or could skipped to use the // default deploy closure for all other cases. deploy = { sh "mvn deploy" } } 使用基于deploy名称的两个不同的存储库进行部署。我知道我可以简单地将逻辑放在branch中,但是问题是某些作业不是多分支的,并且它们没有此stage逻辑。但是,它们仍将具有相同的管道结构,而无需进行任何其他更改,对于在部署阶段可能发生的所有不同if/else情况,我宁愿维护一个管道而不是5个相对相似的管道。 :)

因此,这里的问题-是否可以只将if/elsesh/bat闭包中特定步骤(即MVN_BUILD)的执行列入白名单?或者,如果还有另一种甚至更好的方式来处理这种情况?

0 个答案:

没有答案