tft*_*ftd 5 jenkins jenkins-groovy jenkins-declarative-pipeline
我目前正在开发一个通用管道,该管道将通过共享库用于替换现有作业,以便从更集中的位置更轻松地管理所有作业。大多数现有的工作都有这三个阶段:
一些作业if/else在其阶段有一些基于参数或环境变量做事的 s,但总体而言,这些作业在其他方面非常相似。我想到的解决方案是使用闭包来允许在这些阶段执行额外的逻辑代码,但我很难弄清楚如何确保这一点,以便您可以执行的唯一可能的“步骤”是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)
}
}
}
}
}
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/bat将MVN_BUILD和MVN_DEPLOY闭包中特定步骤(即)的执行列入白名单?或者,是否有另一种甚至更好的方法来处理这种情况?
| 归档时间: |
|
| 查看次数: |
469 次 |
| 最近记录: |