有没有办法在 Jenkins 管道中确保关闭?

tft*_*ftd 5 jenkins jenkins-groovy jenkins-declarative-pipeline

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

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

一些作业if/else在其阶段有一些基于参数或环境变量做事的 s,但总体而言,这些作业在其他方面非常相似。我想到的解决方案是使用闭包来允许在这些阶段执行额外的逻辑代码,但我很难弄清楚如何确保这一点,以便您可以执行的唯一可能的“步骤”是shbat

这是一个过于简化的例子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)
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以稍后在作业中用作:

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"
   }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,根据名称deploy使用两个不同的存储库进行部署branch。我知道我可以简单地只是把逻辑的stage,但问题是,有些作业是不是多分支,他们不会有这种if/else逻辑。然而,它们仍然具有相同的管道结构而没有任何其他更改,我更愿意为if/else部署阶段可能发生的所有不同情况维护一个管道而不是 5 个相对相似的管道。:)

那么,这里的问题 - 是否可以只sh/batMVN_BUILDMVN_DEPLOY闭包中特定步骤(即)的执行列入白名单?或者,是否有另一种甚至更好的方法来处理这种情况?