我目前正在开发一个通用管道,该管道将通过共享库用于替换现有作业,以便更轻松地从更集中的位置管理所有作业。现有的大多数工作都有以下三个阶段:
有些作业在其阶段中有几个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/else
和sh/bat
闭包中特定步骤(即MVN_BUILD
)的执行列入白名单?或者,如果还有另一种甚至更好的方式来处理这种情况?